6

wordコマンドラインの一連の文字の後の任意の位置でファイル補完を機能させる方法を見つけようとしています。シェルにリストされているように、これらの文字は次のようになります[ =+-\'\"()](空白はタブとスペースです)。Zsh はこれを行いますが、バッククォート文字 '`' または$(. mksh は、文字の後を除いてこれを行います[+-]

コマンド ラインの単語位置とは、スペースとその他のいくつかの文字で区切られた、入力する文字の各セットのことです。例えば、

print Hello World

1 ~ 3wordsの位置に 3 つあります。1 番目の位置では、最初に何かを入力しているときに、補完はほぼ完璧です。ファイル補完は、私が言及したすべての文字の後に機能します。最初wordの の後、補完システムはスマートであるため、より制限されます。これはコマンドには便利ですが、ファイル補完を実行できる場所を制限することは特に役に立ちません。

ファイル補完が機能しないが、私の意見では機能する必要がある場所の例を次に示します。

: ${a:=/...}

echo "${a:-/...}"

make LDFLAGS+='-nostdlib /.../crt1.o /.../crti.o ...'

env a=/... b=/... ...

'^I'Zsh に付属しているいくつかの異なる補完ウィジェットを使用して (タブ) を再バインドし、zstyle ':completion:*'行を変更する方法を調べました。これまでのところ、このデフォルトの Zsh の動作を変更するものは何もありません。最後の手段として、行の最後に追加できる補完関数を作成する必要があると考えていますzstyle ':completion:*' completer ...

補完関数では、1 つのルートは、現在補完したいものを切り取ってword補完し、可能であれば補完を行に再挿入することです。また、通常のコマンド補完が機能するように、2 番目を 1番目に_precommandシフトするようにすることもできます。wordword

任意の位置_precommandでコマンドを完了できるように変更できました。wordこれが新しいファイルです。名前を付けて_commando、そのディレクトリを fpath に追加しました。

#compdef -                                                              

# precommands is made local in _main_complete
precommands+=($words[1,$(( CURRENT -1 ))])

shift words
CURRENT=1

_normal

それを使用するため':completion:*' completer ...に、zshrc の行末に追加したので、すべてのプログラムで動作し$pathます。基本的wordに、入力しているものは最初の と見なされるため、コマンドラインのすべての位置wordでコマンド補完が機能します。word

ファイル補完のために同じことを行う方法を見つけようとしていますが、一見するともう少し複雑に見えます。どこに行けばいいのかわからないので、これについて何か助けを求めています。

4

1 に答える 1