Главная / Концевые ключи в Zsh не работают с замазкой - PullRequest
31 голосов
/ 02 октября 2008

Я использую zsh в качестве оболочки по умолчанию для коробки Ubuntu, и все работает нормально, используя gnome-терминал (который, насколько я знаю, эмулирует xterm). Когда я вхожу из окна Windows через ssh и putty (который также эмулирует xterm), ключи home / end больше не работают.

Мне удалось решить, добавив эти строки в мой файл zshrc ...

bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line

... но мне все еще интересно, что здесь не так. Есть идеи?

Ответы [ 6 ]

64 голосов
/ 26 марта 2009

Я нашел, что это комбинация:

Один

Разработчики ZSH не считают, что ZSH должен определять действия клавиш Home , End , Del , ....

Debian и Ubuntu исправляют это, определяя обычные действия, которые обычный пользователь ожидает в глобальном файле /etc/zsh/zshrc. Следуя соответствующему коду (он одинаков для Debian и Ubuntu):

if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode

[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char

# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi

Итак, если вы подключаетесь к Debian или Ubuntu, вам не нужно ничего делать. Все должно работать автоматически (если нет, см. Ниже).

Но ... если вы подключаетесь к другому устройству (например, FreeBSD), может не быть удобного по умолчанию zshrc. Конечно, решение состоит в том, чтобы добавить строки из Debian / Ubuntu zshrc к своим .zshrc.

Два

Putty отправляет xterm в качестве типа терминала на удаленный хост. Но что-то не так и не отправляет правильные контрольные коды для Home , End , ... что можно ожидать от xterm. Или же терминал xterm не должен отправлять эти или что-либо еще ... (ключ Del работает в xterm, однако, если вы сконфигурируете его в ZSH). Также обратите внимание, что ваши клавиши Numpad в Vim выглядят забавно, например, с терминалом xterm.

Решение состоит в том, чтобы настроить Putty для отправки терминала другого типа. Я пробовал xterm-color и linux. xterm-color исправил проблему Home / End , но Numpad все еще был забавным. Установка linux устранила обе проблемы.

Вы можете установить тип терминала в Putty в разделе Соединение -> Данные. Не поддавайтесь искушению установить тип вашего терминала в .zshrc с помощью export TERM=linux, это просто неправильно. Тип терминала должен быть указан вашим терминальным приложением. Так что, например, если вы подключаетесь с компьютера Mac с клиентом Mac SSH, он может установить собственный тип терминала.

Обратите внимание, что TERM указывает тип вашего терминала и не имеет никакого отношения к хосту, к которому вы подключаетесь. Я могу установить свой тип терминала на linux в Putty и без проблем подключиться к серверам FreeBSD.

Итак, исправьте обе эти вещи, и все будет в порядке:)

13 голосов
/ 19 августа 2009

В диалоговом окне конфигурации PuTTY перейдите в Соединение -> Данные и введите linux в строку типа терминала перед подключением.

6 голосов
/ 11 ноября 2014

Это работает для меня

bindkey -v

bindkey '\eOH'  beginning-of-line
bindkey '\eOF'  end-of-line
3 голосов
/ 30 апреля 2012

правильный ответ, который должен быть переносимым на все дистрибутивы (не обязательно во всех версиях zsh, хотя, здесь ymmv) - использовать вспомогательную утилиту zkbd из zkbd.

Определение клавиатуры
Большое количество возможных комбинаций клавиатур, рабочих станций, терминалов, эмуляторов и оконных систем не позволяет zsh иметь встроенные привязки клавиш для любой ситуации. Утилита zkbd, которая находится в разделе «Функции / Разное», может помочь вам быстро создать привязки клавиш для вашей конфигурации.

Запустите zkbd как автозагрузку или как скрипт оболочки:

zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd

Когда вы запускаете zkbd, он сначала запрашивает ваш тип терминала; если предложенное по умолчанию значение верное, просто нажмите return. Затем вас попросят нажать несколько разных клавиш, чтобы определить характеристики вашей клавиатуры и терминала; ZKBD предупреждает вас если он находит что-то необычное, например, клавишу Delete, которая не отправляет ни ^ H, ни ^?.

Нажатия клавиш, считанные zkbd, записываются как определение для ассоциативного массива с именем key, записываемого в файл в подкаталоге .zkbd в каталоге HOME или ZDOTDIR. Название файла состоит из TERM, VENDOR и OSTYPE параметры, соединенные дефисами.

Вы можете прочитать этот файл в свой .zshrc или другой файл запуска с source' or. ' команды, а затем ссылки на параметр ключа в командах bindkey, например:

          source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
          [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
          [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
          # etc.

Обратите внимание, что для работы autoload zkbd файл zkdb должен находиться в одном из каталогов, указанных в вашем массиве fpath (см. Zshparam (1)). Это уже должно иметь место, если у вас есть стандартная установка zsh; если это не так, скопируйте Functions / Misc / zkbd в соответствующий каталог.

см. man -P "less -p 'keyboard definition'" zshcontrib или поиск по мета-странице man zshall

3 голосов
/ 02 октября 2008

Кажется, это замазка. Gnome-терминал отправляет коды ^[OH и ^[OF для Home и End соответственно, а putty отправляет ^[[1~ и ^[[4~. В putty есть возможность изменить ключи Home / End с режима standard на режим rxvt , и это похоже на исправление ключа Home, но не ключа End (который теперь отправляет ^[Ow). Думаю, пришло время подать отчет об ошибке куда-нибудь ...: -)

0 голосов
/ 02 октября 2008

Эти привязки просто не являются частью привязок по умолчанию, установленных в режиме emacs.

выполнение "где-это начало строки" в моей установке zsh по умолчанию после запуска "bindkey -e" показывает, что он связан только с ^ a. Возможно, вам следует спросить разработчиков zsh, почему: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...