Почему сочетание клавиш Ctrl-Arrow не работает в bash на OS X?

Почему сочетание клавиш Ctrl-Arrow не работает в bash на OS X?

Я использую Ctrl- и Ctrl- на каждой системе Linux, с которой работаю, но эти комбинации клавиш не работают в bash на моем Macbook Pro. Он работает под управлением Snow Leopard, и я использую встроенное приложение Terminal.

Комбинации клавиш, похоже, не фиксируются ничем до или терминалом, потому что если я подключаюсь по ssh к одному из моих серверов Linux, я могу использовать Ctrl- / для перехода к следующему/предыдущему слову в командной строке. Однако, когда я пробую эту комбинацию клавиш в bash на моем Macbook, я получаю просто "C" для стрелки вправо и "D" для стрелки влево.

Есть идеи, как заставить эти клавиши работать в Darwin Bash?

решение1

OS X использует привязку клавиш emacs по умолчанию. Это верно практически для всех приложений в OS X, это довольно приятно. Это означает, что такие вещи, как Ca и Ce, являются началом/концом строки. Вы также получаете изящное уничтожение слов назад с помощью M-backspace, о, и уничтожение строки с помощью Ck.

Это должно означать, что в вашем терминале forward/backward-word привязаны к Mf и Mb соответственно (M = Meta = alt/option), однако это не так. В OS X forward/backward-word привязаны к M-→ и M-← по умолчанию.

Вы можете изменить это поведение, изменив конфигурацию библиотеки GNU Readline для вашей учетной записи. Это происходит в вашем ~/.inputrcфайле. Вы можете получить большой список команд, которые можно привязать, а man readlineтакже в онлайн-документации, напримерэто здесь..

Итак, отвечая на ваш вопрос, вы хотите переназначить то, что делает Readline, когда видит C-→ и C-←, так, чтобы он делал то же самое на вашем сервере Linux.

Синтаксис файла ~/.inputrcдовольно прост для того, что вам нужно сделать: key-sequence: action.

Вот что вам нужно для получения желаемого поведения:

"\e[5C": forward-word
"\e[5D": backward-word

Вот еще одна страницас дополнительными полезными привязками.

(Возможно, вы могли бы обойтись копированием /etc/inputrc с вашего Linux-компьютера в OS X ~/.inputrc)

решение2

ОБНОВЛЕНИЕ Янв 2020

В новейших версиях OSX оболочка по умолчанию — zsh. Поэтому магическое заклинание, чтобы заставить ctrl-arrowleft и ctrl-arrowright работать так, как ожидается, следующее:

bindkey '^[[1;5D' backward-word
bindkey '^[[1;5C' forward-word

(положите это в свой .zshrc)

решение3

вставьте ~/.inputrcследующие строки:

"\e[5C": forward-word
"\e[5D": backward-word

решение4

В эти дни, кажется, последовательности выхода, которые Ctrl- Arrowsвыводятся в терминале, изменились. Вот что работает для меня на сегодняшний день (конец 2018 года):

"\e[1;5C": forward-word
"\e[1;5D": backward-word

Примечание: вы всегда можете выяснить фактические последовательности экранирования, введя их cat -vв Терминале и нажав Ctrl- Left Arrowили Ctrl- Right Arrow. Вот пример вывода для моего собственного Ctrl-Left Arrow:

^[[1;5C
^[[1;5C

Чтобы перевести на .inputrcрусский язык, замените знак escape ^[на \eи заключите результат в двойные кавычки.

Связанный контент