コマンドごとに異なるzshメニュー選択動作を使用することは可能ですか?


13

menu select動作を使用してzshいます。これにより、カーソルの下のメニューが呼び出され、さまざまな可能性を確認できます。これに設定した.zshrcオプションは

zstyle ':completion:*' menu select=2

デフォルトでは、Returnこのメニューで候補を選択して押しても、単語が完成するだけです。実際にコマンドを送信するわけではありません。たとえば、次のようなメニューが表示される場合があります

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Returnここを押すと、

~ % cd Desktop/

私は押しする必要が、実際にコマンドを送信するための時間を。Return

この動作を変更して、Return両方を押して完了選択し、これを実行してコマンド送信するようにすることができます

bindkey -M menuselect '^M' .accept-line

ただし、これには問題があります。コマンド送信せずにファイルまたはディレクトリを完了する必要がある場合があります。たとえば、必要な場合があります。ln -s Desktop Desktop2このbindkey動作では、Desktopを完了しようとするln -s Desktop/とコマンドとして送信されることになり、明らかにそれは望ましくありません。

スペースを押すだけでコマンドを実行できることは承知していますが、今では習慣になっています。
これを考えると、一部のコマンドのみがReturn1回押すことができるようにする方法がありますが(たとえばcd)、他のすべてコマンドは2回押す必要がありますか?


.zshrcファイルで許可されていない場合、コマンドベースの動作をサポートするようにソースコードを自分で調整しない限り、答えは単に「いいえ」になります。しかし、あなたはまだ自分自身で道がちょうど追加...押下するよりも面倒である、これを行うにはどのコマンドのために定義する必要があります
タマラWijsman

回答:


3

これが本当に必要な場合、理論的には、実行中のコマンドをチェックする関数を設定し、行を完了するか送信することができます。

次のようなものを試してください(未テスト):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

ソース:zshの古い.inputrcのカスタムコマンドを使用していますか?


0

技術的には、あなたが求めている方法では不可能です。他の方法があるかどうかわからない

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.