21

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

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

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

Как ни странно, через Putty из Windows на работе я могу использовать Alt+Backspace, который также в руководстве называется привязкой по умолчанию, чтобы получить точное поведение, которое я хочу. Но в Terminal.app на моих компьютерах Mac это не работает. То же самое относится и к любому серверу FreeBSD или Linux, в который я входил из Terminal.app.

Поэтому я обращаюсь к суперпользователю за помощью.

3 ответа3

38

readline не привязывается через Ctrl - W, так как он обрабатывается драйвером терминала по умолчанию:

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

Чтобы отключить это, вы должны запустить (в ~/.bashrc):

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

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

Также обратите внимание, что ключевые слова формата \C-w должны быть заключены в двойные кавычки, как указано выше.


Различные терминалы могут обрабатывать Alt - Backspace по- разному.

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

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

Насколько я помню, Terminal.app также имеет похожую настройку для управления поведением Meta/Alt/what-Macs-use.

18

grawity пишет, что этим нельзя управлять в файле .inputrc , но это неверно.

Если вы set bind-tty-special-chars off в .inputrc , вы можете настроить поведение специальных терминальных символов.

Например:

set bind-tty-special-chars off
"\C-u": kill-whole-line
"\C-w": backward-kill-word
3

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

Для различия вот поведение, которое я описываю, при котором нажатие Opt pt - один раз меняет это:

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 в качестве Ответа, прилагаемого к этому Вопросу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .