Як я можу видалити слово назад у командному рядку (bash та zsh)?


118

Як я можу видалити слово назад у командному рядку? Я справді звик до того, що деякі редактори видаляють останнє "слово" за допомогою Ctrl+ Backspace, і мені хотілося б, щоб ця функціональність була і в командному рядку.

На даний момент я використовую Bash, і хоча я можу стрибнути слово назад, а потім видалити слово вперед, я вважаю за краще це клавіша швидкої клавіші або подія як Ctrl+ Backspace.

Як це можна досягти?

Відповіді:


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, це стерне весь рядок.


Використовуючи sttyкоманду, я спробував призначити слово "вбити слово" 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. Резервна область зазвичай надсилається як ctrl-hабо ctrl-?, так ctrl-backspaceби якось було ctrl-ctrl-backspace. Я намагався з'ясувати, чи було надіслано щось інше, але, як мінімум, шпаклівка просто надсилає зворотний простір під час введення ctrl-backspace.
куртм

3
ctrl + w ефективно видаляє слово, але воно також копіює в буфер обміну, видаляючи все, що ви зберегли (чи натискаючи на нього?).
Ілля Лінн

1
esc - видалити щойно працював :-)
Рене Вуллер

1
що ... змінюється життя. Боже мій.
провідний00

27

Ви також можете це зробити за допомогою CtrlW.

Інший варіант - встановити власний ярлик, але це залежатиме від емулятора терміналу, який ви використовуєте. Для xtermта, rxvtа може й інших, додайте цей рядок до свого ~/.inputrc(створіть файл, якщо його не існує):

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

gnome-terminalі його ilk, здається, мають AltBackspaceза замовчуванням, але, мабуть, вимагають, щоб ви виконали виправлення readline(), щоб отримати CtrlBackspace.

Також дивіться:


24

Alt+ Backspaceпрацює для мене в bash і zsh.


2
Не працює з iterm :(
Akarsh Satija

5
Наприклад, вилучаючи URL-адресу та використовуючи Ctrl+Wїї, вона видаляє всю URL-адресу, Alt+Backspaceвидаляючи слово, і зупиняє видалення, коли знайдеться спеціальний символ.
Метафаніел

І, як завжди, вам доведеться ctrl-yдбати / скасовувати / вставляти.
Пабло А

Це вирішує це для iterm: github.com/fish-shell/fish-shell/isissue/2124
Паскалій

-2

На Mac можна використовувати:

Fn+Delete


2
Це видаляє 1 символ перед курсором, а не 1 слово позаду
Даннід

Не знаю, чи це все ще актуально, але це буде <Alt> + <Backspace> на Mac.
Хасан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.