Ctrl-Backspace e Ctrl-Delete no bash

14

Colocando o Debian 8.3

stty werase '^H'

ou no Arch Linux 2/2016

stty werase '^?'

in .bashrc(por exemplo) make Ctrl- Backspaceexclui a última palavra no terminal. Ainda não é o mesmo comportamento como em aplicações GUI modernos (eg Firefox): Apaga o último espaço em branco palavra -separated, e não a última palavra separados por espaços ou caracteres como . : , ; " ' & / ( ).

É possível fazer Ctrl- Backspacese comportar no semelhante terminal para aplicações GUI modernos? Além disso, existe alguma maneira de fazer Ctrl- Deleteexcluir a palavra imediatamente antes do cursor?

lobo-revo-gatos
fonte
1
Seu shell pode suportar essas ações, que podem ser vinculadas a uma determinada chave.
Thomas Dickey
@ ThomasDickey: Estou usando o bash. Tudo bem se funcionar apenas no bash.
wolf-revo-cats

Respostas:

27

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

A weraseação no editor de linhas tty não pode ser configurada. Ele sempre apaga (ASCII) palavras delimitadas por espaços em branco. É raro interagir com o editor de linhas tty - é o que você obtém, por exemplo, quando digita catsem argumento. Se você quiser teclas fantasia lá, você pode executar o comando em uma ferramenta como rlwrap que usa readline.

O Bash fornece dois comandos para excluir a palavra anterior : unix-word-rubout( Ctrl+ wou conforme definido stty werase) e backward-kill-word( M-DEL, ie Esc Backspace), que trata uma palavra como uma sequência de caracteres alfanuméricos no código de idioma atual e_ . Se você deseja Ctrl+ Backspaceapagar a sequência anterior de caracteres alfanuméricos, não defina stty werasee, em vez disso, coloque a seguinte linha no seu .inputrc:

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

Note que este assume que o seu terminal envia o caráter Ctrl + H para Ctrl+ Backspace. Infelizmente, é uma daquelas chaves sem ligação padrão (e, Backspaceem particular, é uma bagunça por razões históricas).

Há também um comando simétrico kill-wordque é vinculado a M-d( Alt+ D) por padrão. Para vinculá-lo ao Ctrl+ Delete, primeiro você precisa descobrir qual sequência de escape o seu terminal envia e, em seguida, adicionar uma linha correspondente no seu .inputrc. Digite Ctrl+ Ve Ctrl+ Delete; isso irá inserir algo como ^[[3;5~onde a 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, poderá fornecer o seu próprio no bash: veja um comportamento confuso das combinações de teclas no estilo emacs no bash

Gilles 'SO- parar de ser mau'
fonte
2
excelente explicação! O Ctrl+Delfuncionou bem. No entanto, não consigo Ctrl+Backspacetrabalhar. Para o Ctrl+v, Ctrl+Backspacemeu terminal diz ^?. O que devo colocar no .inputrc? Obrigado
Ciprian Tomoiagă
3
@CiprianTomoiaga "\C-?": backward-kill-wordou qualquer outra função de linha de leitura desejada. Mas você só pode definir uma ligação para Ctrl + Backspace diferente da ligação para Backspace se eles enviarem caracteres diferentes. Se o seu terminal enviar ^?para Backspace e Ctrl + Backspace, o aplicativo em execução no terminal não terá como distingui-los. Alguns terminais podem ser configurados (por exemplo, xterm, urxvt), outros (por exemplo, emuladores de terminal baseados em VTE) não podem.
Gilles 'SO- stop be evil'
4
é importante observar que a definição ~/.inputrcdesativa o padrão /etc/inputrc. para corrigir isso, você deve incluir esse arquivo: $include /etc/inputrc(a partir daqui )
Ciprian Tomoiagă
+1 para Esc + Backspace
Celal Ergün
6

Experimentar

alt+backspace

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

Ahmed Elkoussy
fonte
1

O comportamento do caractere WERASE no processamento do terminal no 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;
           }

Portanto, as palavras são letras, dígitos e sublinhado. É assim que acontece o tempo todo em um terminal no Linux quando um aplicativo que executa seu próprio processamento no modo de cozimento não está em execução.

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

As palavras são compostas de letras e dígitos.

Mas isso não parece coincidir com o que bashrealmente faz para mim: foo+bar^Wapaga tudo, não apenas bar. Há mais informações sobre isso aqui .

Celada
fonte
1. O usuário vi provavelmente está apenas procurando backward-kill-word(ligação padrão M-DEL) em vez de unix-word-rubout.
Gilles 'SO- stop be evil'