Ligando para trás-kill-word para Ctrl + w

21

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

Consegui migrar todos os meus recursos favoritos, exceto Ctrl + w, que trata espaços e barras como limites de palavras, provavelmente palavras de retrocesso. No Bash, entretanto, readline é excluído até o primeiro espaço, excluindo todas as barras entre.

Eu tentei muitas combinações diferentes de \ C-w: backward-kill-word em ambos .inputrc e .bashrc usando bind, mas não consigo fazê-lo funcionar do jeito que eu quero.

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

Então, eu ligo para o superusuário pedindo ajuda.

    
por Stefan M 18.11.2010 / 21:12

3 respostas

37

readline não liga ao Ctrl - W porque é tratado pelo driver do terminal por padrão:

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

Para desabilitar isso, você precisa executar (em ~/.bashrc ):

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

.inputrc não ajudará aqui, pois ele é lido quando Ctrl - W ainda está atribuído a werase .

Observe também que \C-w format keyseqs deve ser colocado entre aspas duplas, como acima.

Terminais diferentes podem lidar com Alt - Backspace de forma diferente.

  • PuTTY e Terminal GNOME (com configurações padrão) envia 1b 7f ( ESC DEL )
  • Xterm com metaSendsEscape: true envia 1b 08 ( ESC BS ).
  • Xterm sem metaSendsEscape envia 88 ( HTS ou BS com o maior conjunto de bits).

O Xterm tem algumas configurações para controlar o comportamento da tecla Alt (chamada Meta no Xterm e no X11 em geral). Com metaSendsEscape , manter Alt prefixará o pressionamento de tecla com ESC (hex 1b ). Sem a configuração (modo padrão), Alt define o bit mais alto do caractere de entrada, resultando em caracteres especiais. (Por exemplo, Alt - N resulta em ESC n e î , respectivamente.)

Tanto quanto me lembro, o Terminal.app também tem uma configuração semelhante para controlar o comportamento do uso de Meta / Alt / qualquer-Mac.

    
por 18.11.2010 / 21:28
17

Grawity escreveu que isso não pode ser controlado no arquivo .inputrc , mas isso está incorreto.

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

Por exemplo:

set bind-tty-special-chars off
"\C-u": kill-whole-line
"\C-w": backward-kill-word
    
por 24.06.2011 / 00:58
3

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

Por 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 pressões 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/

Veja como é a configuração no iTerm2:

Então,específicoparaPuttyeTerminal, resposta do grawity é ótimo. Mas tendo gasto uma quantidade embaraçosa de tempo procurando como aplicar a configuração no iTerm2, este post de superusuário parece surgir com mais frequência, então pareceu responsável fornecer as informações relevantes como se aplica ao iTerm2 como uma Resposta anexada a esta Questão.

    
por 18.01.2016 / 16:44

Tags