Почему Ctrl-Arrow не работает в bash на OS X?

15

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

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

Любые идеи о том, как я могу заставить эти ключи работать в Darwin Bash?

Райан Олсон
источник
2
Если вы используете пробелы, Ctrl + стрелка по умолчанию переключает пробелы.
mark4o 31.10.10
1
Похоже
приостановлено до дальнейшего уведомления.

Ответы:

13

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

Это должно означать, что в вашем терминале forward / backward-word связаны с Mf и Mb соответственно (M = Meta = alt / option), однако это не так. На OS X forward / backword-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)

Тим Белава
источник
Примечание: если вы часто используете tmux с ключами xterm, вам также понадобится \e[1;5Cи \e[1;5Dдля запуска forward-wordи backward-word.
Арне
2
Еще одно примечание: если оно все еще не работает, это может быть связано с конфликтом ярлыков с Mission Control / Spaces. Системные настройки -> Клавиатура -> Ярлыки -> Управление полетом, Перемещение влево / вправо на пробел
bhh1988
Я не понимаю, "OS X использует привязку ключей emacs по умолчанию". «Ctrl-стрелка» также является связыванием ключа emacs.
Грег
3

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

"\e[5C": forward-word
"\e[5D": backward-word
салить
источник
0

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

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

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

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

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

DomQ
источник
0

Как упоминалось @ bhh1988, конфигурация Mission Control не позволяет клавишам Ctrl работать с клавишами со стрелками bash. Я не хотел мешать этим ярлыкам, поэтому вместо этого я использую клавишу Option (т.е. Alt). В настоящее время в Mojave используется немецкая клавиатура (не знаю, насколько это актуально), я вставил следующее, .inputrcчтобы использовать Option-left-arrow и Option-right-arrow для перемещения между словами.

"\e\e[C": forward-word
"\e\e[D": backward-word
Питер Эванс
источник
0

ОБНОВЛЕНИЕ Январь 2020

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

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

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

Fergie
источник