使用zsh的compdef或compctl为所有命令完成特定目录,该目录具有名为_hosts的前缀。

6

我使用afuse和sshfs将其他主机挂载到本地文件系统。操作如下:

afuse -o timeout=30 -o mount_template=sshfs -C %r:/ %m -o unmount_template=fusermount -u -z %m ~/remote/

这个方法很好用,但我希望能够使用~/remote目录来自动补全/TAB命令。由于afuse是一个神奇的虚拟FUSE文件系统,因此Zsh理所当然地认为~/remote是空的。一旦我手动输入了主机名,子目录就可以正常工作了。例如,~/remote/host/[TAB]可以正常工作。
大多数zsh compdef教程都专注于为自定义命令构建自定义补全器。这不完全是我想要的。
我一直在试图使用compdef来覆盖特定目录的补全器以使用我的hosts文件(使用内置的_hosts补全函数)。但据我所知,compdef是基于每个命令的。我希望我的补全器对所有尝试在该目录上进行普通文件/目录完成的命令都能起作用。
感觉这非常基础,只需要一行代码,只要我知道怎么做。我该如何做到这一点?
1个回答

1
将以下内容添加到您的~.zshrc文件中(或将其粘贴到命令行中以尝试):
autoload -Uz compinit && compinit
bindkey '^I' complete-word
zstyle -e ':completion:*' fake-files _fake_files
_fake_files() {
  [[ $PWD/$PREFIX$SUFFIX == ~/remote/ ]] && 
      ISUFFIX=/
  reply=( 
      ~/remote:${(j: :v)${(s: :)${(ps:\t:)${${(f)~~"$(
        < /etc/hosts
      )"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
  )
}

我尝试了这个方法,它有效。我从_host源代码中获取了长参数扩展。

很棒的答案!我想知道@Gurgeh是否觉得它有用? - MEMark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接