akinomyoga / ble.sh

Bash Line Editor―a line editor written in pure Bash with syntax highlighting, auto suggestions, vim modes, etc. for Bash interactive sessions.
BSD 3-Clause "New" or "Revised" License
2.73k stars 86 forks source link

履歴展開の置換指示子後の区切り記号が`/`の時以外に正しく構文強調されない #10

Closed cmplstofB closed 6 years ago

cmplstofB commented 6 years ago

Commit ID: 860e0fe Version of GNU Bash: 4.4.12

$ echo foo
$ !!:s@f@/ # 注意: この@はカーソル位置を表わす記号ではない
$ echo /foo@

このように履歴展開においては置換指示子sに後置される置換区切り文字は/でなくても機能しますが,bleshの構文強調はこの文字が/であるときのみに働き,それ以外の場合はble-color-setface syntax_history_expansionで設定した色になりません。

また,本来は別issueにすべきでしょうが,ほとんど内容が同じなので,もう一件立てさせてください。

$ echo foo
$ !!:gs/o/z
$ echz fzz

このとき,履歴展開用の構文強調は「!!:gs/o/z」全体に及ぶべきですが,実際は「!!:g」までしか適用されません。

akinomyoga commented 6 years ago

このように履歴展開においては置換指示子sに後置される置換区切り文字は/でなくても機能しますが,bleshの構文強調はこの文字が/であるときのみに働き,それ以外の場合はble-color-setface syntax_history_expansionで設定した色になりません。

これは既知で放置でした。対応に時間がかかるかもしれません。現状では ble.sh では正規表現 (lib/core-syntax.sh#L1454-L1456) を用いて履歴展開に一致させているのですが、正規表現で s?..?..? に正しく一致させられないので無効にしています (ソースコードの上記箇所のコメントに書かれている様に Bash で使っている正規表現は POSIX の正規表現なので最短一致がないのでした)。s?..?..? だけグロブで処理する様に変更してみることにします。

このとき,履歴展開用の構文強調は「!!:gs/o/z」全体に及ぶべきですが,実際は「!!:g」までしか適用されません。

ああ、これはミスです。以下のような感じに取り敢えず直そうと考えているのですが問題ありませんか。というより、:& をどうやって発動させたら良いのかが分からず、:& に対して gG を指定する方法が正しいのか分からないでいます。:& の使い方についてご存じないでしょうか。

-  local rex_modifier=':[htrepqx&gG]|:s(/([^\/]|\\.)*){0,2}(/|$)'
+  local rex_modifier=':[htrepqxgGa]|:[gGa]?&|:[gGa]?s(/([^\/]|\\.)*){0,2}(/|$)'
cmplstofB commented 6 years ago

Re: 履歴展開において置換指示子sに後置される置換区切り文字

ありがとうございます。

修飾子&の使い方

僕も,あまり(いや実際は滅多に)使いませんので,合っているかどうかは分かりませんが,以下に修飾子&を使用する状況を述べます:

$ echo ffffffffoo
$ !!:s/f/g
$ echo gfffffffoo
$ !!:&
$ echo ggffffffoo
$ !!:g&
$ echo ggggggggoo

……こんな状況あるんですかね。

akinomyoga commented 6 years ago

Re: 修飾子&の使い方

ありがとうございます!

なるほど。うわー…つまり履歴展開はステートレスではなくて前回展開した時の内容に依存するんですね…。そうすると、今の実装は、ble.sh が内部的に呼んでいる履歴展開によってユーザの実行した履歴展開の記録が破壊されたり、逆に ble.sh がサブシェルで実行している履歴展開は記録されなかったり、と色々問題がありますね…。

取り敢えず :g&:a&:G& はちゃんと動作として確認できましたので、履歴展開として解釈するようにします。

akinomyoga commented 6 years ago

Re: 履歴展開において置換指示子sに後置される置換区切り文字 & :gs etc

Re: 修飾子&の使い方

cmplstofB commented 6 years ago

d7fa31b にて,修正を確認しました。ありがとうございます!

akinomyoga commented 6 years ago

ご報告ありがとうございました! 閉じます