Функция завершения командной строки Bash для vim и emacs 'scp: //' Удаленные пути к файлам

Чтобы легко указать удаленные файлы для редактирования с помощью vim или emacs из оболочки, я хотел бы иметь завершение табуляции, как доступное для scp .

Завершения для scp работают хорошо и быстро, если ваш .ssh/config настроен правильно .

Так почему бы и нет для vim и других ssh capable редакторов? Я чувствую, стандартный пакет bash-completion может быть полезен из функции завершения, установленной для редакторов, работающих с ssh, которые AFAIK еще не существует публично.

(В средах, где afuse и sshfs , я использую «как обход» на уровне пользователя afuse sshfsafuse -демона, порожденного от оболочки init до локального источника удаленных файловых систем по требованию, в дерево под ~/scp/ .)

Я играл с вашим решением. Вот небольшая версия, которая работает лучше для меня в Mac OSX 10.11 с использованием доморощенного.

Во-первых, в файле rvim_fun.sh, я определяю

 vi () { local params=(); while [[ ! -z $1 ]]; do # test if arg begins a sequence S of characters # - . AZ az 0-9 @ _ # followed by a colon, # if so, we replace S: by scp://S/ to match vim syntax if [[ "$1" =~ ^[-.A-Za-z0-9@_]*:.*$ ]]; then params=("scp://${1/://}" "${params[@]}"); else params+=("$1"); fi; shift; done; echo vi ${params[@]}; $HOME/bin/vi ${params[@]}; } 

Я обнаружил, что это как-то работает лучше для меня (также, у меня есть программа vi, установленная в ~ / bin, которая вызывает MaxVim).

Теперь, на моем Mac, я установил bash-завершение через homebrew. Все, что мне нужно было сделать, это разместить следующее в моем файле .bashrc:

 case "$-" in *i*) source rvim_func.sh complete -F _scp -o nospace vi ;; *) ;; esac 

Поэтому я напрямую не писал ничего другого, кроме того, что нужно делать с доморощенным:

 if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi 

Это из доски объявлений доморощенного …

Во всяком случае, это работает для меня сейчас хорошо … спасибо!

Я взломал что-то, что «злоупотребляет» доступной стандартной _scp завершения _scp bash для включения завершения удаленных хостов / путей / файлов.

Затем функция vim-wrapping управляет возвращенными путями в форме ho.st:/fol/der/fi.le в ожидаемую форму scp://ho.st///fol/der/fi.le .

 vim () { local params=(); while [[ ! -z $1 ]]; do if [[ "$1" =~ ^[a-z0-9-]*:/.*$ ]]; then params=("scp://${1/:\//\/\//}" "${params[@]}"); else params+=("$1"); fi; shift; done; echo vim ${params[@]}; /usr/bin/vim ${params[@]}; } . /usr/share/bash-completion/completions/scp complete -F _scp -o nospace vim 

Для emacs используйте: params=("/scp:$1" "${params[@]}");

Но эта настройка может работать лучше. В настоящее время этот подход имеет следующие незначительные недостатки:

  • Я не могу выполнить tab-complete vim -o ptions . Но я все равно редко их использую.
  • Параметры scp все еще там (но я их никогда не вижу )
  • Работает только для путей scp: //. Но я редко использую других, таких как rsync или http.
  • Последние 2 строки чувствуют себя субоптимальными и оставляют мой env загроможден множеством вспомогательных функций.

    Я попытался использовать это как вторую строчку вместо этого, но это не кажется надежным:

    _completion_loader scp

    Иногда, но не в tmux, появление новой оболочки приводило к тому, что «_completion_loader not found»-Error. Однако запуск _completion_loader _scp приводит к завершению работы без ошибок для этой оболочки.

Это работает достаточно хорошо для меня, так как я могу просто набрать редкий путь -o ption или http:// .

Но я не считаю это хорошим решением / ответом и не соглашусь с этим, потому что я надеюсь, что лучше подойти.

Примечание. Ранее я попробовал использовать модифицированную стандартную функцию _known_hosts_real () , нашел способ ее выполнения для поддержки дополнительных параметров , но затем не смог быстро обернуть это в _vim() , поэтому я просто проигнорировал незначительные неудобства использования _scp() и начал использовать это.