Como posso excluir uma palavra para trás na linha de comando (bash e zsh)?

118

Como posso excluir uma palavra para trás na linha de comando? Estou realmente acostumado a alguns editores que excluem a última 'palavra' usando Ctrl+ Backspace, e também gostaria dessa funcionalidade na linha de comando.

Estou usando o Bash no momento e, embora eu pudesse pular uma palavra para trás e excluí-la, prefiro tê-la como tecla rápida ou como evento Ctrl+ Backspace.

Como conseguir isso?

lucidquiet
fonte

Respostas:

169

ctrlwé o padrão "matar palavra" (aka werase). ctrlumata a linha inteira ( kill).

Você pode alterá-los com stty.

-bash-4.2$ stty -a
speed 38400 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc -xcase
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
        -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
        eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;
-bash-4.2$ stty werase ^p
-bash-4.2$ stty kill ^a
-bash-4.2$

Observe que não é necessário colocar o caractere de controle real na linha, stty entende colocar ^e, em seguida, o caractere que você acertaria com o controle.

Depois de fazer isso, se eu pressionar ctrlp, apagará uma palavra da linha. E se eu acertar ctrla, isso apagará toda a linha.

Kurtm
fonte
Usando o sttycomando, tentei atribuir a palavra "kill word" Ctrl+BckSpcdigitando stty weraseseguido de Ctrl-v Ctrl-Backspace. Isso insere o caractere literal Ctrl-Backspace como argumento para stty werase. Infelizmente, não é necessário digitar Ctrl-Backspacepara excluir a palavra, mas funciona apenas com a Backspacetecla. Por isso, gostaria de confirmar o pedido do @terdon para aprender como fazer isso. Para redefinir o werasepadrão, use stty werase Ctrl-v Ctrl-w.
Timothy Martin
@ TimothyMartin Estou um pouco preso em como fazer ctrl-backspace. O backspace geralmente é enviado como um ctrl-hou outro ctrl-?, de ctrl-backspacealguma forma seria ctrl-ctrl-backspace. Eu tentei descobrir se algo diferente foi enviado, mas a massa de vidraceiro, pelo menos, apenas envia backspace quando você digita ctrl-backspace.
kurtm
3
ctrl + w exclui efetivamente a palavra, mas também copia para a área de transferência, apagando tudo o que você armazenou (ou pressionando-o?).
Elias Lynn
11
esc - delete apenas funcionou :-)
Rene Wooller 23/11
11
isso ... está mudando a vida. meu Deus.
Wired00 17/05/19
27

Você também pode fazer isso com CtrlW.

Outra opção é definir seu próprio atalho, mas isso dependerá do emulador de terminal que você está usando. Para xterme rxvte talvez outros, adicione esta linha ao seu ~/.inputrc(crie o arquivo se ele não existir):

## rxvt, xterm
"\b":backward-kill-word

gnome-terminale sua aparência parece ter AltBackspacepor padrão, mas aparentemente exige que você faça o patch readline()para obter CtrlBackspace.

Veja também:

terdon
fonte
24

Alt+ Backspacefunciona para mim no bash e zsh.

Luis
fonte
2
Não funciona com iterm :(
Akarsh Satija
5
Por exemplo, excluir um URL e usá- Ctrl+Wlo exclui o URL inteiro enquanto Alt+Backspaceexclui uma palavra e para de excluir quando um caractere especial é encontrado.
Metafaniel 24/08
E como sempre, você ctrl-ydeve puxar / desfazer / colar.
Pablo A
Isso resolve o problema da iterm: github.com/fish-shell/fish-shell/issues/2124
Pascalius em
0

No Mac, você pode usar:

Fn+Delete

J.Yang
fonte
2
Isso exclui 1 caractere na frente do cursor, não uma palavra atrás
Dannid 14/10
Não sei se isso ainda é relevante, mas seria <Alt> + <Backspace> no Mac.
Hassan