diff --git a/lib/core-syntax.sh b/lib/core-syntax.sh index 2e52191d..1ae8d08b 100644 --- a/lib/core-syntax.sh +++ b/lib/core-syntax.sh @@ -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 @@ -6679,7 +6682,7 @@ function ble/highlight/layer:syntax/word/.apply-attribute { wbeg&0 の着色が変。 - これは単語着色の除去ができていない問題であろう。 - * read -t や read line の戻り値が変だ →今試してみると別に変な事はない。-e が入っていても入っていなくても。 @@ -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] @@ -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 も diff --git a/src/util.sh b/src/util.sh index 71eda92d..364f4bc4 100644 --- a/src/util.sh +++ b/src/util.sh @@ -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