Zsh: como completar automaticamente depois de um comando?

0

todos. É um pouco difícil explicar o que quero fazer.

Eu quero criar um script 'exemplo', que pode inserir comandos longos para você depois de executá-lo com parâmetros curtos. Por exemplo,

$ example server # I input this line manually
$ ssh [email protected] # This line is automatically generated by the above command

Para que eu possa editar a linha de comando na linha atual.

Estou usando o shell ZSH . E eu tentei algo como history mas falhei no final. Alguma sugestão?

    
por Libin Wen 01.03.2014 / 06:04

2 respostas

1

Eu acho que não é possível (ou pelo menos muito hackish) rodar um script externo, de modo que qualquer coisa seja colocada no prompt para edição adicional

Dito isto, é possível estender o zle (editor de linha de comando do zsh) com suas próprias funções, os chamados widgets.

Qualquer widget definido pelo usuário tem acesso a BUFFER , que contém o buffer de edição e também pode ser modificado.

Aqui um pequeno protótipo:

function example () {
    if [[ $BUFFER = 'server' ]]; then
        LBUFFER='ssh [email protected] '
    else
        zle accept-line
    fi
}

zle -N example
bindkey '^M' example

zle -N example cria um novo widget chamado example e o mapeia para a função com o mesmo nome. bindkey '^M' example maps Controle + M , também conhecido como Retorna , para o widget example . Então toda vez que você simplesmente digitar "servidor" e pressionar Retornar ele será substituído por ssh [email protected] e o cursor será colocado no final para edição posterior, enquanto qualquer outra linha será executada / aceita como é. / p>     

por 03.03.2014 / 07:46
1

Em vez de usar uma função de shell, você também pode usar um atalho de teclado. Por exemplo, assim:

bindkey -s '\C-e\C-l' 'ssh [email protected]'

Aqui -s cria uma substituição de string, veja man zshzle :

-s in-string out-string ... Bind each in-string to each out-string. When in-string is typed, out-string will be pushed back and treated as input to the line editor. When -R is also used, interpret the in-strings as ranges.

Com o exemplo acima, você pode usar CTRL + E , CTRL + L na inserção ssh [email protected] na linha de comando na posição atual do cursor.

Isso tem a vantagem de poder usar esse atalho facilmente para construir um canal, por exemplo

cat foo | CTRL+E,CTRL+L  =>  cat foo | ssh [email protected]
    
por 04.03.2014 / 18:38