Ligações de inserção de texto no zsh

0

Em zsh, como posso ligar (digamos) c-<cr> para inserir &>/dev/null &<cr> no ponto?

Eu uso o urxvt.

    
por Toothrot 04.03.2017 / 10:12

1 resposta

2

Existem dois passos: você precisa que seu emulador de terminal emita uma seqüência de escape distinta para Ctrl + Retornar , e você precisa dizer ao zsh o que fazer quando essa sequência de escape é digitada.

Um aplicativo em um terminal recebe seqüências de bytes, a maioria dos quais forma caracteres imprimíveis ou controlam caracteres . A maioria das teclas de função e dos teclados de chaves precisam ser codificados como sequências de escape que consistem no caractere de escape seguido por alguns caracteres que codificam qual o teclado que foi pressionado. Consulte Como a entrada de teclado e a saída de texto funcionam? para mais fundo. Não há uma seqüência de escape padrão para Ctrl + Retornar , e a maioria dos terminais, incluindo (U) rxvt, simplesmente envia um caractere CR, assim como para um simples Retorno . Então você precisa dizer ao Urxvt para enviar uma sequência de escape diferente. No seu arquivo de recursos X ( ~/.Xresources - carregue com xrdb -merge ~/.Xresources ), adicione

URxvt.keysym.C-Return: 3[27;5;13~

Em zsh, para vincular código personalizado a uma chave, escreva esse código em uma função e declare essa função como um widget zle com zle -N . Dentro do seu widget definido pelo usuário , a variável BUFFER contém o conteúdo da linha que está sendo editada e CURSOR contém a posição do cursor. Para inserir texto ao redor do cursor, também há variáveis mais convenientes: você pode anexar texto a LBUFFER para inseri-lo antes do cursor ou adicionar texto a RBUFFER para inseri-lo após o cursor.

Acho que o que você quer fazer é adicionar texto no final da linha e executar o comando atual. Executar o comando atual não é feito inserindo um caractere CR, que apenas inseria um CR no comando. Chame o widget accept-line (que é vinculado a CR por padrão ) para executar o comando.

accept-line-run-in-background-with-output-hidden () {
  BUFFER+=" &>/dev/null &"
  zle accept-line
}
zle -N accept-line-run-in-background-with-output-hidden
bindkey $'3[27;5;13~' accept-line-run-in-background-with-output-hidden
    
por 04.03.2017 / 17:02