【问题标题】:Using zsh's compdef or compctl to complete a certain directory with _hosts for all commands使用 zsh 的 compdef 或 compctl 完成某个目录,并为所有命令使用 _hosts
【发布时间】:2012-08-26 06:28:55
【问题描述】:

我使用 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 是基于每个命令的。我希望我的完成者处理所有试图在该目录上执行正常文件/目录完成的命令。

感觉它是如此基本,它是一个单线,如果我知道怎么做的话。我该怎么做?

【问题讨论】:

    标签: zsh fuse sshfs zsh-completion


    【解决方案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's source code中获取了长参数扩展。

    【讨论】:

    • 很好的答案!我想知道@Gurgeh 是否觉得它有用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多