Skip to content

Commit

Permalink
highlight: fix remaininig highlighting of vanishing words
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Nov 26, 2020
1 parent f0df481 commit 1066653
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 50 deletions.
9 changes: 6 additions & 3 deletions lib/core-syntax.sh
Expand Up @@ -4700,10 +4700,13 @@ function ble/syntax/parse {
#%end

# 解析予定範囲の更新
# @var i1 解析範囲開始
# @var i2 解析必要範囲終端 (此処以降で文脈が一致した時に解析終了)
# @var j2 シフト前の解析終端
local i1 i2 j2
ble/syntax/parse/determine-parse-range

ble/syntax/vanishing-word/register _ble_syntax_tree 0 "$i1" "$j2" 0 "$i1"
ble/syntax/vanishing-word/register _ble_syntax_tree 0 "$i1" "$j2" 0 "$i2"

ble/syntax/parse/shift

Expand Down Expand Up @@ -6679,7 +6682,7 @@ function ble/highlight/layer:syntax/word/.apply-attribute {
wbeg<wend)) || return 1

if [[ $wattr =~ ^[0-9]+$ ]]; then
ble/highlight/layer:syntax/fill _ble_highlight_layer_syntax2_table "$wbeg" "$wend" "$wattr"
ble/dense-array#fill-range _ble_highlight_layer_syntax2_table "$wbeg" "$wend" "$wattr"
elif [[ $wattr == m* ]]; then
local ranges; ble/string#split ranges , "${wattr:1}"
local i=$wbeg j range
Expand All @@ -6694,7 +6697,7 @@ function ble/highlight/layer:syntax/word/.apply-attribute {
(((i=j)<wend)) || break
done
elif [[ $wattr == d ]]; then
ble/highlight/layer:syntax/fill _ble_highlight_layer_syntax2_table "$wbeg" "$wend" ''
ble/dense-array#fill-range _ble_highlight_layer_syntax2_table "$wbeg" "$wend" ''
fi
}

Expand Down
1 change: 1 addition & 0 deletions memo/ChangeLog.md
Expand Up @@ -147,6 +147,7 @@
- complete (`cd`): fix duplicate candidates by `CDPATH` (reported by Lennart00 at `oh-my-bash`) `#D1415` 5777d7f
- complete (`source:file`): fix a bug that tilde expansion candidates are always filtered out `#D1416` 5777d7f
- complete: fix a problem of redundant unmatched ambiguous part with tilde expansions in the common prefix `#D1417` 5777d7f
- highlight: fix remaininig highlighting of vanishing words `#D1421` 0000000

## Compatibility

Expand Down
135 changes: 88 additions & 47 deletions note.txt
Expand Up @@ -1880,9 +1880,6 @@ bash_tips

2020-03-22

* syntax: { echo $fd; } {fd}>&0 の着色が変。
これは単語着色の除去ができていない問題であろう。

* read -t や read line の戻り値が変だ
→今試してみると別に変な事はない。-e が入っていても入っていなくても。

Expand Down Expand Up @@ -2810,50 +2807,6 @@ bash_tips
現状では一文字ずつ記録しているので一文字ずつ undo される。
現在の振る舞いの方が良いのか emacs と同様にまとめた方が良いかは微妙な所である。

2017-11-26

* highlight: 配列代入の解析の不整合? [tmp0003]

