Adicione argumentos ao completar um nome de comando

1

Estou procurando uma maneira de expandir algumas strings predefinidas no terminal quando a guia (ou outra combinação de teclas) é pressionada. Isso é diferente da conclusão da tabulação. Meu terminal já se expande para o meu diretório pessoal (não consigo me lembrar de como descobri, mas tenho certeza de que esse é apenas um caso especial do que estou procurando).

Exemplos:

Suponha que você digite cdd e pressione tab, ele será expandido para cd /your/home/folder/Downloads/ e o cursor será posicionado no final da linha. Assim, você pode digitar o nome de uma pasta dentro da pasta Downloads e executar o comando. Um exemplo melhor seria expandir sshu para ssh |@a-pre-defined-host.foo e colocar o cursor atrás do sinal @ para digitar o nome de usuário.

O é semelhante ao recurso de expansão de snippets de código em muitos IDEs. Por favor, não diga que eu posso conseguir a mesma coisa através de funções bash com parâmetros escritos em .bashrc file.

Qual é o objetivo?

Então, qual é o ponto de usar tal coisa em comparação com uma chamada de função? Bem, ao contrário de muitos de vocês, não tenho uma boa memória. Mesmo para os comandos que uso com frequência, não consigo lembrar os detalhes, como os parâmetros. Eu costumo procurar na web por coisas como "como publicar um arquivo json usando curl?". Bem, eu posso criar uma função que aceite um nome de arquivo, um nome de host, um nome de porta e provavelmente alguns outros parâmetros e faça o POST. Mas lembrar os parâmetros e a ordem deles não é mais simples do que lembrar o comando inteiro. Com a expansão do snippet, só preciso lembrar o nome do snippet, algo como snppost , ou talvez eu nem precise lembrar o nome do snippet. Eu posso digitar snp e pressionar tab para obter uma lista de trechos, encontrar o que estou procurando. Pressione a guia novamente para expandir o snippet. E eu tenho o comando que estava procurando sem pesquisar na web e copiar / colar. Eu posso fazer qualquer personalização que eu goste no comando e executá-lo.

    
por Helium 06.04.2014 / 12:33

2 respostas

1

Isso não será tão fácil quanto você deseja. A conclusão programável não é capaz de substituir comandos. E você tem que terminar (isto é, arrastar o espaço em branco) a palavra de comando antes que a conclusão programável seja ativada.

Isso significa que você deve criar um alias ou função para cdd , que o substitui por cd . Isso não deve ser um problema (exceto para nomes de diretório contendo nova linha ...). O resto pode ser feito assim:

_cdd () { IFS=$'\n'; if [ 1 -eq "$COMP_CWORD" -a 0 -eq "${#COMP_WORDS[1]}" ]; 
then COMPREPLY=("/your/home/folder/Downloads/"); 
else COMPREPLY=($(compgen -A directory "${COMP_WORDS[1]}"));fi; }

complete -o filenames -F _cdd cdd

colocando o cursor dentro de uma palavra

Eu não acho que seja uma boa ideia. Mas com isso em mente: É possível mover o cursor para trás, mas não consegui trabalhar na conclusão programável:

back_seq=$'\e[D'
output=""; for((i=0;i<5;i++)); do output+="$back_seq"; done
echo -n 123456789"$output"; sleep 5
    
por 06.04.2014 / 15:14
0

Você pode encontrar algo que possa usar nas funções READLINE.

Veja LESS='+/shell-expand-line' man bash para começar.

shell-expand-line pode não ser o melhor para seus objetivos, mas é definido por padrão (supondo que você tenha as opções de shell padrão, ou seja, echo $SHELLOPTS contém :emacs: ).

Algumas outras possibilidades podem ser vistas executando bind -p | grep expand . Qualquer uma dessas funções "expandir" fará alguma forma do que você está pedindo.

Basicamente, você configurará um alias:

alias cdd='cd /your/home/folder/Downloads/'

... no seu .bashrc , e quando você quiser expandi-lo, digite cdd<Esc><C-e> e ele será expandido. Isso está usando o já definido shell-expand-line como mencionado acima - ele expande aliases e expansão de histórico, bem como variáveis. (Tente digitar l.; echo $SHELLOPTS; !! e pressionando <Esc><C-e> .)

Você pode vincular outras funções, como simplesmente alias-expand-line , que podem servir melhor aos seus objetivos.

    
por 15.03.2016 / 18:39