Как можно расширить относительный путь в командной строке с помощью автодополнения клавишей Tab?

Как можно расширить относительный путь в командной строке с помощью автодополнения клавишей Tab?

Есть 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 000TAB, он заменится 000на /path/to/000-default.

Объяснение
Это работает так, что complete -F _vim_complete_file vimbash указывает использовать функцию _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.

Связанный контент