diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index d68067b6..f0ed55dd 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -103,7 +103,7 @@ - util: synchronize rlvars with `bleopt complete_{menu_color{,_match},skip_matched} term_bracketed_paste_mode` (motivated by ArianaAsl) `#D1819` 6d20f51 - util: suppress false warnings of `bind` inside non-interactive shells (reported by wukuan405) `#D1823` 1e19a67 - history: support `bleopt history_erasedups_limit` (motivated by SuperSandro2000) `#D1822` e4afb5a 3110967 -- prompt: support `bleopt prompt_{emacs,vi}_mode_indicator` (motivated by ferdinandyb) `#D1843` XXXXXXX +- prompt: support `bleopt prompt_{emacs,vi}_mode_indicator` (motivated by ferdinandyb) `#D1843` 2b905f8 ## Changes @@ -166,7 +166,8 @@ - decode (`bind`): do not treat non-beginning `#` as comments `#D1820` 65c4138 - history: disable the history file when `HISTFILE` is empty `#D1836` 9549e83 - complete: generate options by empty-word copmletion after filenames (reported by geekscrapy) `#D1846` 6954b13 - - complete: do not show option descriptions for the empty-word completion (requested by geekscrapy) `#D1846` XXXXXXX + - complete: do not show option descriptions for the empty-word completion (requested by geekscrapy) `#D1846` 1c7f7a1 +- syntax (`extract-command`): extract unexpected command names as commands `#D1848` XXXXXXX ## Fixes @@ -375,7 +376,7 @@ - complete: add completion integration with `zoxide` (reported by ferdinandyb) `#D1838` a96bafe - util (`modifyOtherKeys`): work around delayed terminal identification `#D1842` 14f3c81 - util (`modifyOtherKeys`): fix a bug that kitty protocol is never activated `#D1842` 14f3c81 -- util (`modifyOtherKeys`): pass-through kitty protocol sequences (motivated by ferdinandyb) `#D1845` XXXXXXX +- util (`modifyOtherKeys`): pass-through kitty protocol sequences (motivated by ferdinandyb) `#D1845` f66e0c1 ## Internal changes and fixes diff --git a/lib/core-complete.sh b/lib/core-complete.sh index b0193a32..e49cb09a 100644 --- a/lib/core-complete.sh +++ b/lib/core-complete.sh @@ -3475,6 +3475,9 @@ function ble/complete/progcomp/.compgen { # https://github.com/scop/bash-completion/pull/556 (fixed in bash-completion 2.12) ble/function#suppress-stderr _scp_remote_files 2>/dev/null + # https://github.com/scop/bash-completion/pull/773 (fixed in bash-completion 2.12) + ble/function#suppress-stderr _function 2>/dev/null + ble/complete/mandb:_parse_help/inject fi diff --git a/lib/core-syntax-ctx.def b/lib/core-syntax-ctx.def index 1fe300f1..a276cdc5 100644 --- a/lib/core-syntax-ctx.def +++ b/lib/core-syntax-ctx.def @@ -19,6 +19,7 @@ CTX_ARGX0 18 # (コマンド) 文法的には次に引数が来そうだ CTX_ARGI 4 # (コマンド) context,attr: in an argument CTX_ARGQ 61 # (コマンド) v=1 v+=1 a[1]=1 a[1]+=1 の形式の引数の = 以降。: で区切ったチルダ展開が有効である。 CTX_CMDX 1 # (コマンド) 次にコマンドが来る。 +CTX_CMDX0 82 # (コマンド) 文法的には次にコマンドが来そうだが実際はもう来てはならない文脈。例えば { :; } >a の直後 (redirection の時点で文法エラー)。 CTX_CMDX1 17 # (コマンド) 次にコマンドが少なくとも一つ来なければならない。例えば ( や && や while の直後。 CTX_CMDXT 49 # (コマンド) time や ! の後。次にコマンドが少なくとも1つ来るか ; が来るか、行末が来る。 CTX_CMDXC 26 # (コマンド) 次に複合コマンド ('(' '{' '((' '[[' for select case if while until) が来る。 diff --git a/lib/core-syntax.sh b/lib/core-syntax.sh index bc1e4579..89e52c24 100644 --- a/lib/core-syntax.sh +++ b/lib/core-syntax.sh @@ -3217,6 +3217,7 @@ function ble/syntax:bash/check-variable-assignment { _BLE_SYNTAX_FCTX[CTX_ARGX]=ble/syntax:bash/ctx-command _BLE_SYNTAX_FCTX[CTX_ARGX0]=ble/syntax:bash/ctx-command _BLE_SYNTAX_FCTX[CTX_CMDX]=ble/syntax:bash/ctx-command +_BLE_SYNTAX_FCTX[CTX_CMDX0]=ble/syntax:bash/ctx-command _BLE_SYNTAX_FCTX[CTX_CMDX1]=ble/syntax:bash/ctx-command _BLE_SYNTAX_FCTX[CTX_CMDXT]=ble/syntax:bash/ctx-command _BLE_SYNTAX_FCTX[CTX_CMDXC]=ble/syntax:bash/ctx-command @@ -3426,6 +3427,7 @@ _ble_syntax_bash_command_EndWtype[CTX_ARGX0]=$CTX_ARGI _ble_syntax_bash_command_EndWtype[CTX_ARGVX]=$CTX_ARGVI _ble_syntax_bash_command_EndWtype[CTX_ARGEX]=$CTX_ARGEI _ble_syntax_bash_command_EndWtype[CTX_CMDX]=$CTX_CMDI +_ble_syntax_bash_command_EndWtype[CTX_CMDX0]=$CTX_CMDX0 _ble_syntax_bash_command_EndWtype[CTX_CMDX1]=$CTX_CMDI _ble_syntax_bash_command_EndWtype[CTX_CMDXT]=$CTX_CMDI _ble_syntax_bash_command_EndWtype[CTX_CMDXC]=$CTX_CMDI @@ -3478,19 +3480,21 @@ function ble/syntax:bash/ctx-command/check-word-end { local wbeg=$wbegin wlen=$((i-wbegin)) wend=$i local word=${text:wbegin:wlen} - local wt=$wtype + local stat_wt=$wtype # 単語解析中の wtype - [[ ${_ble_syntax_bash_command_EndWtype[wt]} ]] && - wtype=${_ble_syntax_bash_command_EndWtype[wt]} - local rex_expect_command=${_ble_syntax_bash_command_Expect[wt]} + [[ ${_ble_syntax_bash_command_EndWtype[stat_wt]} ]] && + wtype=${_ble_syntax_bash_command_EndWtype[stat_wt]} + local rex_expect_command=${_ble_syntax_bash_command_Expect[stat_wt]} if [[ $rex_expect_command ]]; then # 特定のコマンドのみを受け付ける文脈 - [[ $word =~ $rex_expect_command ]] || ((wtype=ATTR_ERR)) - fi - if ((wt==CTX_CMDX1)); then + [[ $word =~ $rex_expect_command ]] || ((wtype=CTX_CMDX0)) + elif ((stat_wt==CTX_ARGX0||stat_wt==CTX_CPATX0)); then + ((wtype=ATTR_ERR)) + elif ((stat_wt==CTX_CMDX1)); then local rex='^(then|elif|else|do|\}|done|fi|esac)$' - [[ $word =~ $rex ]] && ((wtype=ATTR_ERR)) + [[ $word =~ $rex ]] && ((wtype=CTX_CMDX0)) fi + local tree_wt=$wtype # 実際に単語として登録された wtype ble/syntax/parse/word-pop if ((ctx==CTX_CMDI)); then @@ -3498,7 +3502,10 @@ function ble/syntax:bash/ctx-command/check-word-end { ble/alias#expand "$word"; local word_expanded=$ret # キーワードの処理 - if ((wt!=CTX_CMDXV)); then # Note: 変数代入の直後はキーワードは処理しない + if ((tree_wt==CTX_CMDX0)); then + ((_ble_syntax_attr[wbeg]=ATTR_ERR,ctx=CTX_ARGX)) + return 0 + elif ((stat_wt!=CTX_CMDXV)); then # Note: 変数代入の直後はキーワードは処理しない local processed= case "$word_expanded" in ('[[') @@ -3527,7 +3534,7 @@ function ble/syntax:bash/ctx-command/check-word-end { ('case') ((ctx=CTX_CARGX1)); processed=begin ;; ('{') ((ctx=CTX_CMDX1)) - if ((wt==CTX_CMDXD||wt==CTX_CMDXD0)); then + if ((stat_wt==CTX_CMDXD||stat_wt==CTX_CMDXD0)); then processed=middle # "for ...; {" などの時 else processed=begin @@ -3599,9 +3606,11 @@ function ble/syntax:bash/ctx-command/check-word-end { local rematch2=${BASH_REMATCH[2]} if [[ $rematch2 == '('*')' ]]; then - # case: /hoge ( *)/ 関数定義 (単語の種類を変更) + # case: /hoge ( *)/ 関数定義 (単語の種類 wtype を変更) # 上方の ble/syntax/parse/word-pop で設定した値を書き換え。 - _ble_syntax_tree[i-1]="$ATTR_FUNCDEF ${_ble_syntax_tree[i-1]#* }" + # Note: 単語の種類が CTX_CMDX0 の時はそのままにする。 + ((tree_wt==CTX_CMDX0)) || + _ble_syntax_tree[i-1]="$ATTR_FUNCDEF ${_ble_syntax_tree[i-1]#* }" ((_ble_syntax_attr[i]=CTX_CMDX1,i+=${#rematch1}, _ble_syntax_attr[i]=ATTR_DEL,i+=${#rematch2}, @@ -3663,6 +3672,7 @@ _ble_syntax_bash_command_Opt[CTX_ARGX]=1 _ble_syntax_bash_command_Opt[CTX_ARGX0]=1 _ble_syntax_bash_command_Opt[CTX_ARGVX]=1 _ble_syntax_bash_command_Opt[CTX_ARGEX]=1 +_ble_syntax_bash_command_Opt[CTX_CMDX0]=1 _ble_syntax_bash_command_Opt[CTX_CMDXV]=1 _ble_syntax_bash_command_Opt[CTX_CMDXE]=1 _ble_syntax_bash_command_Opt[CTX_CMDXD0]=1 @@ -3680,7 +3690,7 @@ function ble/syntax:bash/ctx-command/.check-delimiter-or-redirect { elif [[ $spaces == *$'\n'* ]]; then # 改行がある場合: ヒアドキュメントの確認 / 改行による文脈更新 ble/syntax:bash/check-here-document-from "$spaces" && return 0 - if ((ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX||ctx==CTX_CMDXV||ctx==CTX_CMDXT||ctx==CTX_CMDXE)); then + if ((ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX||ctx==CTX_CMDX0||ctx==CTX_CMDXV||ctx==CTX_CMDXT||ctx==CTX_CMDXE)); then ((ctx=CTX_CMDX)) elif ((ctx==CTX_FARGX2||ctx==CTX_FARGX3||ctx==CTX_CMDXD0)); then ((ctx=CTX_CMDXD)) @@ -3706,7 +3716,7 @@ function ble/syntax:bash/ctx-command/.check-delimiter-or-redirect { ((ctx=CTX_CMDXV, _ble_syntax_attr[i]=ATTR_ERR)) elif ((ctx==CTX_CMDXE)); then - ((ctx=CTX_ARGX0)) + ((ctx=CTX_CMDX0)) elif ((ctx==CTX_FARGX3)); then ((_ble_syntax_attr[i]=ATTR_ERR)) fi @@ -3797,7 +3807,7 @@ function ble/syntax:bash/ctx-command/.check-delimiter-or-redirect { fi if [[ $attr ]]; then - ((_ble_syntax_attr[i]=(ctx==CTX_CMDX||ctx==CTX_CMDXV||ctx==CTX_CMDXE||ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX)?attr:ATTR_ERR, + ((_ble_syntax_attr[i]=(ctx==CTX_CMDX||ctx==CTX_CMDX0||ctx==CTX_CMDXV||ctx==CTX_CMDXE||ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX)?attr:ATTR_ERR, i+=1)) ble/syntax/parse/nest-pop return 0 @@ -3817,6 +3827,7 @@ _ble_syntax_bash_command_BeginCtx[CTX_ARGX0]=$CTX_ARGI _ble_syntax_bash_command_BeginCtx[CTX_ARGVX]=$CTX_ARGVI _ble_syntax_bash_command_BeginCtx[CTX_ARGEX]=$CTX_ARGEI _ble_syntax_bash_command_BeginCtx[CTX_CMDX]=$CTX_CMDI +_ble_syntax_bash_command_BeginCtx[CTX_CMDX0]=$CTX_CMDI _ble_syntax_bash_command_BeginCtx[CTX_CMDX1]=$CTX_CMDI _ble_syntax_bash_command_BeginCtx[CTX_CMDXT]=$CTX_CMDI _ble_syntax_bash_command_BeginCtx[CTX_CMDXC]=$CTX_CMDI @@ -3894,7 +3905,7 @@ function ble/syntax:bash/ctx-command { ble/util/assert ' ((ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX|| ctx==CTX_FARGX2||ctx==CTX_FARGX3||ctx==CTX_COARGX|| - ctx==CTX_CMDX||ctx==CTX_CMDX1||ctx==CTX_CMDXT||ctx==CTX_CMDXC|| + ctx==CTX_CMDX||ctx==CTX_CMDX0||ctx==CTX_CMDX1||ctx==CTX_CMDXT||ctx==CTX_CMDXC|| ctx==CTX_CMDXE||ctx==CTX_CMDXD||ctx==CTX_CMDXD0||ctx==CTX_CMDXV))' "invalid ctx=$ctx @ i=$i" ble/util/assert '((wbegin<0&&wtype<0))' "invalid word-context (wtype=$wtype wbegin=$wbegin) on non-word char." ble/syntax:bash/ctx-command/.check-delimiter-or-redirect; return "$?" @@ -4596,7 +4607,7 @@ function ble/syntax:bash/is-complete { # (4) 完結している文脈値の時以外 local ctx=${stat[0]} ((ctx==CTX_ARGX||ctx==CTX_ARGX0||ctx==CTX_ARGVX||ctx==CTX_ARGEX|| - ctx==CTX_CMDX||ctx==CTX_CMDXT||ctx==CTX_CMDXE||ctx==CTX_CMDXV|| + ctx==CTX_CMDX||ctx==CTX_CMDX0||ctx==CTX_CMDXT||ctx==CTX_CMDXE||ctx==CTX_CMDXV|| ctx==CTX_TARGX1||ctx==CTX_TARGX2)) || return 1 fi @@ -5429,6 +5440,7 @@ function ble/syntax/completion-context/.check-prefix/ctx:next-identifier { fi } _ble_syntax_bash_complete_check_prefix[CTX_ARGX0]="next-word sabbrev" +_ble_syntax_bash_complete_check_prefix[CTX_CMDX0]="next-word sabbrev" _ble_syntax_bash_complete_check_prefix[CTX_CPATX0]="next-word sabbrev" _ble_syntax_bash_complete_check_prefix[CTX_CMDXD0]="next-word wordlist:-rs:';:{:do'" _ble_syntax_bash_complete_check_prefix[CTX_CMDXD]="next-word wordlist:-rs:'{:do'" @@ -5720,7 +5732,7 @@ function ble/syntax/completion-context/.check-here { ble/syntax/completion-context/.add wordlist:-rs:';:{:do' "$index" elif ((ctx==CTX_CMDXD)); then ble/syntax/completion-context/.add wordlist:-rs:'{:do' "$index" - elif ((ctx==CTX_ARGX0||ctx==CTX_CPATX0)); then + elif ((ctx==CTX_ARGX0||ctx==CTX_CPATX0||ctx==CTX_CMDX0)); then ble/syntax/completion-context/.add sabbrev "$index" elif ((ctx==CTX_ARGX||ctx==CTX_CARGX1||ctx==CTX_FARGX3)); then ble/syntax/completion-context/.add argument "$index" @@ -5818,7 +5830,7 @@ function ble/syntax:bash/extract-command/.register-word { function ble/syntax:bash/extract-command/.construct-proc { if [[ $wtype =~ ^[0-9]+$ ]]; then - if ((wtype==CTX_CMDI)); then + if ((wtype==CTX_CMDI||wtype==CTX_CMDX0)); then if ((EC_pos/dev/null } 等の文脈である。こ + の } は CTX_ARGX0 ではなくて別の文脈で読み取るべきの気がする。 + + やはり CTX_CMDX0 的な物を新しく導入するべきだろうか。その方がすっきりす + る様な気がする。 + + その場合には現在の ARGX0 を指定している箇所の多くは CMDX0 に変更した方 + が良いのかもしれない。例えば (()) ... や () ... や [[ ]] ... 等。うーん。 + 本当だろうか。これらはやはりそのままで良い気がする。但し補完は発生しな + い様にしなければならない。 + + 2022-07-20 うーん。今改めて確認した所 redirection で別にエラーになって + いる訳でもない。うーん。どう修正したのだったか確認する。CMDX0 にしてい + る。なのに何故エラー着色が消えているのだろうか。 + + 2022-07-24 現在はちゃんとエラーコマンド・エラー着色になっている。制御構 + 造の終端としても取り扱わない様にしている。これで良いと思われる。 + + ? ok: CPATX0 についてはどうするのか。これについてもちゃんと考えておきたい。 + + →これは特に今まで通りで問題ない。元々 wtype = ATTR_ERR を設定した単語 + をコマンド名として extract-command するとした案の時に問題が起こる可能性 + を考えていた。然し今は CMDX0 を新しく導入して、エラーコマンド名に関して + は wtype として CMDX0 を使って区別する事にした。なので、CPATX0 の単語に + 対して ATTR_ERR で単語登録しても問題は生じない。 + + ? ok: エラーコマンドに対して補完は実行するのか? →これは補完しない様にす + るのが自然の気がする。 + + →現在はコマンド名は補完しない。一方でエラーコマンドの引数に関しては、 + エラーコマンドのコマンド名に従って引数補完を実行する様になっている。こ + の振る舞いで良いだろう。 + + * aaa を単語として登録するかどうかはまた別の問題で、これは function aaa + [TAB] とした時の補完を progcomp で提供するかどうかという事に関係して来る + 様な気がする。 + + * bash-completion は既存の関数の内容を挿入する事になっているが、その他の + 物を挿入したいという可能性はあるだろうか。他にない気がするので現在の関 + 数定義を挿入するという事で決め打ちで良い気がする。 + + * また関数定義は複数行からなるが、現在の progcomp の仕組みだと複数行の候 + 補は全て分割されてしまうので、何れにしても bash-completion を使ってもちゃ + んと動かない。これを回避するには compgen を自前で実装し直すしかない様な + 気がする。或いは compgen -0 の patch が取り込まれれば新しい bash では大 + 丈夫になる。然しそれはまた独立な話題である。 + + * またこの方針だと func() [TAB] の時に同様の機能を提供できない。 + + そう思うと補完は progcomp とは別に実装するので良い気がする。そして、もし + そうするのだとしたら aaa を単語として登録する意義は薄いのではないか。これ + は func() [TAB] 及び function func [TAB] の補完の実装時に考えれば良い事で + ある。 + 2022-07-13 * mandb: ls のオプションの抽出がおかしい [#D1847]