¿Cómo puedo expandir una ruta relativa en la línea de comando, completando con tabulación?

¿Cómo puedo expandir una ruta relativa en la línea de comando, completando con tabulación?

¿ bashHay alguna forma de expandir una ruta relativa a una ruta absoluta, tal vez completando con tabulación?

Lo pregunto porque a veces busco un archivo, lo encuentro y luego vim:

cd /etc
cd apache2
cd sites-available
vim 000-default

Luego haré algunas otras cosas y cambiaré directorios:

cd /tmp
ls
cd ~
ls

Luego encontraré que necesito editar el mismo archivo nuevamente, pero no es posible usar history(o buscar en el historial), porque la ruta del archivo es relativa.

Solución alternativa actual

Si sé que voy a reutilizar un archivo con frecuencia, después de encontrarlo, tomaré la ruta completa usando algo como realpath:

$ realpath 000-default
/etc/apache2/sites-available/000-default
(copy and paste path into next command:)
$ vi /etc/apache2/sites-available/000-default

Advertencias

Esto todavía requiere copiar y pegar. Creo que debería haber una manera más sencilla de obtener la ruta completa de un archivo en mi historial. ¿Que opciones tengo?

Creo que (accidentalmente) presioné alguna combinación de teclas antes de expandir una ruta relativa a una ruta completa. Sé que en bash puedes escribir:

cd /etc
ls bash_*(control+x *)

y obten:

ls bash.bashrc bash_completion bash_completion.d

Entonces, ¿hay alguna manera de expandir una ruta relativa a una ruta absoluta, de modo que pueda guardar operaciones en un archivo en mi historial con la ruta completa de ese archivo?

Respuesta1

No puedo encontrar una buena manera de hacerlo.

Lo que hago es escribir $PWDantes del nombre del archivo y luego presionar Tabpara expandirlo. Es bashposible que tengas que presionar Ctrl+ Alt+ een lugar de Tab.

p.ej

vi $PWD/000-default

entonces

Ctrl+ Alt+e

entonces

Enter

Respuesta2

Podrías usar la finalización de tabulación programable dentro de bash para esto:

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

Ahora, si escribe vim 000TAB, se reemplazará 000con /path/to/000-default.

Explicación
La forma en que esto funciona es que complete -F _vim_complete_file vimle dice a bash que use la función _vim_complete_filecada vez que presiona TABun argumento para vim.
Luego, la función se ejecuta compgen -A fileen la palabra actual en la que se encontraba el cursor cuando presionó TAB. Esto devuelve una lista de archivos que coinciden.
Luego se pasa esa lista de archivos a realpathla que se genera la ruta completa. Esta lista se almacena como una matriz en COMPREPLYla que el shell busca las terminaciones disponibles.

Respuesta3

Es posible que desees comenzar a usar pushd y popd para que sea más fácil volver a un directorio anterior:http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack

Vi tu comentario sobre cdargs(que supongo que eseste). Para los directorios que uso con frecuencia, uso un alias o función. Por ejemplo

alias cgi='pushd /path/to/apache/cgi-bin'

o

docs() { pushd /path/to/apache/docroot/"$1"; }

La segunda forma es útil si hay unpadredirectorio donde los subdirectorios son frecuentes, luego docs foome lleva a /path/to/apache/docroot/foo. La desventaja es que pierdes la finalización de pestañas, pero a mí no ha sido tan arduo.

Respuesta4

Si está reeditando en Vim, consulte :browse oldfilesy :help oldfiles.

información relacionada