Использование 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
исходный код.