Você pode usar a conclusão de guias. Por padrão, em muitas distribuições do Linux, o bash é configurado para que, quando você apertar a tecla [TAB], você receba uma lista de possíveis correspondências, ou se houver apenas uma correspondência, tudo estará preenchido. Para cd, esta é normalmente uma lista de subdiretórios do diretório de trabalho atual. Você pode sobrescrever isso, mas sugiro que crie um alias, como jd
para "diretório de salto":
alias jd=cd
e, em seguida, definindo os "marcadores" desejados como conclusões para o jd. Olhe para a página man bash para muito mais opções (incluindo a geração automática dos resultados em tempo real a partir de um comando ou função), mas a maneira mais fácil é apenas uma lista de palavras, com -W
:
complete -W "/ srv / www ~ / tmp ~ / work" jd
Agora, digite jd
e pressione [TAB], e você verá seus "favoritos". Digite qualquer parte ambígua e, em seguida, pressione [TAB] para concluir. (Acima, o ~
s expande para meu diretório home, então o primeiro [TAB] me dá um /
, e se eu atingir w
e [TAB] novamente, /srv/www
é preenchido.)
Claro, coloque isso em ~/.bash_profile
para persistir.
Ou podemos levar isso para o próximo nível. Crie um diretório ~/.shortcuts
- começando com um ponto, ele estará oculto e não bagunce seu diretório inicial limpo e limpo - e preencha com links simbólicos para os diretórios desejados. Em seguida, coloque este no seu ~ / .bash_profile:
_list_shortcuts()
{
COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd
Isso define uma conclusão um pouco mais complicada no fuction _list_shortcuts
para criar a lista de nomes e torna jd
uma função em vez de um simples alias, pois queremos que ela aja de maneira diferente de apenas cd
. O -P
flag para cd
faz com que ele resolva os links simbólicos, então tudo se torna uma mágica transparente. Seus nomes de atalhos nem precisam corresponder aos alvos.
Então:
$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm 8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work
E, para uma dose extra de fantasia, faça com que jd
liste todos os seus atalhos quando executado sem nenhum parâmetro:
jd()
{
if [[ -z "$1" ]]; then
(cd ~/.shortcuts; stat -c '%N' *)
else
cd -P ~/.shortcuts/$1
fi
}
Nota: eu uso compgen -W $( cmd )
em vez de compgen -C 'cmd'
porque o último nunca funciona para mim e eu não entendo o porquê. Essa pode ser uma nova questão minha. :)