Ctrl-Backspace e Ctrl-Delete no bash

11

Colocando no Debian 8.3

stty werase '^H'

ou no Arch Linux 2/2016

stty werase '^?'

em .bashrc (por exemplo) faz com que Ctrl - Retroceda apague a última palavra no terminal. Ainda não é o mesmo comportamento que em aplicações GUI modernas (por exemplo, Firefox): Apaga a última palavra espaço em branco , e não a última palavra separada por espaços em branco ou caracteres como . : , ; " ' & / ( ) .

É possível fazer com que Ctrl - Backspace se comporte no terminal de forma similar aos aplicativos GUI modernos? Além disso, existe alguma maneira de fazer Ctrl - Apagar apagar a palavra imediatamente antes do cursor?

    
por wolf-revo-cats 21.02.2016 / 17:20

3 respostas

15

Existem dois editores de linha em jogo aqui: o editor de linha básico fornecido pelo kernel (editor de linha canônico do modo tty) e o editor de linha do bash (implementado através da biblioteca readline). Ambos têm um comando de apagar para a palavra anterior que é ligado a Ctrl + W por padrão. A chave pode ser configurada para o editor de linha tty do modo canônico através de stty werase ; o bash imita a ligação de chave que encontra na configuração tty, a menos que seja sobrescrito em sua própria configuração.

A ação werase no editor de linha tty não pode ser configurada. Ele sempre apaga (ASCII) palavras delimitadas por espaços em branco. É raro interagir com o editor de linha tty - é o que você obtém, por ex. quando você digita cat sem argumento. Se você quiser criar combinações de teclas especiais, poderá executar o comando sob uma ferramenta como rlwrap que usa readline.

O Bash fornece dois comandos para excluir a palavra anterior : unix-word-rubout ( Ctrl + w ou conforme definido através de stty werase ), e backward-kill-word ( M-DEL , ie Esc Backspace ) que trata uma palavra como uma seqüência de caracteres alfanuméricos na localidade atual e _ . Se você quiser Ctrl + Backspace para apagar a seqüência anterior de caracteres alfanuméricos, não defina stty werase e, em vez disso, coloque a seguinte linha no seu .inputrc :

"\C-h": backward-kill-word

Note que isso pressupõe que seu terminal envia o caractere Ctrl + H para Ctrl + Backspace . Infelizmente é uma daquelas chaves sem ligação padrão (e Backspace em especial é uma bagunça por razões históricas.

Há também um comando simétrico kill-word que está vinculado a M-d ( Alt + D ) por padrão. Para ligá-lo a Ctrl + Excluir , primeiro você precisa descobrir qual seqüência de escape seu terminal envia e, em seguida, adicionar uma linha correspondente em seu .inputrc . Digite Ctrl + V e depois em Ctrl + Apagar ; isso irá inserir algo como ^[[3;5~ , onde o ^[ inicial é uma representação visual do caractere de escape. Então a ligação é

"\e[3;5~": kill-word

Se você não estiver satisfeito com a definição de uma palavra, forneça a sua própria no bash: consulte comportamento confuso de atalhos de estilo no estilo emacs no bash

    
por 22.02.2016 / 00:34
2

O comportamento do caractere WERASE no processamento do terminal de modo cozido é codificado , pelo menos no Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

As palavras são letras, dígitos e sublinhado. Esta é a maneira como será em todos os momentos em um terminal no Linux quando um aplicativo que faz seu próprio processamento em modo cozido não está em execução.

A versão readline (usada por bash e outros) parece ser um pouco diferente da versão do kernel, mas também parece ser codificado :

Words are composed of letters and digits.

Mas isso não parece coincidir com o que bash realmente faz por mim: foo+bar^W apaga tudo, não apenas bar . Há mais informações sobre os aqui .

    
por 21.02.2016 / 19:36
1

Tente

alt + retrocesso

No sistema operacional elementar, ele funciona da maneira que você quer (assim como ctrl + backspace )

    
por 13.04.2018 / 22:17