Como posso expandir um caminho relativo na linha de comando, com a conclusão da tabulação?

5

Em bash existe alguma maneira de expandir um caminho relativo em um caminho absoluto, talvez com a conclusão da tabulação?

Eu pergunto porque às vezes eu procurarei por um arquivo, encontro-o, então vim it:

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

Depois, farei algumas outras coisas e alterarei os diretórios:

cd /tmp
ls
cd ~
ls

Então, vou descobrir que preciso editar o mesmo arquivo novamente, mas não é possível usar history (ou pesquisa de histórico), porque o caminho do arquivo é relativo.

Solução alternativa atual

Se eu sei que vou reutilizar muito um arquivo, depois de encontrá-lo, vou pegar o caminho completo 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

Advertências

Isso ainda requer copiar e colar. Eu acredito que deve haver uma maneira mais fácil de obter o caminho completo de um arquivo para o meu histórico. Quais opções eu tenho?

Acredito que eu (acidentalmente) pressionei alguma combinação de teclas antes que ela expandisse um caminho relativo para um caminho completo. Eu sei que na bash você pode digitar:

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

e obtenha:

ls bash.bashrc bash_completion bash_completion.d

Existe uma maneira de expandir um caminho relativo para um caminho absoluto, para que eu possa salvar as operações em um arquivo no meu histórico com o caminho completo desse arquivo?

    
por cwd 16.04.2012 / 17:49

3 respostas

4

Não consigo encontrar uma boa maneira de fazer isso.

O que eu faço é digitar $PWD antes do nome do arquivo, então pressione Tab para expandi-lo. Em bash você pode precisar pressionar Ctrl + Alt + e ao invés de Tab .

por exemplo,

vi $PWD/000-default

então

Ctrl + Alt + e

então

Digite

    
por 17.04.2012 / 01:10
2

Você pode querer começar a usar o pushd e o popd para facilitar o retorno a um diretório anterior: link

Eu vi seu comentário sobre cdargs (que eu assumo é this ). Para diretórios que eu uso com freqüência, eu uso um alias ou função. Por exemplo

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

ou

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

O segundo formulário é útil se houver um diretório parent em que os subdiretórios são frequentes, então docs foo me leva a /path/to/apache/docroot/foo . A desvantagem é que você perde a conclusão da tabulação, mas não foi tão difícil para mim.

    
por 16.04.2012 / 20:38
2

Você pode usar a conclusão de tabulação programável no bash para isso:

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

Agora, se você digitar vim 000 TAB , ele substituirá 000 por /path/to/000-default .

Explicação
A maneira como isso funciona é que complete -F _vim_complete_file vim diz ao bash para usar a função _vim_complete_file sempre que você pressionar TAB em um argumento para vim .
A função executa compgen -A file na palavra atual em que o cursor estava quando você pressionou TAB. Isso retorna uma lista de arquivos correspondentes. Essa lista de arquivos é então passada para realpath , que gera o caminho completo. Essa lista é armazenada como uma matriz em COMPREPLY , que o shell procura pelas conclusões disponíveis.

    
por 16.04.2012 / 21:49