完了メニューが開いているときにzleウィジェットを何度も繰り返す方法は?

完了メニューが開いているときにzleウィジェットを何度も繰り返す方法は?

私はzshシェルを使用しており、完了メニューを開くときにVimのバッファーと同じキーを使用するようにいくつかのキーバインディングをインストールしたいと思います。

したがって、キーマップ内に次の行を追加してmenuselectキーjとウィジェットをkバインドします。zledown-line-or-historyup-line-or-history~/.zshrc

bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history

down-line-or-historyそして次のようにup-line-or-history説明されます。man zshzle

down-line-or-history (^N ESC-[B) (j) (ESC-[B)
        Move down a line in the buffer, or if already at the bottom line, move to the next event in  the  his‐
        tory list.

up-line-or-history (^P ESC-[A) (k) (ESC-[A)
        Move up a line in the buffer, or if already at the top line, move to the previous event in the history
        list.

C-dこれで、同じウィジェットにとをバインドしたいが、C-u好きなだけ繰り返すことができます(例:)5

最初は、次のような簡単なコードを試しました。

some-widget() {
    zle backward-char -n 5
}
zle -N some-widget
bindkey '^D' some-widget

C-dzleウィジェットにバインドされていますが、何度もbackward-char繰り返されます。5

次に、キーバインディングを主キーマップからキーマップに移動するコードを書き直しましたmenuselect

some-widget() {
    zle backward-char -n 5
}
zle -N some-widget
bindkey -M menuselect '^D' some-widget

C-dただし、完了メニューが開いている間にクリックすると、バインドされたデフォルトウィジェットを実行しているように見えるzleため、期待どおりに機能しません。C-ddelete-char-or-list

delete-char-or-list (^D) (unbound) (unbound)
        Delete the character under the cursor.  If the cursor is at the end of the line, list possible comple‐
        tions for the current word.

5現在の完了メニューを終了してカーソルを数回後ろに移動するのではなく、現在の単語の可能な完了を一覧表示します。

期待どおりに機能する場合は、最終的に次のような最終コードを使用します。

fast-down-line-or-history() {
    zle down-line-or-history -n 5
}
zle -N fast-down-line-or-history
bindkey -M menuselect '^D' fast-down-line-or-history

fast-up-line-or-history() {
    zle up-line-or-history -n 5
}
zle -N fast-up-line-or-history
bindkey -M menuselect '^U' fast-up-line-or-history

zleただし、そうでないため、完成メニューが開いたときにウィジェットを繰り返す方法を見つける必要があります。

down-line-or-history完成メニューを開いた状態でクリックしたときに何度も繰り返されるように古いコードを変更するにはどうすればよいですか?5C-d

答え1

ウィジェットのため、コードは機能しません。「メニュー選択グラフは常に同じことを行います。ユーザーが定義したウィジェットに置き換えたり、機能セットを拡張したりすることはできません。」

しかし、する働く:

bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history
bindkey -M menuselect -s '^D' 'jjjjj'
bindkey -M menuselect -s '^U' 'kkkkk'

この-sオプションを使用すると、直接入力したようにZLE(Zsh Line Editor)に入力するテキスト文字列を指定できます。をctrlD押すとj5回押すと、希望の効果が得られます。

しかし、特に速くないので注意してください。実際、カーソルが一度に1段階ずつ上下に5段階ずつ移動するのがわかります。

関連情報