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

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

Existe bashalguma maneira de expandir um caminho relativo para um caminho absoluto, talvez com conclusão de tabulação?

Eu pergunto porque às vezes eu procuro um arquivo, encontro e depois vimele:

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

Então farei outras coisas e mudarei os diretórios:

cd /tmp
ls
cd ~
ls

Então descobrirei que preciso editar o mesmo arquivo novamente, mas não é possível usar history, (ou pesquisa no 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, pegarei 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

Ressalvas

Isso ainda requer copiar e colar. Acredito que deveria haver uma maneira mais fácil de obter o caminho completo de um arquivo em meu histórico. Que opções eu tenho?

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

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

e pegue:

ls bash.bashrc bash_completion bash_completion.d

Então, existe uma maneira de expandir um caminho relativo em um caminho absoluto, para poder salvar operações em um arquivo no meu histórico com o caminho completo desse arquivo?

Responder1

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

O que faço é digitar $PWDantes do nome do arquivo e pressionar Tabpara expandi-lo. Talvez bashseja necessário pressionar Ctrl+ Alt+ eem vez de Tab.

por exemplo

vi $PWD/000-default

então

Ctrl+ Alt+e

então

Enter

Responder2

Você poderia usar o preenchimento 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 000TAB, ele será substituído 000por /path/to/000-default.

Explicação
A maneira como isso funciona é complete -F _vim_complete_file vimdizer ao bash para usar a função _vim_complete_filesempre que você pressionar TABum argumento para vim.
A função então é executada compgen -A filena 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 realpathgerar o caminho totalmente qualificado. Esta lista é armazenada como uma matriz na COMPREPLYqual o shell procura as conclusões disponíveis.

Responder3

Você pode querer começar a usar pushd e popd para que seja mais fácil voltar para um diretório anterior:http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack

Eu vi seu comentário sobre cdargs(que presumo seresse). Para diretórios que uso com frequência, uso um alias ou função. Por exemplo

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

ou

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

A segunda forma é útil se houver umpaidiretório onde os subdiretórios são frequentes, então docs foome leva para /path/to/apache/docroot/foo. A desvantagem é que você perde o preenchimento da guia, mas não tem sido tão árduo para mim.

Responder4

Se você estiver reeditando no Vim, confira :browse oldfilese :help oldfiles.

informação relacionada