使用zsh的compdef或compctl为所有命令用_hosts完成某个目录

时间:2012-08-31 12:23:20

标签: zsh fuse sshfs zsh-completion

我使用afsh通过sshfs将其他主机自动挂载到我的本地文件系统。像这样:

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

这很好用,但我希望能够使用〜/ remote目录自动完成/ TAB命令。 Zsh可以理解地认为〜/ remote是空的,因为afuse是一个神奇的虚拟FUSE文件系统。一旦我手动键入主机,子目录就可以正常工作。 E.g~ / remote / host / [TAB]工作正常。

大多数zsh compdef教程都专注于为自定义命令构建自定义完成符。这不是我想要的。

我一直在尝试使用compdef将特定目录的完成覆盖到我的hosts文件(使用内置的_hosts完成函数),但据我所知,compdef基于每个命令工作。我希望我的完成者能够处理所有试图在该目录上执行正常文件/目录完成的命令。

感觉就像它是如此基本,它是一个单行,如果我知道如何。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

将以下内容添加到您的~.zshrc文件中(或将其粘贴到命令行中进行尝试):

autoload -Uz compinit && compinit
bindkey '^I' complete-word
zstyle -e ':completion:*' fake-files '
  [[ $PWD/$PREFIX$SUFFIX == $HOME/remote/ ]] && ISUFFIX="/"
  reply=( $HOME/remote:${(j: :v)${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} )'

我尝试过了,而且行得通。我从_host's source code开始进行了长时间的参数扩展。