在 zsh tab 补全中使用冒号作为文件名分隔符

在 zsh tab 补全中使用冒号作为文件名分隔符

我有许多程序将文件名参数作为一个(或多个)

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

是否可以在一些关键字后面加上冒号后使 zsh 完成文件名?

在 bash 中,您可以通过添加:COMP_WORDBREAKS 变量来完成此操作。


感谢吉尔斯,我才得以这样工作。

$ 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

相关内容