¿Cómo puedo eliminar una palabra hacia atrás en la línea de comando (bash y zsh)?

118

¿Cómo puedo eliminar una palabra hacia atrás en la línea de comando? Estoy realmente acostumbrado a que algunos editores eliminen la última 'palabra' usando Ctrl+ Backspace, y también me gustaría esa funcionalidad en la línea de comando.

Estoy usando Bash en este momento y, aunque podría saltar hacia atrás una palabra y luego eliminarla, prefiero tener esto como una tecla rápida o evento como Ctrl+ Backspace.

¿Cómo puede lograr esto?

lucidquiet
fuente

Respuestas:

169

ctrlwes la "palabra de matar" estándar (aka werase). ctrlumata toda la línea ( kill).

Puedes cambiarlos con 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$

Tenga en cuenta que uno no tiene que poner el personaje de control real en la línea, stty entiende poner ^y luego el personaje que golpearía con control.

Después de hacer esto, si lo golpeo ctrlpborrará una palabra de la línea. Y si golpeo ctrla, borrará toda la línea.

kurtm
fuente
Usando el sttycomando intenté asignar la "palabra de matar" Ctrl+BckSpcescribiendo stty weraseseguido de Ctrl-v Ctrl-Retroceso. Esto inserta el carácter literal Ctrl-Retroceso como argumento para stty werase. Desafortunadamente, no requiere escribir Ctrl-Backspacepara eliminar la palabra, pero funciona solo con la Backspaceclave. Así que me gustaría respaldar la solicitud de @terdon para aprender cómo hacer esto. Para restablecer el werasevalor predeterminado, use stty werase Ctrl-v Ctrl-w.
Timothy Martin
@TimothyMartin Estoy un poco atascado en cómo hacerlo ctrl-backspace. La tecla de retroceso generalmente se envía como ctrl-ho ctrl-?, o lo ctrl-backspacesería de alguna manera ctrl-ctrl-backspace. Intenté averiguar si se envió algo diferente, pero la masilla, al menos, solo envía retroceso cuando escribe ctrl-backspace.
kurtm
3
ctrl + w elimina efectivamente la palabra pero también copia al portapapeles, borrando todo lo que había almacenado (¿o empujándolo hacia abajo?).
Elijah Lynn
1
esc - eliminar acaba de funcionar :-)
Rene Wooller
1
eso ... te está cambiando la vida. Dios mío.
wired00
27

También puedes hacer esto con CtrlW.

Otra opción es establecer su propio acceso directo, pero esto dependerá del emulador de terminal que esté utilizando. Para xtermy rxvtquizás otros, agregue esta línea a su ~/.inputrc(cree el archivo si no existe):

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

gnome-terminaly parece que tiene AltBackspacepor defecto, pero aparentemente requiere que parches readline()para obtenerlo CtrlBackspace.

Ver también:

terdon
fuente
24

Alt+ Backspacefunciona para mí en bash y zsh.

Luis
fuente
2
No funciona con iterm :(
Akarsh Satija
55
Por ejemplo, eliminar una URL y usarla Ctrl+Welimina toda la URL mientras Alt+Backspaceelimina una palabra y deja de eliminar cuando se encuentra un carácter especial.
Metafaniel
Y como siempre , tienes ctrl-yque tirar / deshacer / pegar.
Pablo A
Esto lo resuelve por iterm: github.com/fish-shell/fish-shell/issues/2124
Pascalius
0

En Mac, puedes usar:

Fn+Delete

J.Yang
fuente
2
Eso elimina 1 carácter delante del cursor, no 1 palabra detrás
Dannid
No sé si esto sigue siendo relevante, pero sería <Alt> + <Backspace> en Mac.
Hassan