В терминологии POSIX имя файла - это имя записи каталога. Он состоит из непустой последовательности байтов, отличной от /
или нуля. Термин «компонент имени пути» является синонимом «имени файла». путь - это строка, которая может содержать любой ненулевой байт и указывает способ поиска файла. Путь состоит из серии имён файлов, в которых все, кроме последнего, относятся к каталогу. Разрешение имени пути - это процесс поиска файла по имени пути.
Например, /home/tim/tim.pdf
- это путь. Последний компонент этого пути tim.pdf
- имя файла; это имя записи в каталоге, путь к которому / home / tim
. Имя файла tim
само по себе является именем записи.
в каталоге, путь к которому / home
; этот файл оказывается каталогом. tim.pdf
также является путевым именем: любое имя файла - это путевое имя, которое имеет единственный компонент и обозначает файл с этим именем в текущем каталоге.
/
- это путь к корневому каталогу. .
- это имя файла, которое существует в каждом каталоге и относится к самому этому каталогу. .
- это путь, который содержит один компонент и относится к текущему каталогу.
Вы можете рассматривать имя файла как указатель в каталоге на индексный дескриптор, который является файлом в этом каталоге. Путь - это указание того, где найти индексный дескриптор. Каждый компонент имени пути - это имя файла, которое указывает на индексный дескриптор в уже достигнутом каталоге (если файл существует). Имена пути начинаются либо с корневого каталога (если это абсолютные пути , начинающиеся с /
]), либо с текущего каталога (если они являются относительными именами пути , не начинаются с /
).
Обратите внимание, что во многих текстах слово «имя файла» (или «имя файла»)используется для обозначения того, что POSIX называет именем пути.
Я взломал кое-что, что "неправильно использует" доступную стандартную _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 [@]}");
Но эта настройка могла бы работать лучше.В настоящее время этот подход имеет следующие незначительные недостатки:
-o ptions
с помощью табуляции. Но я все равно редко ими пользуюсь. scp
все еще там (но я никогда не видел их) Последние 2 строки кажутся неоптимальными и оставляют мою среду загроможденной множеством вспомогательных функций.
Я попытался использовать это в качестве второй последней строки, но это не кажется надежным:
_completion_loader scp
Иногда, но не в tmux, создание новой оболочки приводило к ошибке «_completion_loader not found». Однако выполнение _completion_loader _scp
приводит к завершению работы без ошибок для этой оболочки.
У меня это работает достаточно хорошо, так как я могу просто ввести редкий путь -o ption
или http: //
.
Но я не считаю это хорошим решением / ответом и не принимаю его, потому что надеюсь, что появится лучший вариант.
Примечание: ранее я пробовал просто использовать модифицированную стандартную функцию _known_hosts_real () , нашел способ исправлять ее во время выполнения для поддержки дополнительных параметров , но потом не смог быстро оберните это в _vim ()
, поэтому я просто проигнорировал незначительные неудобства использования _scp ()
и начал использовать это.
Я поэкспериментировал с вашим решением. Вот немного измененная версия, которая лучше работает для меня на 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 ...
В любом случае, сейчас это работает очень хорошо ... спасибо!