Comment puis-je supprimer un mot en arrière sur la ligne de commande (bash et zsh)?

118

Comment puis-je supprimer un mot en arrière sur la ligne de commande? Je suis vraiment habitué à ce que certains éditeurs suppriment le dernier "mot" en utilisant Ctrl+ Backspace, et j'aimerais aussi cette fonctionnalité sur la ligne de commande.

J'utilise Bash pour le moment et bien que je puisse revenir en arrière d'un mot puis supprimer un mot en avant, je préférerais qu'il s'agisse d'une touche rapide ou d'un événement en tant que Ctrl+ Backspace.

Comment peut-on accomplir cela?

lucidquiet
la source

Réponses:

169

ctrlwest le "mot mort" standard (aka werase). ctrlutue la ligne entière ( kill).

Vous pouvez les changer avec 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$

Notez qu'il n'est pas nécessaire de mettre le caractère de contrôle sur la ligne, stty comprend le fait de mettre ^et ensuite le personnage que vous voulez toucher avec contrôle.

Après cela, si je frappe ctrlp, un mot de la ligne sera effacé. Et si je frappe ctrla, cela effacera toute la ligne.

Kurtm
la source
À l'aide de la sttycommande, j'ai tenté d'assigner le "mot mort" à l' Ctrl+BckSpcaide d'une frappe stty werasesuivie de Ctrl-v Ctrl-Retour arrière. Ceci insère le caractère littéral Ctrl-Backspace comme argument pour stty werase. Malheureusement, il n'est pas nécessaire de taper Ctrl-Backspacepour supprimer le mot mais fonctionne uniquement avec la Backspaceclé. Je voudrais donc appuyer la demande de @terdon pour savoir comment faire cela. Pour rétablir les valeurs werasepar défaut, utilisez stty werase Ctrl-v Ctrl-w.
Timothy Martin
@ TimothyMartin Je suis un peu coincé sur la façon de faire ctrl-backspace. Le retour arrière est généralement envoyé comme l'un ctrl-hou l' autre ctrl-?, comme le ctrl-backspaceserait d'une manière ou d'une autre ctrl-ctrl-backspace. J'ai essayé de savoir si quelque chose de différent avait été envoyé, mais mastic, au moins, envoie simplement un retour arrière lorsque vous tapez ctrl-backspace.
Kurtm
3
ctrl + w supprime effectivement le mot mais le copie également dans le presse-papiers, effaçant tout ce que vous aviez stocké (ou le poussant vers le bas?).
Elijah Lynn
1
esc - delete vient de travailler :-)
Rene Wooller
1
ça ... la vie change. mon Dieu.
wired00
27

Vous pouvez aussi le faire avec CtrlW.

Une autre option consiste à définir votre propre raccourci, mais cela dépend de l'émulateur de terminal que vous utilisez. Pour xtermet rxvtet peut-être d’autres, ajoutez cette ligne à votre ~/.inputrc(créez le fichier s’il n’existe pas):

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

gnome-terminalet son genre semblent avoir AltBackspacepar défaut, mais apparemment vous obliger à patcher readline()pour obtenir CtrlBackspace.

Regarde aussi:

terdon
la source
24

Alt+ Backspacetravaille pour moi en bash et zsh.

Luis
la source
2
Ne fonctionne pas avec iterm :(
Akarsh Satija
5
Par exemple, la suppression d'une URL et son utilisation Ctrl+Wsuppriment l'intégralité de l'URL tout en Alt+Backspacesupprimant un mot. La suppression est interrompue lorsqu'un caractère spécial est trouvé.
Métafaniel
Et comme toujours, vous devez ctrl-ytirer / annuler / coller.
Pablo Un
Cela résout le problème: github.com/fish-shell/fish-shell/issues/2124
Pascalius
0

Sur Mac, vous pouvez utiliser:

Fn+Delete

J.Yang
la source
2
Cela supprime 1 caractère devant le curseur, pas 1 mot derrière
Dannid
Je ne sais pas si cela est toujours pertinent, mais ce serait <Alt> + <Retour arrière> sur Mac.
Hassan