zshでVimバインディングで `Alt + .`を使用する方法

zshでVimバインディングで `Alt + .`を使用する方法

私はzshとbindkeys -v

Alt + .期待どおりに動作しません。現在、標準入力に入力されているが入力されていない内容が次の行に繰り返されるようです。

この投稿bashのように動作することを示唆しているようです。つまり、入力された最後のコマンドの最後の引数を取得します。

これが期待どおりに行われるには何が必要ですか?

答え1

端末ではAlt、+はchar通常と同じですEsc char。 (一部の端末は異なるように設定できます。)

vi 挿入モードからEscコマンドモードに切り替えます。 vi コマンドモードではEsc何もしません。 vi コマンドモードで.前のコマンドを繰り返します。

小さな部品insert-last-wordデフォルトのバインディングはemacsモードではAlt+.Alt+_ですが、viモードにはデフォルトのバインディングはありません。 viモードで使用するには、バインディングを指定する必要があります。

bindkey -M vicmd _ insert-last-word

これは入れるコマンド:カーソルの前にテキストを挿入します。行末では実行できません。これは、行末でよく使用されるコマンドでは非常に不便です。あなたは正義を好むかもしれませんappend-last-word

function append-last-word { ((++CURSOR)); zle insert-last-word; }
zle -N append-last-word
bindkey -M vicmd _ append-last-word                        

答え2

この回答を参照してください。https://stackoverflow.com/a/34293570/340947他の答えとは異なり、vicmdマッピングには(非包括的な)テストで深刻な問題があります!このviinsマッピングがトリックのようです。

見積もりは次のとおりです(について~/.zshrc)。

bindkey -M viins '\e.' insert-last-word

bashの場合も同様です~/.inputrc

set keymap vi-insert
"\e.":yank-last-arg

いいですね。これは最も一般的なユースケースであるAlt +をカバーしています。これらのシェルでは挿入モードになりますが、時には通常モードでナビゲートして前の最後の引数を挿入しようとします。それから@gillesのもう一つの答えが入ってきます。基本的な答えだけがカーソルを正しい位置に保ちます。はい、カーソルの前に挿入されます。この問題を解決する方法がないようです。

関連情報