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

Вопрос или проблема

Как я могу удалить слово назад в командной строке? Я привык к тому, что некоторые редакторы удаляют последнее ‘слово’ с помощью 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, вам нужно добавить это сочетание клавиш.

Я опишу общее решение для назначения клавиш:

  1. Определитесь с комбинацией клавиш, которую хотите использовать. Выполните showkey -a и нажмите комбинацию, которую хотите использовать. Например, когда я это выполняю на своем xfce4-terminal, я получаю следующий вывод:

    ^H 8 0010 0x08

  2. Список доступных для привязки команд в bash: bind -p.

  3. Найдите команду, которую хотите использовать. Для этой задачи подходит команда backward-kill-word

  4. Сложная часть: вместо синтаксиса ^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 есть несколько опций для удаления слова назад, которые могут вас заинтересовать:

  1. Стандартные сочетания клавиш:

    • Ctrl + W: Удаляет до предыдущего пробела или символа, отмечая конец слова.
    • Alt + Backspace: Удаляет слово назад и является более близким аналогом Ctrl + Backspace.
  2. Изменение настроек stty:
    Bash позволяет настраивать поведение командной строки с использованием stty. Вы можете изменить настройку werase, чтобы привязать её к определённой комбинации клавиш. Например:

    stty werase ^H

    Чтобы назначить Ctrl+Backspace для удаления слова назад, выполните команду stty с соответствующей комбинацией.

  3. Настройка ~/.inputrc:
    Чтобы сделать данное поведение постоянным, добавьте в файл ~/.inputrc следующую строку:

    "\C-H": backward-kill-word

    Это обеспечит использование данной комбинации во всех приложениях, использующих библиотеку readline.

Zsh

В zsh настройка осуществляется несколько иначе, поскольку он не использует библиотеку readline как bash. Вместо этого, вы можете использовать zsh-средства для управления привязками клавиш:

  1. Настройка привязки клавиш:
    Для 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 — наиболее универсальные решения, которые обеспечат ожидаемое поведение в разных средах.

Оцените материал
Добавить комментарий

Капча загружается...