Closed cmplstofB closed 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」までしか適用されません。
ああ、これはミスです。以下のような感じに取り敢えず直そうと考えているのですが問題ありませんか。というより、:&
をどうやって発動させたら良いのかが分からず、:&
に対して g
や G
を指定する方法が正しいのか分からないでいます。:&
の使い方についてご存じないでしょうか。
- local rex_modifier=':[htrepqx&gG]|:s(/([^\/]|\\.)*){0,2}(/|$)'
+ local rex_modifier=':[htrepqxgGa]|:[gGa]?&|:[gGa]?s(/([^\/]|\\.)*){0,2}(/|$)'
ありがとうございます。
&
の使い方僕も,あまり(いや実際は滅多に)使いませんので,合っているかどうかは分かりませんが,以下に修飾子&
を使用する状況を述べます:
$ echo ffffffffoo
$ !!:s/f/g
$ echo gfffffffoo
$ !!:&
$ echo ggffffffoo
$ !!:g&
$ echo ggggggggoo
……こんな状況あるんですかね。
ありがとうございます!
なるほど。うわー…つまり履歴展開はステートレスではなくて前回展開した時の内容に依存するんですね…。そうすると、今の実装は、ble.sh
が内部的に呼んでいる履歴展開によってユーザの実行した履歴展開の記録が破壊されたり、逆に ble.sh
がサブシェルで実行している履歴展開は記録されなかったり、と色々問題がありますね…。
取り敢えず :g&
と :a&
と :G&
はちゃんと動作として確認できましたので、履歴展開として解釈するようにします。
:gs
etc:&
の振る舞いを調べた所、「置換指示子」を使わない限りは記録が上書きされることはないようなので、ble.sh
が内部的に使用する履歴展開では問題は起こらなそうです。enhance-complete
ブランチ) Bash 3.0 では「history -p
により履歴項目が削除されるバグ」を避けるためにサブシェルで履歴展開を実行していたため、:&
が使えない状態でしたが、別の避け方で :&
を使えるようにしました。d7fa31b にて,修正を確認しました。ありがとうございます!
ご報告ありがとうございました! 閉じます
Commit ID: 860e0fe Version of GNU Bash: 4.4.12
このように履歴展開においては置換指示子
s
に後置される置換区切り文字は/
でなくても機能しますが,bleshの構文強調はこの文字が/
であるときのみに働き,それ以外の場合はble-color-setface syntax_history_expansion
で設定した色になりません。また,本来は別issueにすべきでしょうが,ほとんど内容が同じなので,もう一件立てさせてください。
このとき,履歴展開用の構文強調は「
!!:gs/o/z
」全体に及ぶべきですが,実際は「!!:g
」までしか適用されません。