Вопрос или проблема
Как я могу удалить слово назад в командной строке? Я привык к тому, что некоторые редакторы удаляют последнее ‘слово’ с помощью Ctrl+Backspace, и я хотел бы иметь такую функциональность в командной строке тоже.
В данный момент я использую Bash, и хотя я могу прыгнуть назад на слово и затем удалить слово вперед, я бы предпочел, чтобы это была быстрая клавиша или даже Ctrl+Backspace.
Как этого добиться?
Ctrl+W – это стандартная комбинация “удалить слово” (иначе werase
).
Ctrl+U удаляет всю строку (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
понимает ввод ^
и затем символа, который вы бы нажали с control.
После этого, если я нажму Ctrl+P, будет стерто слово из строки. И если я нажму Ctrl+A, будет стерта вся строка.
Alt+Backspace работает у меня в bash и zsh.
Вы также можете сделать это с помощью CtrlW.
Другой вариант – установить собственную горячую клавишу, но это будет зависеть от используемого эмулятора терминала. Для xterm
и rxvt
и, возможно, других добавьте эту строку в ваш ~/.inputrc
(создайте файл, если он не существует):
## rxvt, xterm
"\b":backward-kill-word
gnome-terminal
и другие по умолчанию поддерживают AltBackspace, но по-видимому, требуют патча readline()
, чтобы заработал CtrlBackspace.
Также смотрите:
В Ubuntu 18.04.4 нажатие Ctrl+V, а затем Ctrl+Backspace показывает, что комбинация Ctrl+Backspace записывается как ^H
.
Вы можете показать все текущие комбинации клавиш терминала, используя stty -a
. В этом случае мы хотим изменить werase
на ^H
, что можно сделать с помощью
stty werase ^H
Для любой другой клавиши, которую вы хотите переназначить, вам нужно увидеть, как записывается новая комбинация, используя Ctrl+V, за которым следует комбинация.
Вы можете найти название команды (например, werase
), посмотрев stty -a
и найдя комбинацию клавиш, к которой в данный момент привязано действие.
Удивительно, но esc, а затем delete работает на macOS тоже.
Также, если вы пользуетесь iTerm2, вы можете обновить профиль по умолчанию:
Keys > Key Mapping > Presets > Natural Text Editing
На Mac вы можете использовать:
Fn+Delete
Если вы используете Linux с Xorg, стандартные сочетания для удаления слова назад – это Ctrl+W и Alt+Backspace. Если вы хотите, чтобы Ctrl+Backspace также удаляла слово назад в bash
, вам нужно добавить это сочетание клавиш.
Я опишу общее решение для назначения клавиш:
-
Определитесь с комбинацией клавиш, которую хотите использовать. Выполните
showkey -a
и нажмите комбинацию, которую хотите использовать. Например, когда я это выполняю на своемxfce4-terminal
, я получаю следующий вывод:^H 8 0010 0x08
-
Список доступных для привязки команд в
bash
:bind -p
. -
Найдите команду, которую хотите использовать. Для этой задачи подходит команда
backward-kill-word
-
Сложная часть: вместо синтаксиса
^H
вы должны написать"\C-H"
. Я не знаю простого инструмента для преобразования между этими синтаксисами, поэтому, вероятно, вам придется прочитать руководствоreadline
, чтобы это понять. На практике вы можете либо выполнить команду (обратите внимание на одиночные кавычки вокруг первого аргумента, так какbind
требует полного определения как один аргумент):bind '"\C-H":backward-kill-word'
или добавить следующее в
~/.inputrc
:"\C-H": shell-backward-kill-word
Если вы используете $HOME/.inputrc
, то же сочетание клавиш будет соблюдаться во всех программах, использующих библиотеку readline
. Я определенно рекомендую это вместо использования только команды bind
в bash
.
Я не использую zsh
, но я знаю, что он не использует библиотеку readline
, поэтому вам нужно найти аналогичный синтаксис для него.
Стандартное Ctrl+W
на самом деле тоже очень удобное сочетание, потому что оно быстрое, если вы набираете вслепую. Однако, если вы научитесь его использовать, вы будете случайно закрывать вкладки браузера или другие окна в графическом интерфейсе, когда захотите стереть слово назад.
Если вы хотите удалять, используя стандартное сочетание Ctrl+Backspace
, вы можете сначала выполнить это в вашем терминале:
stty intr ^K # завершение процессов с Ctrl+K вместо Ctrl+C
stty werase ^H # удалить слова с помощью Ctrl+Backspace вместо Ctrl+W
И если вы хотите сделать эти изменения постоянными, запишите это где-нибудь в /etc/profile
или в новом (подключаемом) файле, например, в /etc/profile.d/gui-compatible-stty.sh
.
Ответ или решение
Вопрос о том, как удалить слово назад в командной строке, актуален для многих пользователей, привыкших к редакторам, где это выполняется с помощью комбинации клавиш Ctrl+Backspace. Давайте рассмотрим, как реализовать подобную функциональность в bash и zsh.
Bash
В bash есть несколько опций для удаления слова назад, которые могут вас заинтересовать:
-
Стандартные сочетания клавиш:
- Ctrl + W: Удаляет до предыдущего пробела или символа, отмечая конец слова.
- Alt + Backspace: Удаляет слово назад и является более близким аналогом Ctrl + Backspace.
-
Изменение настроек stty:
Bash позволяет настраивать поведение командной строки с использованиемstty
. Вы можете изменить настройкуwerase
, чтобы привязать её к определённой комбинации клавиш. Например:stty werase ^H
Чтобы назначить Ctrl+Backspace для удаления слова назад, выполните команду
stty
с соответствующей комбинацией. -
Настройка ~/.inputrc:
Чтобы сделать данное поведение постоянным, добавьте в файл~/.inputrc
следующую строку:"\C-H": backward-kill-word
Это обеспечит использование данной комбинации во всех приложениях, использующих библиотеку readline.
Zsh
В zsh настройка осуществляется несколько иначе, поскольку он не использует библиотеку readline как bash. Вместо этого, вы можете использовать zsh-средства для управления привязками клавиш:
- Настройка привязки клавиш:
Для zsh используйтеbindkey
для назначения необходимой комбинации клавиш. Например:bindkey '^H' backward-kill-word
Это позволит вам использовать Ctrl+Backspace для удаления слова назад.
Альтернативные пути
Если вы работаете в других терминалах (например, gnome-terminal или iTerm2), их поведение может отличаться. В таких случаях:
- Gnome-terminal: Можно просто использовать Alt+Backspace, если это уже настроено по умолчанию.
- iTerm2 на macOS: Переход в
Keys > Key Mapping > Presets > Natural Text Editing
позволит вам задать аналогичные настройки.
Заключение
Удаление слова назад в командной строке — это вопрос настройки, и выбор зависит от ваших предпочтений и используемого терминала. Настройка файла ~/.inputrc
или использование команды bindkey
в zsh — наиболее универсальные решения, которые обеспечат ожидаемое поведение в разных средах.