Использование zsh compdef или compctl для заполнения определенного каталога с _hosts для всех команд

Я использую afuse для автоматического монтирования других хостов в мою локальную файловую систему с помощью sshfs. Вот так:

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

Это прекрасно работает, но я бы хотел иметь возможность автозаполнения команд /TAB, используя мой ~/remote каталог. Понятно, что Zsh считает ~/remote пустым, поскольку afuse - это волшебная виртуальная файловая система FUSE. После того, как я набрал хост вручную, подкаталоги работают нормально. Например, ~/remote/host/[TAB] работает нормально.

Большинство обучающих программ по zsh compdef фокусируются на создании собственного завершителя для вашей пользовательской команды. Это не совсем то, что я хочу.

Я пытался использовать compdef, чтобы переопределить завершение этого конкретного каталога в моем файле hosts (используя встроенную функцию завершения _hosts), но, насколько я понимаю, compdef работает для каждой отдельной команды. Я хочу, чтобы мой завершитель работал со всеми командами, пытаясь выполнить обычное завершение файла / каталога в этом каталоге.

Такое ощущение, что это настолько просто, что это однострочник, если бы я только знал, как. Как я могу это сделать?

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исходный код.

Другие вопросы по тегам