zsh 完了に前のコマンドのパラメーターを追加する

zsh 完了に前のコマンドのパラメーターを追加する

zsh(およびbash)では、いくつかの履歴単語拡張を使用して前のコマンドの引数を表すことができます。

この例では、拡張機能を使用して履歴の前のコマンドから2番目の引数を取得する方法を示します!:#

% echo foo bar baz
foo bar baz
% echo !:2
echo bar
bar

私はしばしば特定のパラメータが#パラメータであるかどうかを正確に忘れ、!:#それがどのパラメータであるかを覚えているときに入力が常に速くはありません。最後のパラメータを変更する方法を知っていますが、時々meta-.私が望む最後のパラメータではないことがあります。

zshに入力するすべてのコマンドを完了するための提案として、前のコマンドのパラメータを追加したいと思います。

最後のコマンドで引数配列(0..N)を生成し、それを特定のコマンドにバインドするシェル関数を生成する方法を見つけることができました。

_last_command_args() {
    last_command=$history[$[HISTCMD-1]]
    last_command_array=("${(s/ /)last_command}") 
    _sep_parts last_command_array
}

# trying to get last_command_args to be suggested for any command, this just works for foo
compdef _last_command_args foo

Tabキーを使用した後のfooの外観は次のとおりです<TAB>

% echo bar baz qux
bar baz qux
% foo <TAB>
bar   baz   echo  qux 

これは "foo"コマンドを完了するのに役立ちますが、私が作成するすべてのzsh拡張のオプションとして使用したいと思います。私はそれがzstyle Completerに関連していると思いましたが、数時間のハッキングの後に私は私の能力を超えていることに気づきました。

zshのすべてのコマンドに対して提案された完成で、前のコマンドからパラメータを取得する方法は?

私は完全です。zshrc はインストールファイルをコンパイルします。お役に立てば、bitbucketに共有してください。ほとんどはさまざまなソースから盗作されており、その一部は私が自分で書いたものです。

修正する:

@Julien Nicoulaudの答えは私を近づけ、私がどこにいなければならないかを確認するために承認されたとマークしました。

私の特定の設定に従って推奨事項を使用します。

zstyle ':completion:*' completer _last_command_args _complete

タブ補完は最後のコマンドの引数のリストだけを表示するので、私にはうまくいきません(実際にはファイル名も完成しますが、表示しません)。順序を変更すると、_complete _last_command_args反対の効果が表示されます。一般的なファイル名は表示されますが、last_command_argsは表示されません。

私はこれが完成者がどのように機能するかと関係があると思います。私は正常に返された最初の方法の出力のみを表示すると思いましたが、何が起こっているのかを完全に理解するためにzshソースを解析するのに問題があります。呼び出しを含む_completeコマンドの最後の引数と一般的なオートコンプリート項目を表示するようにメソッドを調整できました。あまり分離されていませんが、私にとっては十分です。

私が持っている他のzstyleエントリと一緒に使う完全な機能は次のとおりです。

# adds the arguments from the last commadn to the autocomplete list
# I wasn't able to get this to work standalone and still print out both regular
# completion plus the last args, but this works well enough.
_complete_plus_last_command_args() {
    last_command=$history[$[HISTCMD-1]]
    last_command_array=("${(s/ /)last_command}") 
    _sep_parts last_command_array
    _complete 
}


_force_rehash() {
  (( CURRENT == 1 )) && rehash
  return 1  # Because we didn't really complete anything
}

zstyle ':completion:::::' completer _force_rehash _complete_plus_last_command_args _approximate 

この機能には必要ありませんが、これが私に適した理由に影響を与える可能性がある追加のzstyle行があります。

zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX + $#SUFFIX) / 3 )) )'
zstyle ':completion:*:descriptions' format "- %d -"
zstyle ':completion:*:corrections' format "- %d - (errors %e})"
zstyle ':completion:*:default' list-prompt '%S%M matches%s'
zstyle ':completion:*' group-name ''
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*' menu select
zstyle ':completion:*' verbose yes

file1.txtそして、andが含まれているディレクトリにあり、file2.txt最後のコマンドがある場合は、echo foo bar baz正確に私が望むようにオートコンプリートが表示されます。

% ls
bar   baz   echo  foo 
- files -
file1.txt   file2.txt 

答え1

デフォルトでは、使用されている完成者のリストに完成者を追加できます。

zstyle ':completion:*' completer _last_command_args _complete

関連情報