不根据 zsh 中的上下文完成某些内容

不根据 zsh 中的上下文完成某些内容

我使用 zsh 和“新”补全系统 ( compinit)。有时我想将完成限制为可能的子集,以减少歧义。这是用户选择,而不是配置设置:我想按不同的键而不是Tab获得不同的完成集。我不想为该命令配置不同的完成Tab应该还是做正常的事情。

在某些情况下,有一些解决方法。例如,我有一个绑定到 的键_bash_complete-word,在大多数情况下它会完成文件。但有时我想要一个不太常见的焦点。例如:

  • 仅在 后填写主机名scp,而不是本地文件名。
  • 仅在 后填写远程名称git checkout,而不是分支名称。

如何绑定一个键,该键将在 后完成远程名称git checkout,但不完成分支名称?更一般地说,如何绑定一个键来完成与当前上下文中通常完成的事情不同的事情?

答案1

下面的代码片段会导致Meta+r在 git 命令行上完成 git 远程名称,并在其他地方完成主机名。

_complete-remotes () {
  case $words[1] in
    git) load_helper_functions _git; __git_remotes;;
    *) _hosts;;
  esac
}
compdef -k _complete-remotes complete-word '^[r'
  • 我可以在另一个 ZSH 完成文件中使用辅助函数吗为了load_helper_functions。如果您从上面的代码中删除它,则只有git在当前 zsh 会话中之前至少执行过一次完成时,它才会起作用。
  • $words[1]是要完成的带有参数的命令的第一个单词。
  • complete -k …将函数注册_complete-remotes为完成小部件(允许它运行完成内置函数)并将其绑定到Meta+ r

相关内容