Bind Ctrl- \ in inputrc?

3

Eu tenho andado por aí com isso e não consigo fazer funcionar. O uso de Ctrl + V no terminal gera corretamente ^\ para esta combinação, portanto deve ser reconhecível.

Como eu tenho Ctrl + \ ligado ao suspend-frame no emacs, eu gostaria de poder voltar rapidamente para o primeiro plano com outra pressão de Ctrl + \ .

Acredito que essa é a única combinação viável:

"\C-\": "fg\n"

Se eu pressionar Enter depois de Ctrl + V para esta combinação, recebo a seguinte saída, que pode ser útil:

bash: $'4': command not found
    
por Zhro 06.08.2015 / 02:29

1 resposta

5

Ctrl + \ é um dos caracteres de controle que faz com que o terminal envie um sinal (SIGQUIT), como Ctrl + C (SIGINT) e Ctrl + Z (SIGTSTP). Você pode executar stty -a para mostrar quais caracteres têm um significado especial para o terminal; consulte Limpar / apague uma senha invisível digitada incorretamente em um shell / terminal no Linux para obter mais detalhes. O resultado é que quando você pressiona Ctrl + \ , o bash não vê um caractere em sua entrada padrão, ele vê um sinal e isso não passa pelo mecanismos de ligação de teclas.

Você pode desativar o significado do caractere no terminal com o comando stty quit undef . Se você fizer isso, o bash verá o caractere como entrada e sua ligação de chave entrará em vigor.

Para organizar Ctrl + \ para ser uma ligação bash, mas tenha sua ligação de terminal normal ao executar um comando, altere as configurações do terminal before e depois de executar um comando.

preexec () {
  stty quit '^\'
}
precmd () {
  stty quit undef
}

preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command='HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"';
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
PROMPT_COMMAND='precmd'

Em vez de criar o tipo de chave fg e uma nova linha, ligue a chave a um comando shell. Você não pode fazer isso de .inputrc , que se aplica a todos os aplicativos readline, não apenas para bash. Em vez disso, defina uma ligação de bash no seu .bashrc :

bind -x '"\C-\": "fg"'
    
por 06.08.2015 / 02:48