Ищем решение ALT + LeftArrowKey в zsh

130

Я недавно перешел с bash на zsh, но мне не хватает моих Alt+ LeftArrowKeyи Alt+, RightArrowKeyчтобы переходить туда и обратно по слову за раз.

Прямо сейчас, если я нажимаю Alt+, LeftArrowKeyя возвращаюсь на пару букв, а потом застреваю. Я не буду идти дальше назад, и он не вернется в конец строки с Alt+, RightArrowKeyкак я ожидал. Я даже не могу использовать клавиши со стрелками, чтобы перейти к концу строки, только к предпоследней. Невозможно ввести новые символы в строку или действительно удалить.

Как мне вернуть любимый ярлык?

Я использую Mac OS X, используя Терминал, если это важно.

Мадс Ом Ларсен
источник

Ответы:

243

Запустите, catзатем нажмите клавиши, чтобы увидеть коды, отправленные вашим ярлыком.
(Нажмите Ctrl+, Cчтобы убить, catкогда закончите.)
Для меня (ubuntu, konsole, xterm) нажатие Alt+ отправляет ^[[1;3D, поэтому я бы вставил свой .zshrc

bindkey "^[[1;3C" forward-word
bindkey "^[[1;3D" backward-word

(На самом деле я предпочитаю использовать Ctrlстрелку +, чтобы перемещать слово за словом, как в обычном текстовом поле под Windows или linux gui.)

Связанный вопрос: исправить ключевые настройки (Home / End / Insert / Delete) в .zshrc при запуске Zsh в Терминальном эмуляторе Terminator

lolesque
источник
15
Ты мой спаситель! На моем Mac «Alt + <-» давал «^ [b», а -> давал «^ [f», поэтому я добавил их. Работает как шарм. Ctrl + стрелки зарезервированы для переключения между рабочими столами на Mac.
Мадс Ом Ларсен
1
Одно замечание: для ctrl + <- cat сообщал ^[[Dза меня, а ctrl + v сообщал ^[OD. Предложение Ctrl + v сработало, но кошачье - нет. Кроме того, ctrl + v сообщал об одном и том же для alt + <- и alt + ->. Я смог добавить эти два, посмотрев на вывод cat и заменив любой "[[" на "O"
Майк С.
10
мой вывод под катом предназначен ^[^[[Cдля прямого и ^[^[[Dобратного слова, но обновление для них в .zshrc по какой-то причине не сработало.
Юнти
2
@Yunti - Ввод bindkey "^[^[[D" backward-wordи bindkey "^[^[[C" forward-wordв ~ / .zprofile работал для меня!
Фернандо Эспиноса
Мужчина! Спас мою жизнь! Спасибо, что поделился!
Жоао Энрике,
187

Для всех, кто использует iTerm, независимо от оболочки

На мой взгляд, все предлагаемые здесь решения имеют обратный подход. По сути, вы говорите своей оболочке прослушивать некоторую последовательность esc или другую привязку клавиш, которую вы установили в своем терминале, создавая проблемы совместимости при переключении оболочки (если вы используете SSH в какой-либо другой оболочке, переключитесь с BASH на ZSH и т. Д., И вы потеряете некоторые, если не все ваши сочетания клавиш).

Большинство оболочек имеют набор предварительно связанных последовательностей по умолчанию. Более того, хотя они не на 100% последовательны, они достаточно близки. Итак, самый простой способ, который я нашел для создания привязки клавиш для определенного действия в оболочке, - это указать вашему терминальному приложению привязку к привязкам клавиш по умолчанию, которые согласованы между оболочками.

Я написал сжатое решение для того, чтобы ваш терминал реагировал как можно ближе к родным привязкам клавиш Mac здесь

Откройте настройки iTerm + ,и перейдите на Profilesвкладку ( Keysвкладку можно использовать, но добавление привязки клавиш к вашему профилю позволяет сохранить ваш профиль и синхронизировать его с несколькими компьютерами) и вложенную keysвкладку и введите следующее:

Переместите курсор на одно слово влево

+ Отправить шестнадцатеричные коды:0x1b 0x62

Переместить курсор на одно слово вправо

+ Отправить шестнадцатеричные коды:0x1b 0x66

И это должно дать вам желаемое поведение не только в ZSH, но и при подключении по SSH к серверу, на котором запущены BASH, irb / pry, node и т. Д.

Travis
источник
1
У меня возникли проблемы с принятым решением, потому что у меня zsh работал нормально, но не irb и другие консоли. Удаление предыдущих настроек (в профиле iTerm, как предлагалось) работает отлично!
llekn
1
Решение bindkey издает раздражающий звук ошибки на Mac. Это должен быть правильный способ сделать это.
Weishi Zeng
@Lev Вероятно, потому что ваша оболочка не сопоставлена ​​с конфигурацией по умолчанию. Запустите, bindkey | grep forward-wordвы должны увидеть "^[f" forward-wordответ, но если нет, у вас есть 2 варианта. карту к одному из других возвращенных или добавьте "^[f" forward-wordв свой .zshrc.
Трэвис
Отмечу, что это "^[f", по-видимому, наиболее часто используемая привязка для forward-wordразных оболочек и единственная, установленная по умолчанию в моей версии bash.
Трэвис
Как-то у меня это сработало с командной кнопкой вместо опции. Спасибо чувак. :)
Vaibhav Jain
72

Добавление следующего в ~ / .zshrc сработало для меня на OSX Mountain Lion.

bindkey -e
bindkey '[C' forward-word
bindkey '[D' backward-word
Роб Сойер
источник
4
Это решение вызывает «колокольчик» в iTerm 2 при каждом использовании, поэтому переключение между словами может стать действительно раздражающим.
Мэтью Морек,
1
кто-нибудь выяснит, как это отключить ^ @MatthewMorek
Дэниел Кобе
18
'\ e \ e' предотвращает звонок. Моя конфигурация на El Capitan с iTerm 2 в режиме совместимости с терминалом bindkey "\e\e[D" backward-word bindkey "\e\e[C" forward-word
Йоханнес Гонтрум,
Спасибо, это решило проблему на macOs Sierra. Я не слышу звуков звонка ни на Терминале, ни на iTerm2.
Raspo
Как сделать так, чтобы он двигался от конца слов, а не от начала или от них?
Mafro34
23

В MacOS High Siera 10.13.6 или Mojave 10.14.2 и при использовании iTerm2 с ZSH Чтобы перейти от слов, я должен написать так:

bindkey "\e\e[D" backward-word
bindkey "\e\e[C" forward-word

Другие решения не работают

Vetalll
источник
1
Это единственное решение, которое сработало и для меня. Спасибо! Mac OS Mojave
jamescampbell
Также работает на OS Catalina!
Рид Ричардс,
7

Хотя строго говоря , не отвечая на ваш вопрос, по умолчанию для связывания forward-wordи backward-wordявляются alt-fсоответственно. alt-b,

Это работает везде, не требует , чтобы оставить домашний ряд, и имеет приятный мнемоническое свойство (F = вперед, Ь = назад), а также в соответствии с ctrl-fи ctrl-bбыть forward-characterи backward-character.

Вырви клавиши со стрелками!

0x89
источник
4
у меня не работает в zsh / iterm2, печатает ƒ и ∫ (cb cf работает).
Даворин
2

Чтобы заставить его работать для меня, я использовал этот ответ , однако мне пришлось поменять коды (слева <-> справа)

⌥ + ← Отправить шестнадцатеричные коды: 0x1b 0x66
⌥ + → Отправить шестнадцатеричные коды: 0x1b 0x62

и добавьте в мои ~/.zshrc

bindkey -e
bindkey "^[b" forward-word
bindkey '^[f' backward-word
iRonin
источник
Возможно, было бы менее запутанно, если бы вы bindkeyвместо этого изменили s, чтобы привязать ^[fк forward-word, а не к backward-word.
Николай
1

В Mavericks (10.9.4) код 1; 5 ... поэтому для привязки alt со стрелками у меня есть мой .zshrc, использующий это:

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

Вы можете использовать CTRL + V, а затем команду, которую хотите использовать

в Йосемити используйте раствор Роба

Zeos
источник
1
bindkey "[C" forward-word bindkey "[D" backward-word
Farkie
1

В zsh вы можете использовать bindkeyкоманду для просмотра сочетаний клавиш.

Используйте bindkeyдля изучения параметров, доступных без пользовательских сочетаний клавиш.

А именно, ^[b чтобы переместиться на слово назад и ^[fпереместиться на слово вперед.

MCI
источник