Установка Debian 8.3
stty werase '^H'
или на Arch Linux 2/2016
stty werase '^?'
в .bashrc
(например) делает Ctrl- Backspaceудалить последнее слово в терминале. Тем не менее , это не то же самое поведение , как в современных приложениях с графическим интерфейсом (например , Firefox): он удаляет последний пробельные -разделенное слово, и не последнее слово , разделенных пробелами или символами , как . : , ; " ' & / ( )
.
Можно ли заставить Ctrl- Backspaceвести себя в терминале аналогично современным приложениям с графическим интерфейсом? Кроме того, есть ли способ сделать Ctrl- Deleteудалить слово непосредственно перед курсором?
bash
terminal
keyboard-shortcuts
line-editor
волк-Revo-кошка
источник
источник
Ответы:
Здесь работают два линейных редактора: редактор основных строк, предоставляемый ядром (редактор строки tty в каноническом режиме), и редактор строк bash (реализован через библиотеку readline). У обоих из них есть команда erase-to-previous-word, которая по умолчанию связана с Ctrl+ W. Ключ может быть настроен для канонического режима tty line editor через
stty werase
; bash имитирует привязку ключа, которую находит в настройке tty, если она не переопределена в его собственной конфигурации.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
, а вместо этого вставьте следующую строку в ваш.inputrc
:Обратите внимание, что это предполагает, что ваш терминал отправляет символ Ctrl + H для Ctrl+ Backspace. К сожалению, это один из тех ключей без стандартной привязки (и, Backspaceв частности, беспорядок по историческим причинам).
Также есть симметричная команда,
kill-word
которая по умолчанию связана сM-d
( Alt+ D). Чтобы связать его с Ctrl+ Delete, вам сначала нужно выяснить, какую escape-последовательность отправляет ваш терминал, а затем добавить соответствующую строку в ваш.inputrc
. Тип Ctrl+ Vзатем Ctrl+ Delete; это вставит что-то вроде того,^[[3;5~
где инициал^[
является визуальным представлением escape-символа. Тогда привязкаЕсли вас не устраивает ни одно из определений слова, вы можете предоставить свое собственное в bash: см. Запутанное поведение сочетаний клавиш в стиле emacs в bash
источник
Ctrl+Del
Работал хорошо. Однако я не могу добратьсяCtrl+Backspace
до работы. ЗаCtrl+v, Ctrl+Backspace
мой терминал говорит^?
. Что я должен положить в.inputrc
? Спасибо"\C-?": backward-kill-word
или любую другую функцию readline, которую вы хотите. Но вы можете определить привязку для Ctrl + Backspace, которая отличается от привязки для Backspace, если они отправляют разные символы. Если ваш терминал отправляет^?
как Backspace, так и Ctrl + Backspace, то приложение, запущенное в терминале, не может их различить. Некоторые терминалы могут быть настроены (например, xterm, urxvt), другие (например, эмуляторы терминалов на основе VTE) не могут.~/.inputrc
отключает значение по умолчанию/etc/inputrc
. чтобы исправить это, вы должны включить этот файл:$include /etc/inputrc
( отсюда )Пытаться
alt+backspace
В элементарной ОС это работает так, как вы хотите (как ctrl+ backspace)
источник
Поведение символа WERASE при обработке терминала в готовом режиме жестко задано , по крайней мере, в Linux:
Так что слова - это буквы, цифры и подчеркивание. Так будет всегда в терминале в Linux, когда приложение, которое выполняет свою собственную обработку в готовом режиме, не работает.
Версия readline (используемая bash и другими), кажется, немного отличается от версии ядра, но также кажется жестко закодированной :
Но это не похоже на то, что на
bash
самом деле делает для меня:foo+bar^W
стирает все, а не толькоbar
. Больше информации об этом здесь .источник
backward-kill-word
(связывание по умолчаниюM-DEL
) вместоunix-word-rubout
.