Как я могу удалить слово назад в командной строке (bash и zsh)?

118

Как я могу удалить слово назад в командной строке? Я действительно привык к тому, что некоторые редакторы удаляют последнее «слово» с помощью Ctrl+ Backspace, и я хотел бы, чтобы эта функциональность также была в командной строке.

Сейчас я использую Bash, и хотя я могу перейти назад на слово и затем удалить слово вперед, я бы предпочел, чтобы это было быстрой клавишей или событием как Ctrl+ Backspace.

Как это сделать?

lucidquiet
источник

Ответы:

169

ctrlwстандартное слово "убить слово" (иначе werase). ctrluубивает всю линию ( kill).

Вы можете изменить их с помощью 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$

Обратите внимание, что не обязательно помещать фактический управляющий символ в строку, stty понимает, что ^нужно поставить, а затем символ, который вы бы нажали с помощью элемента управления.

После этого, если я нажму, ctrlpоно сотрет слово со строки. И если я нажму ctrla, он сотрет всю строку.

kurtm
источник
Используя sttyкоманду, я попытался назначить слово «kill» Ctrl+BckSpc, набрав, stty weraseа затем Ctrl-v Ctrl-Backspace. Это вставляет буквенный символ Ctrl-Backspace в качестве аргумента для stty werase. К сожалению, Ctrl-Backspaceдля удаления слова не требуется набирать текст, а работает только с Backspaceключом. Поэтому я хотел бы поддержать запрос @terdon, чтобы узнать, как это сделать. Чтобы восстановить значение weraseпо умолчанию, используйте stty werase Ctrl-v Ctrl-w.
Тимоти Мартин
@TimothyMartin Я немного застрял на том, как это сделать ctrl-backspace. Backspace обычно отправляется либо как, либо , так или ctrl-hиначе ctrl-?, так ctrl-backspaceили иначе ctrl-ctrl-backspace. Я пытался выяснить, было ли отправлено что-то другое, но по крайней мере, putty просто отправляет backspace при вводе ctrl-backspace.
Куртм
3
Ctrl + w эффективно удаляет слово, но также копирует в буфер обмена, стирая все, что вы сохранили (или нажимая на него вниз?).
Элайджа Линн
1
esc - удаление только что сработало :-)
Рене Вуллер
1
это ... жизнь меняется. Боже мой.
wired00
27

Вы также можете сделать это с CtrlW.

Другой вариант - установить собственный ярлык, но это будет зависеть от используемого вами эмулятора терминала. Для, xtermи, rxvtвозможно, для других, добавьте эту строку к себе ~/.inputrc(создайте файл, если он не существует):

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

gnome-terminalи похоже, что AltBackspaceпо умолчанию, но, видимо, вам нужно патч readline()для того, чтобы получить CtrlBackspace.

Также см:

Тердон
источник
24

Alt+ Backspaceу меня работает в bash и zsh.

Луис
источник
2
Не работает с iterm :(
Акарш Сатия
5
Например, удаление URL-адреса и Ctrl+Wего использование удаляет весь URL-адрес, в то время как Alt+Backspaceудаляет слово, и прекращает удаление при обнаружении специального символа.
Метафаниэль
И как всегда вы должны ctrl-yдернуть / отменить / вставить.
Пабло А
Это решает это для iterm: github.com/fish-shell/fish-shell/issues/2124
Паскалиус
0

На Mac вы можете использовать:

Fn+Delete

J.Yang
источник
2
Это удаляет 1 символ перед курсором, а не 1 слово позади
Dannid
Не знаю, актуально ли это, но это будет <Alt> + <Backspace> на Mac.
Хасан