
Existe bash
alguma 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 vim
ele:
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 $PWD
antes do nome do arquivo e pressionar Tabpara expandi-lo. Talvez bash
seja 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 000
TAB, ele será substituído 000
por /path/to/000-default
.
Explicação
A maneira como isso funciona é complete -F _vim_complete_file vim
dizer ao bash para usar a função _vim_complete_file
sempre que você pressionar TABum argumento para vim
.
A função então é executada 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
gerar o caminho totalmente qualificado. Esta lista é armazenada como uma matriz na COMPREPLY
qual 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 foo
me 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 oldfiles
e :help oldfiles
.