Vinculando-back-kill-word a Ctrl + w

23

Estou tentando mudar do uso prolongado do Tcsh para a exploração recente do Bash.

Eu consegui portar todos os meus recursos favoritos, exceto Ctrl + w, que trata de espaços e barras como limites de palavras, provavelmente a palavra matar para trás. No Bash, no entanto, a linha de leitura exclui todo o caminho até o primeiro espaço, excluindo todas as barras no meio.

Eu tentei muitas combinações diversas de \ Cw: backward-kill-word nos .inputrc e .bashrc usando o bind, mas não consigo fazê-lo funcionar da maneira que desejo.

Engraçado, através do Putty do Windows no trabalho, posso usar Alt + Backspace, que também diz o manual como a ligação padrão, para produzir o comportamento exato que desejo. Mas no Terminal.app nos meus Macs em casa isso não funciona. O mesmo vale para qualquer servidor FreeBSD ou Linux no qual eu esteja logado no Terminal.app.

Por isso, recorro ao superusuário para obter ajuda.

Stefan M
fonte

Respostas:

40

readlinenão liga Ctrl- Wuma vez que é tratado pelo driver do terminal por padrão:

$ stty -a
(...) werase = ^W; (...)

Para desativar isso, você deve executar (in ~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcnão ajudará aqui, pois é lido quando Ctrl- Wainda está atribuído werase.

Observe também que as \C-wkeyseqs de formato devem estar entre aspas duplas, como acima.


Terminais diferentes podem lidar Alt- de maneira Backspacediferente.

  • Terminal PuTTY e GNOME (com configurações padrão) send 1b 7f( ESC DEL)
  • Xterm com metaSendsEscape: trueenvia 1b 08( ESC BS).
  • Xterm sem metaSendsEscape envio 88( HTS, ou BScom o conjunto de bits mais alto).

O Xterm possui algumas configurações para controlar o comportamento da Altchave (chamadas Metano Xterm e no X11 em geral). Com metaSendsEscape, segurando Altirá prefixar o pressionamento de tecla com um ESC(hex 1b). Sem a configuração (modo padrão), Altdefinirá o bit mais alto do caractere de entrada, resultando em caracteres especiais. (Por exemplo, Alt- Nresulta em ESC ne îrespectivamente.)

Tanto quanto me lembro, o Terminal.app também possui uma configuração semelhante para controlar o comportamento do Meta / Alt / qualquer que seja o uso de Macs.

gravidade
fonte
Esta não é apenas a melhor resposta, mas extremamente informativa, obrigado!
Stefan M
1
@shurane: A ação werase "word erase", como normal normal (Backspace), é implementada pelo próprio sistema operacional, no driver "tty device" - observe que eles estão disponíveis mesmo em programas que apenas lêem cegos do stdin, por exemplo cat. Em todos os Unixes, sttyé usado para controlar vários parâmetros tty, incluindo essas teclas especiais. (Veja como UNIX 7ª Ediçãostty parecia.)
grawity
1
@shurane: Enquanto isso, o readline é uma biblioteca de espaço de usuário originalmente escrita para o bash shell (embora agora seja usada por muitos programas). É possível que as outras ações tenham sido implementadas na linha de leitura para evitar inchar o driver tty (que já possuía uma quantidade considerável de sinalizadores e alternâncias, como visto no sttymanual). Além disso, o bash foi originalmente destinado ao sistema operacional GNU e, posteriormente, portado para outros Unixes; é muito mais fácil manter os recursos de edição em uma única biblioteca do que em vários kernels muito diferentes.
grawity
3
@shurane: Tecnicamente, no entanto, todas essas ações, incluindo a exclusão de palavras, são implementadas pela readline - quando ativadas, desabilitam completamente o Backspace e o Ctrl + W pelo driver do terminal. O readline apenas respeita a sttyconfiguração por simplicidade, mas pode ser substituído pelas próprias configurações do readline (como descrito na resposta de Matt Day).
grawity
4
Esta é uma ótima resposta para obter informações, com voto positivo. No entanto, deve-se notar que isso desabilita o Ctrl-w para todos os programas, a menos que eles usem o readline, o que provavelmente não é o que alguém deseja ..., então tente a resposta do @fjarlq.
0fnt
19

O grawity escreveu que isso não pode ser controlado no .inputrcarquivo, mas está incorreto.

Se você estiver set bind-tty-special-chars offno seu .inputrc, poderá personalizar o comportamento dos caracteres especiais do terminal.

Por exemplo:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
fjarlq
fonte
2
E isso tem o benefício de trabalhar para todos os programas que usam o readline - por exemplo python,.
wchargin
3

Para o registro, a resposta que se aplica ao iTerm2 é definir Alt- Backspace(ou Opt ⌥- no Mac) para enviar códigos hexadecimais 0xb1e 0x7fexecutar a backward-kill-wordação que trata caracteres não alfanuméricos como delimitadores.

Para distinção, aqui está o comportamento que estou descrevendo, no qual pressionar Opt ⌥- uma vez muda isso:

echo "/example/filepath/with_non-alpha.characters@blah:meh

para isso:

echo "/example/filepath/with_non-alpha.characters@blah:

E prensas subsequentes de Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

Aqui está a aparência da configuração no iTerm2: insira a descrição da imagem aqui

Portanto, específico para Putty e Terminal, a resposta da grawity é ótima. Mas, depois de passar um tempo embaraçoso procurando como aplicar a configuração no iTerm2, essa postagem de superusuário parece surgir com mais frequência, por isso parecia responsável fornecer as informações relevantes que se aplicam ao iTerm2 como resposta anexada a esta pergunta.

TCAllen07
fonte
Demorei muito tempo para descobrir isso, e esta solução funciona de fato no OS X (com o iTerm2) ao efetuar login em um shell bash remoto. Obrigado!
Martijn