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

В терминологии POSIX имя файла - это имя записи каталога. Он состоит из непустой последовательности байтов, отличной от / или нуля. Термин «компонент имени пути» является синонимом «имени файла». путь - это строка, которая может содержать любой ненулевой байт и указывает способ поиска файла. Путь состоит из серии имён файлов, в которых все, кроме последнего, относятся к каталогу. Разрешение имени пути - это процесс поиска файла по имени пути.

Например, /home/tim/tim.pdf - это путь. Последний компонент этого пути tim.pdf - имя файла; это имя записи в каталоге, путь к которому / home / tim . Имя файла tim само по себе является именем записи. в каталоге, путь к которому / home ; этот файл оказывается каталогом. tim.pdf также является путевым именем: любое имя файла - это путевое имя, которое имеет единственный компонент и обозначает файл с этим именем в текущем каталоге.

/ - это путь к корневому каталогу. . - это имя файла, которое существует в каждом каталоге и относится к самому этому каталогу. . - это путь, который содержит один компонент и относится к текущему каталогу.

Вы можете рассматривать имя файла как указатель в каталоге на индексный дескриптор, который является файлом в этом каталоге. Путь - это указание того, где найти индексный дескриптор. Каждый компонент имени пути - это имя файла, которое указывает на индексный дескриптор в уже достигнутом каталоге (если файл существует). Имена пути начинаются либо с корневого каталога (если это абсолютные пути , начинающиеся с / ]), либо с текущего каталога (если они являются относительными именами пути , не начинаются с / ).

Обратите внимание, что во многих текстах слово «имя файла» (или «имя файла»)используется для обозначения того, что POSIX называет именем пути.

1
13.04.2017, 15:36
2 ответа

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

Затем функция обертывания vim преобразует возвращенные пути в форме ho.st:/fol/der/fi.le в ожидаемую vim форму 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 [@]}");

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

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

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

    _completion_loader scp

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

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

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

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

0
27.01.2020, 23:50

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

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

vi () {
  local params=();
  while [[ ! -z $1 ]]; do
    # test if arg begins a sequence S of characters
    #    - . A-Z a-z 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

Так что я этого не сделал напрямую источник чего-либо еще, кроме того, что имеет отношение к homebrew:

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

Это с доски обсуждений homebrew ...

В любом случае, сейчас это работает очень хорошо ... спасибо!

1
27.01.2020, 23:50

Теги

Похожие вопросы