
Есть bash
ли способ преобразовать относительный путь в абсолютный, возможно, с помощью автодополнения клавишей Tab?
Я спрашиваю, потому что иногда я ищу файл, нахожу его, а затем vim
он:
cd /etc
cd apache2
cd sites-available
vim 000-default
Затем я сделаю еще кое-что и поменяю каталоги:
cd /tmp
ls
cd ~
ls
Затем я обнаруживаю, что мне нужно снова отредактировать тот же файл, но использовать , (или поиск по истории) невозможно history
, поскольку путь к файлу относительный.
Текущее решение
Если я знаю, что буду часто использовать файл, то после его нахождения я получаю полный путь к нему, используя что-то вроде realpath
:
$ realpath 000-default
/etc/apache2/sites-available/000-default
(copy and paste path into next command:)
$ vi /etc/apache2/sites-available/000-default
Предостережения
Это все еще требует копирования и вставки. Я считаю, что должен быть более простой способ получить полный путь к файлу в моей истории. Какие у меня есть варианты?
Я полагаю, что я (случайно) нажал какую-то комбинацию клавиш, которая расширила относительный путь до полного. Я знаю, что в bash можно ввести:
cd /etc
ls bash_*(control+x *)
и получить:
ls bash.bashrc bash_completion bash_completion.d
Так есть ли способ преобразовать относительный путь в абсолютный, чтобы можно было сохранять операции с файлом в истории с полным путем к этому файлу?
решение1
Я не могу найти хорошего способа это сделать.
Что я делаю, так это печатаю $PWD
перед именем файла, затем нажимаю, Tabчтобы развернуть его. bash
Возможно, вам придется нажать Ctrl+ Alt+ eвместо Tab.
например
vi $PWD/000-default
затем
Ctrl+ Alt+e
затем
Enter
решение2
Для этого можно использовать программируемое автодополнение в bash:
function _vim_complete_file() {
IFS=$'\n' read -d '' -a FILES <<< "$( compgen -A file "${COMP_WORDS[$COMP_CWORD]}" )"
IFS=$'\n' read -d '' -a COMPREPLY <<< "$( realpath "${FILES[@]}" )"
}
complete -F _vim_complete_file vim
Теперь, если вы введете vim 000
TAB, он заменится 000
на /path/to/000-default
.
Объяснение
Это работает так, что complete -F _vim_complete_file vim
bash указывает использовать функцию _vim_complete_file
всякий раз, когда вы нажимаете TABна аргумент vim
.
Затем функция запускается compgen -A file
на текущем слове, на котором был курсор, когда вы нажали TAB. Это возвращает список файлов, соответствующих ему.
Затем этот список файлов передается, realpath
и генерируется полностью определенный путь. Этот список хранится в виде массива, в COMPREPLY
котором оболочка ищет доступные дополнения.
решение3
Возможно, вы захотите начать использовать pushd и popd, чтобы было проще вернуться в предыдущий каталог:http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack
Я видел ваш комментарий о cdargs
(который, как я предполагаю,этот). Для каталогов, которые я часто использую, я использую псевдоним или функцию. Например
alias cgi='pushd /path/to/apache/cgi-bin'
или
docs() { pushd /path/to/apache/docroot/"$1"; }
Вторая форма полезна, если естьродителькаталог, в котором часто встречаются подкаталоги, затем docs foo
переносит меня в /path/to/apache/docroot/foo
. Недостаток в том, что вы теряете автодополнение по табуляции, но для меня это не было таким уж трудным.
решение4
Если вы редактируете в Vim, проверьте :browse oldfiles
и :help oldfiles
.