最初から arr[index まで入力した時の着色と
arr[index] まで入力してから一文字削除した時の着色が異なる。

| _ble_syntax_attr/tree/nest/stat?
| 7 aw 000 'a' stat=(CTX_CMDX w=- n=- t=-:-)
| 8 a e 001 '[' nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*a 002 'a' stat=(CTX_EXPR w=- n=@1 t=-:-)
| 6*a e 003 'b'
| | s 004 ^@ stat=(CTX_EXPR w=- n=@1 t=-:-)
| \_ 'a[ab'
| \_ '[ab'
|
| _ble_syntax_attr/tree/nest/stat?
| 7 aw 000 'a' | stat=(CTX_CMDX w=- n=- t=-:-)
| 8 aw 001 '[' || nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*aw 002 'a' || stat=(CTX_EXPR w=- n=@1 t=-:-)
| |*aw 003 'b' ||
| 8*aw 004 ']' ++ word=CTX_CMDI:0-5>@4 word="a[":1-5 stat=(CTX_EXPR w=- n=@1 t=-:-)
| | s 005 ^@ stat=(CTX_ARGX w=- n=- t=$5:-)
| \_ 'a[ab]'
| \_ '[ab]'
|
| _ble_syntax_attr/tree/nest/stat?
| 7 a 000 'a' stat=(CTX_CMDX w=- n=- t=-:-)
| 8 a e 001 '[' nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*aw 002 'a' stat=(CTX_EXPR w=- n=@1 t=-:-)
| 6*awe 003 'b'
| | s 004 ^@ stat=(CTX_EXPR w=- n=@1 t=-:-)
| \_ 'a[ab'
| \_ '[ab'

どうも構文の状態は同じだ。単語の着色が異なる。
しかしそもそも何故単語着色が起こっているのだったか。
単語着色は CTX_CMDI としての着色が残っているということ。
これは単語着色の側の問題であって、解析の問題ではない。

2019-02-13 "{ echo; } 3>&1" と入力した時にも
似たような事になる。"{ echo; } 3" まで入力した時の単語エラー着色が
最後まで残ってしまう。#D0930

2017-11-21

* syntax: for^J で改行にエラーが設置されるが見えない [#T0005]
Expand Down Expand Up @@ -3677,6 +3630,94 @@ bash_tips

2020-11-26

* 2020-03-22 syntax: { echo $fd; } {fd}>&0 の着色が変 [#D1422]
これは単語着色の除去ができていない問題であろう。

→これは #D1421 と全く同じ問題で、#D1421 に伴って自然解消した。

* 2017-11-26 highlight: 配列代入の解析の不整合? [#D1421]

最初から arr[index まで入力した時の着色と
arr[index] まで入力してから一文字削除した時の着色が異なる。

| _ble_syntax_attr/tree/nest/stat?
| 7 aw 000 'a' stat=(CTX_CMDX w=- n=- t=-:-)
| 8 a e 001 '[' nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*a 002 'a' stat=(CTX_EXPR w=- n=@1 t=-:-)
| 6*a e 003 'b'
| | s 004 ^@ stat=(CTX_EXPR w=- n=@1 t=-:-)
| \_ 'a[ab'
| \_ '[ab'
|
| _ble_syntax_attr/tree/nest/stat?
| 7 aw 000 'a' | stat=(CTX_CMDX w=- n=- t=-:-)
| 8 aw 001 '[' || nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*aw 002 'a' || stat=(CTX_EXPR w=- n=@1 t=-:-)
| |*aw 003 'b' ||
| 8*aw 004 ']' ++ word=CTX_CMDI:0-5>@4 word="a[":1-5 stat=(CTX_EXPR w=- n=@1 t=-:-)
| | s 005 ^@ stat=(CTX_ARGX w=- n=- t=$5:-)
| \_ 'a[ab]'
| \_ '[ab]'
|
| _ble_syntax_attr/tree/nest/stat?
| 7 a 000 'a' stat=(CTX_CMDX w=- n=- t=-:-)
| 8 a e 001 '[' nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
| 8*aw 002 'a' stat=(CTX_EXPR w=- n=@1 t=-:-)
| 6*awe 003 'b'
| | s 004 ^@ stat=(CTX_EXPR w=- n=@1 t=-:-)
| \_ 'a[ab'
| \_ '[ab'

どうも構文の状態は同じだ。単語の着色が異なる。
しかしそもそも何故単語着色が起こっているのだったか。
単語着色は CTX_CMDI としての着色が残っているということ。
これは単語着色の側の問題であって、解析の問題ではない。

2019-02-13 "{ echo; } 3>&1" と入力した時にも
似たような事になる。"{ echo; } 3" まで入力した時の単語エラー着色が
最後まで残ってしまう。#D0930

2020-11-26 改めて振る舞いを確認してみる。a[a とすると単語が消滅している。
また、a の場所に単語着色が残っている。消滅した単語に対する処理がない事が原因。

消滅単語に関する処理は今どうしているのだったか。note.txt の中を検索してみた
がよく分からない。消滅単語の範囲にある単語について再度着色を実行するという
事が書かれているが…。

うーん。ble/highlight/layer:syntax/update-word-table の内部で消滅した単語の範囲を
_ble_syntax_word_u{min,max} 及び color_u{min,max} に反映させている。
更に ble/highlight/layer:syntax/word/.apply-attribute 0 "$iN" d を実行して、
color_u{min,max} の内部にある属性を全て消去している。
その後で漸く各単語の属性に基づく着色を計算している。
つまり、消滅単語の範囲が狭すぎる。恐らく単語登録位置の範囲であって、
単語が実際に横たわっていた範囲ではないのである。

然し実際に ble/syntax/vanishing-word/register の実装を見てみると、
ちゃんと wbeg, wend を得てそれに基づいて範囲を更新している。
これが意味する所は何か。消滅した単語がちゃんと登録されていないという事か?
vanishing-word の中で変数を出力してみたが、どうやら lbeg,lend が狭く設定されている所為で
wbeg,wend が狭められてゼロ幅になっている様である。lbeg,lend とは何か。何を目的とした引数か。

確認してみるとどうやら 0:i1 に更新範囲を制限している。
つまり、解析開始点よりも前に位置する消滅単語についてしか消去していない。
これを 0:i2 に拡張したらどうなるだろうか…。もしかすると、
既存の消去しては行けない単語についても消去してしまう可能性もある。
実装について確認する必要がある。

確認すると実際に単語終端が i1:i2 の外にある単語が残っていると、この単語につ
いての着色が消されてしまう気がする。と思ったが、単語終端が外側にあってもそ
の一部が i1:i2 の内側にあるのであれば、必ずその単語は属性再計算の対象になる
のだからちゃんと更新されて然るべきである。うーん。0:i1 で vanishing-word を
制限していたのは単に最初の clear を最小限にするのが目的というだけの気がする。
というか color_u{min,max} を広げれば良いだけの話では? と思ったがどう広げる
のが良いのかという事を考えると結局 vanishiing-word を見て最小限の広げ方に留
めるのが良い気がする。という訳で、やはり vanishing-word の方を広げる事にする。

取り敢えず修正した。効率化する為に syntax:layer/fill も
新しく ble/dense-array#fill-range という関数を作って置き換えた。
動いている。上記の a[a] の着色も { echo; } 3>&1 の着色も直った。
取り敢えずはこれで様子見という事で良い気がする。

* 2020-11-07 highlight: declare 等に指定したオプションの着色についても対応する [#D1420]
→declare の着床は特別にしていると考えていたが実際に見てみると、
通常の引数と同じ仕組みを通じて処理していた。特に CTX_ARGVI も
Expand Down
8 changes: 8 additions & 0 deletions src/util.sh
Expand Up @@ -551,6 +551,14 @@ function ble/array#replace {
'; builtin eval -- "${_ble_local_script//ARR/$1}"
}

function ble/dense-array#fill-range {
ble/array#reserve-prototype $(($2-$1))
local _ble_script='
local -a sARR; sARR=("${_ble_array_prototype[@]::$3-$2}")
ARR=("${ARR[@]::$2}" "${sARR[@]/#/$4}" "${ARR[@]:$3}")'
builtin eval -- "${_ble_script//ARR/$1}"
}

_ble_string_prototype=' '
function ble/string#reserve-prototype {
local n=$1 c
Expand Down

0 comments on commit 1066653

Please sign in to comment.