Прив’язування слово назад-вбити до Ctrl + w


23

Я намагаюся перейти від тривалого використання Tcsh до недавньої розвідки Bash.

Мені вдалося перенести всі мої улюблені функції, за винятком Ctrl + w, який розглядає пробіли та риски як межі слів, швидше за все, назад-kill-word. Однак у Bash readline видаляє весь шлях до першого пробілу, видаляючи всі проміжки між ними.

Я спробував безліч різноманітних комбінацій \ Cw: word-kill-word і в .inputrc і .bashrc, використовуючи bind, але я не можу змусити його працювати так, як я хочу.

Досить смішно, через Putty з Windows на роботі я можу використовувати Alt + Backspace, що також в посібнику говорить про прив'язку за замовчуванням, щоб створити потрібну поведінку. Але в Terminal.app на моїх Macs вдома це не працює. Те саме стосується будь-якого сервера FreeBSD або Linux, на який я потрапив із Terminal.app.

Тому я звертаюся до суперпослуг за допомогою.

Відповіді:


40

readlineне пов'язує Ctrl- Wоскільки він за замовчуванням обробляє драйвер терміналу:

$ stty -a
(...) werase = ^W; (...)

Щоб вимкнути це, потрібно запустити (in ~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcне допоможе тут, оскільки воно читається, коли Ctrl- Wвсе-таки призначено werase.

Також зауважте, що \C-wформати keyseqs повинні бути укладені у подвійні лапки, як вище.


Різні термінали можуть працювати Alt- по- Backspaceрізному.

  • Термінал PuTTY і GNOME (з налаштуваннями за замовчуванням) відправити 1b 7f( ESC DEL)
  • Xterm з metaSendsEscape: trueпосилає 1b 08( ESC BS).
  • Xterm без metaSendsEscape відправки 88( HTSабо BSз найвищим встановленим бітом).

Xterm має кілька налаштувань для керування поведінкою Altключа (називається MetaXterm та X11 взагалі). З metaSendsEscape, утримуючи Alt, префікс натискання клавіші ESC(шістнадцятковий 1b). Без встановлення (режим за замовчуванням) Altвстановить найвищий біт вхідного символу, в результаті чого з'являться спеціальні символи. (Наприклад, Alt- Nприводить ESC nі îвідповідно.)

Наскільки я пам’ятаю, Terminal.app також має подібні налаштування для контролю поведінки мета / Alt / що-небудь-Macs.


Це не лише найкраща відповідь, але надзвичайно інформативна, дякую!
Стефан М

1
@shurane: Дія "стерти слово" стерти, як звичайне стирання (Backspace), реалізується самою ОС, у драйвері "tty device" - зауважте, що вони доступні навіть у програмах, які просто сліпо читають з stdin, наприклад cat. На всіх Unixes sttyвикористовується для управління різними параметрами tty, включаючи ці спеціальні клавіші. (Ось як виглядало 7-е видання UNIXstty .)
величезна кількість

1
@shurane: Тим часом readline - це бібліотека простору користувачів, спочатку написана для оболонки bash (хоча зараз використовується багатьма програмами). Можливо, що інші дії були реалізовані у режимі читання, щоб уникнути роздуття драйвера tty (який вже мав значну кількість прапорів та перемикань, як видно sttyз посібника). Також, bash спочатку призначався для ОС GNU і лише пізніше переносився на інші Unixes; набагато простіше підтримувати функції редагування в одній бібліотеці, ніж у декількох дуже різних ядрах.
grawity

3
@shurane: Технічно, проте, все ці дії, в тому числі слова перуть, реалізуються Readline - коли активний, він повністю відключає Backspace і Ctrl + W обробки драйвером терміналу. readline просто поважає sttyконфігурацію для простоти, але її можна змінити за допомогою власних налаштувань readline (як це описано у відповіді Метта Дейя).
grawity

4
Це чудова відповідь на інформацію, нагороду. Однак слід зазначити, що це відключає Ctrl-w для всіх програм, якщо вони не використовують readline, що, мабуть, не те, що хто хоче ..., тому спробуйте відповідь @fjarlq.
0fnt

19

grawity написав, що це неможливо контролювати у .inputrcфайлі, але це неправильно.

Якщо ви set bind-tty-special-chars offзнаходитесь у своєму .inputrc, ви можете налаштувати поведінку спеціальних термінальних символів.

Наприклад:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
І це має перевагу роботи для всіх програм, використання Readline-наприклад, python.
wchargin

3

Для запису відповідь, як це стосується iTerm2, полягає у встановленні Alt- Backspace(або Opt ⌥- на Mac) для надсилання шістнадцяткових кодів 0xb1та 0x7fдля виконання backward-kill-wordдії, яка розглядає нелітерно-цифрові символи як роздільники.

На відміну, ось поведінка, яку я описую, в якій натискання Opt ⌥- один раз змінює це:

echo "/example/filepath/with_non-alpha.characters@blah:meh

до цього:

echo "/example/filepath/with_non-alpha.characters@blah:

І наступні преси Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

Ось як виглядає налаштування в iTerm2: введіть тут опис зображення

Отже, характерна для Putty та Terminal, відповідь grawity чудова. Але витративши незручну кількість часу на пошук того, як застосувати налаштування в iTerm2, ця публікація суперпользователя, здається, з'являється найчастіше, тому здавалося відповідальним надати відповідну інформацію, оскільки вона стосується iTerm2 як відповідь, доданий до цього питання.


Мені знадобилося багато часу, щоб зрозуміти це, і це рішення справді працює на OS X (з iTerm2) під час входу у віддалену оболонку bash. Спасибі!
Мартійн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.