6

我使用 afuse 通过 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 文件系统。一旦我手动键入主机,子目录就可以正常工作。例如 ~/remote/host/[TAB] 工作正常。

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

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

感觉就像它是如此基本,它是一个单线,只要我知道如何。我怎样才能做到这一点?

4

1 回答 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源代码中获取了长参数扩展。

于 2020-06-30T12:55:53.497 回答