Mudando para um diretório encontrado em algum lugar na hierarquia da árvore

0

Eu freqüentemente me encontro digitando:

cd a/directory/I/use/a/lot

e dentro desse diretório há muitas pastas que eu cd para trás e para frente.

Existe um plugin oh-my-zsh que permite digitar como:

cd somd<TAB>

E, em seguida, o autocomplete com uma lista de diretórios cujo nome contém a string somed e que são alcançáveis no diretório atual? Por exemplo, dada a estrutura de diretórios

somedirX
foo/bar/somedirY
baz/somedirZ/bum

Digitar cd somed<TAB> deve retornar esta lista de conclusão

somedirX
somedirY
somedirZ

Ainda não consegui encontrar nada.

    
por Damian Nadales 02.11.2017 / 11:23

1 resposta

0

Primeiro, você precisa definir uma função para a conclusão assim:

_children_dirs() {
    find . -type d -name "${words[CURRENT]}*" -printf "%P\n" \
        | while read -r line; do
      compadd -U -X "Subdirectories: " "$line"
    done
    compstate[insert]=menu # no expand
}

Esta função pode agora ser usada como um complemento para cd com:

compdef _children_dirs cd

No entanto, não acho que seja uma boa ideia usar o último comando. De fato, tente fazer isso a partir do seu diretório home e você irá congelar seu shell por um tempo ( Ctrl + c para parar). Uma solução melhor seria atribuir uma sequência de chaves a essa conclusão e usá-la somente quando for necessária e segura:

zstyle ':completion:children-dirs:*' completer _children_dirs
zle -C children-dirs menu-complete _generic
bindkey '^Y' children-dirs

Com isso, Ctrl + y acionará a conclusão de children_dirs .

Existe outra solução que acho melhor, se você estiver pronto para usar outro comando.

function ccd { cd $1 }
compdef _children_dirs ccd

Este bloco define um novo comando ccd que usa _ \ children_dirs_ como completer (assim acionado com TAB).

Você pode personalizar o filtro de nomes em encontrar para procurar o padrão em qualquer lugar no nome do arquivo com: "*${words[CURRENT]}*" .

Edit: Eu criei um plugin para zsh com isso.

    
por 20.12.2017 / 23:44