zsh タブ補完でファイル名区切り記号としてコロンを使用する

zsh タブ補完でファイル名区切り記号としてコロンを使用する

ファイル名引数を1つ(またはそれ以上)として使用するいくつかのプログラムがあります。

path/to/file
scp:path/to/file.ext
ark:/abs/path/to/file.ext

いくつかのキーワードの後に​​コロンを追加した後にzshフルファイル名を作成できますか?

Bashでは、:COMP_WORDBREAKS変数を追加してこれを実行できます。


Gillesのおかげでこのように働くことができました。

$ cat ~/.zshrc
...
function aftercolon() {
  if compset -P 1 '*:'; then
    _files "$expl[@]"
  else
    _files "$expl[@]"
  fi
}

autoload -Uz compinit
compinit
compdef aftercolon hello olleh

これでコマンドが実行され、hello完了olleh後:期待どおりに機能します。

私は次の理由でより良い方法があるかもしれないと思います。

  1. このコマンドはプレフィックスのないファイル名も使用するため、奇妙なif / else句があります。

  2. この種のパラメータを使用するコマンドが多いため、各コマンドの名前を追加する必要があります。可能であれば、すべての命令に適用したいと思います。より簡単な場合は、すべてのコマンドにそれを適用できます。

-

必要な方のためにもう少し簡単な方法を見つけました。 .zshrc ファイルに以下を挿入します。

function aftercolon() {
  compset -P '*:'                   # strip stuff up to last :
  compset -S ':*'                   # strip stuff after next colon
  _default -r '\-\n\t /:' "$@"      # do default completion on this
}

compdef aftercolon cmd1 cmd2 cmd3 cmd4 
# to apply to all commands
compdef aftercolon -first-  # https://superuser.com/questions/1080452/add-strings-to-zsh-tab-completion-for-all-commands-and-arguments


ベストアンサー1

これは古い投稿ですが、要約すると、.zshrcにあります。

function aftercolon() {
  compset -P '*:'                   # strip stuff up to last :
  compset -S ':*'                   # strip stuff after next colon
  _default -r '\-\n\t /:' "$@"      # do default completion on this
}
compdef aftercolon -first-

これで、zshのコロンの後にファイル名を完成させることができます。

$ scp:/path/to/somef<TAB>  # now filename completion works after colon

おすすめ記事