Intereting Posts
Как установить вывод heredoc в локальную переменную Начиная с системной службы, файлы журнала не были найдены. Не удается запустить службу Определить конфигурацию машины с помощью кода Как я могу создать android на моем debian при использовании eclipse? (проблема java-зависимостей) rsync как другой пользователь Почему пользовательское пространство медленнее ядра? Grep для фильтрации и отображения только начала строки Как я могу отбросить некоторые исходящие пакеты? Можно ли отключить многословную версию в середине работы? Загрузка нескольких файлов через ftp с помощью curl Как автоматически выйти из гостевой сессии пользователя после простоя Как fail2ban обнаруживает время попытки вторжения, если в файлах журналов нет метки времени? Обновление ядра (4.10) привело к сбою XServer и остальной системы (Arch) настроить несколько ip на одном и том же vlan на компьютере centos 7 Найти количество IO, возникающее на разных NFS-креплениях

Ctrl-Backspace и Ctrl-Delete в bash

Включение Debian 8.3

stty werase '^H' 

или на Arch Linux 2/2016

 stty werase '^?' 

в .bashrc (например) делает Ctrl- Backspace удалять последнее слово в терминале. Тем не менее это не то же поведение, что и в современных приложениях с графическим интерфейсом (например, Firefox): он удаляет последнее пробельное слово – разделенное слово, а не последнее слово, разделенное пробелами или символами . : , ; " ' & / ( ) . : , ; " ' & / ( ) . : , ; " ' & / ( ) .

Можно ли заставить Ctrl- Backspace вести себя на терминале, аналогичном современным графическим приложениям? Кроме того, есть ли способ сделать CtrlУдалить удалить слово непосредственно перед курсором?

Здесь есть две линейные редакторы: основной редактор строк, предоставленный ядром (редактор строк в стиле канонического режима), и редактор строк bash (реализованный через библиотеку readline). Обе они имеют команду erase-to-previous-word, которая по умолчанию привязана к Ctrl + W. Ключ может быть сконфигурирован для редактора строки tty в каноническом режиме через stty werase ; bash имитирует привязку ключа, которую он находит в настройке tty, если не переопределен в своей собственной конфигурации.

werase действие werase в редакторе строк tty. Он всегда стирает (ASCII) слова, разделенные пробелами. Редко можно взаимодействовать с редактором строк tty – это то, что вы получаете, например, когда вы вводите cat без аргументов. Если вы хотите использовать привязчивые ключевые привязки, вы можете запустить команду под инструментом, например rlwrap, который использует readline.

Bash предоставляет две команды для удаления предыдущего слова : unix-word-rubout ( Ctrl + w или как установлено через stty werase ) и backward-kill-word ( M-DEL , т.е. Esc Backspace ), которое обрабатывает слово как последовательность буквенно-цифровые символы в текущей локали и _ . Если вы хотите, чтобы Ctrl + Backspace stty werase предыдущую последовательность буквенно-цифровых символов, не устанавливайте stty werase и вместо этого помещайте следующую строку в свой .inputrc :

 "\Ch": backward-kill-word 

Обратите внимание, что это предполагает, что ваш терминал отправляет символ Ctrl + H для Ctrl + Backspace . К сожалению, это один из тех ключей без стандартного связывания (и Backspace, в частности, беспорядок по историческим причинам).

Также имеется симметричное командное kill-word которое по умолчанию привязано к Md ( Alt + D ). Чтобы связать его с Ctrl + Delete , вам сначала нужно выяснить, какую escape-последовательность отправляет ваш терминал, а затем добавить соответствующую строку в ваш .inputrc . Введите Ctrl + V, затем Ctrl + Delete ; это вставляет что-то вроде ^[[3;5~ где начальный ^[ является визуальным представлением escape-символа. Тогда связывание

 "\e[3;5~": kill-word 

Если вас не устраивает ни определение слова, вы можете предоставить свой собственный в bash: см. Запутанное поведение клавиш в стиле emacs в bash

Поведение символа WERASE в обработке терминала в готовом режиме жестко запрограммировано , по крайней мере, в Linux:

  if (kill_type == WERASE) { /* Equivalent to BSD's ALTWERASE. */ if (isalnum(c) || c == '_') seen_alnums++; else if (seen_alnums) break; } 

Таким образом, слова – буквы, цифры и подчеркивание. Так будет всегда в терминале Linux, когда приложение, которое выполняет свою собственную обработку в режиме готового режима, не работает.

версия readline (используемая bash и другими), кажется, немного отличается от версии ядра, но она также выглядит жестко запрограммированной :

Слова состоят из букв и цифр.

Но это не похоже на то, что bash самом деле делает для меня: foo+bar^W стирает все, а не только bar . Об этом больше информации.