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?
bash
terminal
keyboard-shortcuts
line-editor
lobo-revo-gatos
fonte
fonte
Respostas:
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
werase
açã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 digitacat
sem 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 definidostty werase
) ebackward-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 definastty werase
e, em vez disso, coloque a seguinte linha no seu.inputrc
: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-word
que é vinculado aM-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 é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
fonte
Ctrl+Del
funcionou bem. No entanto, não consigoCtrl+Backspace
trabalhar. Para oCtrl+v, Ctrl+Backspace
meu terminal diz^?
. O que devo colocar no.inputrc
? Obrigado"\C-?": backward-kill-word
ou 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.~/.inputrc
desativa o padrão/etc/inputrc
. para corrigir isso, você deve incluir esse arquivo:$include /etc/inputrc
(a partir daqui )Experimentar
alt+backspace
No sistema operacional elementar, ele funciona da maneira que você deseja (assim como ctrl+ backspace)
fonte
O comportamento do caractere WERASE no processamento do terminal no modo cozido é codificado , pelo menos no Linux:
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 :
Mas isso não parece coincidir com o que
bash
realmente faz para mim:foo+bar^W
apaga tudo, não apenasbar
. Há mais informações sobre isso aqui .fonte
backward-kill-word
(ligação padrãoM-DEL
) em vez deunix-word-rubout
.