Sou relativamente novato no Linux: trabalhei com o shell bash por um bom tempo por meio de uma instalação do Ubuntu no WSL2 em uma máquina Windows 11 e recentemente tomei a iniciativa de mudar para o Linux 100%. Minha pergunta é sobre como alterar diretórios (especificamente navegar até um diretório) usando o terminal e usando o recurso de preenchimento automático de guias.
Anteriormente, quando eu estava navegando no Ubuntu, eu conseguia digitar cd ..
na linha de comando e pressionar tab que completaria o comando para ser cd ../
. Eu poderia jurar que quando criei minha nova instalação (Kali Linux) consegui fazer a mesma coisa. Mas agora, quando tento fazer isso (digite cd ..
e pressione tab para obter o preenchimento automático e alterá-lo para cd ../
), é isso que vejo:
Para referência, aqui está a saída do neofetch no meu sistema:
OS: Kali GNU/Linux Rolling x86_64
Host: NH50_70RA
Kernel: 6.8.11-amd64
Uptime: 1 day, 1 hour, 16 mins
Packages: 3900 (dpkg)
Shell: zsh 5.9
Resolution: 1080x1920, 1920x1080
DE: Plasma 5.27.10
WM: KWin
Theme: [Plasma], Breeze [GTK2/3]
Icons: [Plasma], Vivid-Dark-Icons [GTK2/3]
Terminal: gnome-terminal
CPU: Intel i7-9750H (12) @ 4.500GHz
GPU: Intel CoffeeLake-H GT2 [UHD Graphics 630]
GPU: NVIDIA GeForce GTX 1650 Mobile / Max-Q
Memory: 6228MiB / 31813MiB
Sinto que o comportamento diferente se deve ao uso do bash no Ubuntu e do zsh na minha configuração atual. Encontrei esta documentação sobre diferentes opções de configuração dentro do .zshrc e examinei-a, mas não consegui encontrar nada que se destacasse no que eu poderia fazer para obter o comportamento desejado. Acho que isso se deve ao fato de eu não ter entendido totalmente a documentação, e não de a solução não estar lá.
Desculpe antecipadamente se não postei as informações corretas necessárias ou se não postei o suficiente para solucionar isso de maneira eficaz. Esta é a primeira vez que posto uma pergunta sobre Linux (bem, na verdade a segunda. Postei esta pergunta no Superuser StackExchange , mas não recebi nenhum insight lá, então pensei em postar aqui).
Se alguém me ajudar a descobrir qual é a melhor solução para obter esse comportamento desejado, eu agradeceria muito. Idealmente, eu gostaria de poder digitar cd ..
no prompt de comando e pressionar tab
para que ele seja preenchido automaticamente cd ../
, então, se eu digitar imediatamente ..
e pressionar tab
novamente, ele será preenchido automaticamente para ../
resultar cd ../../
no prompt de comando e assim por diante, o que em este exemplo, se eu pressionasse, enter
levaria dois diretórios do diretório atual com o único comando de cd ../../
ter sido formado e executado.
Já vi respostas onde outros criaram algo como uma função a ser armazenada no arquivo .zshrc
(ou .bashrc
para bash) que poderia ser chamada para navegar por uma certa quantidade de diretórios de uma só vez, passando um número para a função quando chamada, ou seja: a função tem um nome semelhante cdu
a Change Directory Up e entrar cdu 2
no prompt de comando e pressionar enter
navegaria automaticamente para cima dois diretórios do diretório atual. Esta é uma maneira inteligente de realizar a mesma coisa, mas eu realmente gostaria de poder "encadear" manualmente quantas instâncias pressionando ../
e ..
imediatamente tab
depois para ver dinamicamente o comando crescer até que eu pressione enter
para executar o comando e navegue até tantos diretórios. Eu provavelmente poderia criar uma função própria que me permitisse fazer o que quero, mas sinto que deve haver uma maneira mais simples, como uma configuração que preciso configurar da maneira certa para que isso aconteça.
Desde já, obrigado!
O cerne da questão aqui é que
.
e..
nunca são expandidos por globs e nunca são oferecidos como conclusão de nome de arquivo (embora veja aspecial-dirs
zstyle
resposta de Gilles ), pois geralmente não seria útil (e até mesmo prejudicial; vários outros shells (incluindo bash para globs) agora também estão seguindo esse caminho).Portanto, em
cd ..
Tab, porque..
não está na lista de conclusões válidas, não é concluído e/
não é adicionado.Aqui, você poderia, no entanto, fazer:
Para
..
(ouanything/..
) ser aceito mesmo assim em completaçõescd
sem a necessidade de adicioná-lo como uma conclusão possível (use:completion::complete:*
para que ele se aplique a outros comandos).Mas uma abordagem possivelmente melhor poderia ser a descrita em minha resposta a Como posso usar o alias `...` para `../..` no Bash? onde
.
está vinculado a um widget personalizado que faz com que cada um.
adicionado depois..
ouwhatever/..
se transforme em../..
ouwhatever/../..
então você só precisa pressionar .em sequência e não ..Tabcom sua abordagem.Se estiver no
emacs
modo,..
seguido por Alt+ 4, .faz isso,../../../../..
por exemplo (/..
anexado 4 vezes) usando o tratamento usual de prefixo NUMERIC .Veja também minha resposta à Função para avançar um diretório, se possível? para outra abordagem (ainda mais rápida, embora limitada a
cd
) de navegação para cima e para baixo na árvore de diretórios.Por padrão,
.
e..
não são oferecidos como complementos, porque não são muito úteis: você pode pressionar /em vez de Tab. Para.
, é mais trabalhoso usar a conclusão porque é ambíguo. No entanto, for..
, Tabé menos trabalhoso se.
não for ambíguo.Você pode incluir
..
conclusões definindo ospecial-dirs
estilo em..
seu arquivo.zshrc
.Se você também quiser tratar
.
como uma possível conclusão, defina-o comotrue
: