Использование compdef или compctl zsh для заполнения определенного каталога _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 работает для каждой команды. Я хочу, чтобы мой завершитель работал над всеми командами, пытающимися выполнить обычное завершение файла/каталога в этом каталоге.

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


person Gurgeh    schedule 31.08.2012    source источник


Ответы (1)


Добавьте следующее в файл ~.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. .

person Marlon Richert    schedule 30.06.2020