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