Ctrl-Backspace та Ctrl-Delete в bash


14

Наведення на Debian 8.3

stty werase '^H'

або на Arch Linux 2/2016

stty werase '^?'

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

Чи можливо зробити Ctrl- Backspaceповодитись в терміналі аналогічно сучасним програмам GUI? Також, чи є якийсь спосіб зробити Ctrl- Deleteвидалити слово безпосередньо перед курсором?


1
Ваша оболонка може підтримувати ті дії, які можуть бути пов'язані із заданим ключем.
Томас Дікі

@ThomasDickey: Я використовую bash. Це добре, якщо він працює просто в баш.
вовк-рево-коти

Відповіді:


27

Тут грають два редактори рядків: основний редактор рядків, що надається ядром (редактор рядків канонічного режиму), та редактор рядків bash (реалізований через бібліотеку readline). Обидва вони мають команду "Стерти до попереднього слова", яка за замовчуванням прив’язана до Ctrl+ W. Ключ може бути налаштований для редактора канонічного режиму тти рядка через 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:

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

Зауважте, що це передбачає, що ваш термінал надсилає символ Ctrl + H для Ctrl+ Backspace. На жаль, це одна з тих клавіш, що не мають стандартного прив’язки (і, Backspaceзокрема , це безлад з історичних причин).

Також є симетрична команда, kill-wordяка за замовчуванням прив’язана до M-d( Alt+ D). Щоб прив’язати його до Ctrl+ Delete, спочатку потрібно з’ясувати, яку послідовність евакуації надсилає ваш термінал, а потім додати відповідний рядок у свій .inputrc. Введіть Ctrl+ Vпотім Ctrl+ Delete; це вставить щось на зразок, ^[[3;5~де початковим ^[є візуальне зображення символу втечі. Тоді зв'язування

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

Якщо вас не влаштовує жодне визначення слова, ви можете вказати своє баш: див. Заплутану поведінку клавіатурних зв'язків стилю emacs у bash


2
відмінне пояснення! Ctrl+DelПрацював добре. Однак я не можу взятися Ctrl+Backspaceза роботу. Бо Ctrl+v, Ctrl+Backspaceмій термінал каже ^?. Що я повинен помістити в .inputrc? Дякую
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordабо будь-яку функцію читання, яку ви хочете. Але ви можете визначити прив'язку для Ctrl + Backspace, яка відрізняється від прив'язки для Backspace, якщо вони надсилають різні символи. Якщо ваш термінал надсилає ^?і Backspace, і Ctrl + Backspace, програма, що працює в терміналі, не має можливості їх розрізнити. Деякі термінали можуть бути налаштовані (наприклад, xterm, urxvt), інші (наприклад, емулятори терміналів на основі VTE) не можуть.
Жил "ТАК - перестань бути злим"

4
важливо зазначити, що визначення ~/.inputrcвимикає за замовчуванням /etc/inputrc. Щоб виправити це, ви повинні включити цей файл: $include /etc/inputrc( звідси )
Ciprian Tomoiagă

+1 для Esc + Backspace
Celal Ergün


1

Поведінка символу 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. Більше інформації про це тут .


1. vi користувач, мабуть, просто шукає backward-kill-word(прив'язування за замовчуванням M-DEL) замість unix-word-rubout.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.