Клавиши Home/End в zsh не работают с putty
-
03-07-2019 - |
Вопрос
Я использую zsh в качестве оболочки по умолчанию в Ubuntu, и все работает нормально с использованием gnome-terminal (который, насколько я знаю, эмулирует xterm).Когда я вхожу в систему из окна Windows через ssh и putty (который также эмулирует xterm), внезапно клавиши Home/End перестают работать.
Мне удалось решить эту проблему, добавив эти строки в мой файл zshrc...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...но мне все еще интересно, что здесь не так.Есть идеи?
Решение
Я обнаружил, что это комбинация:
Один
Разработчики ZSH не считают, что ZSH должен определять действия Дом, Конец, Дель, ...ключи.
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
в качестве типа терминала для удаленного хоста.Но где-то лажает и не отправляет правильные управляющие коды для Дом, Конец, ...чего можно было бы ожидать от xterm
.Или xterm
терминал не должен отправлять эти или что-то еще...(Дель ключ работает в xterm
однако, если вы настроите его в ZSH).Также обратите внимание, что ваши клавиши Numpad ведут себя забавно в Vim, например, с xterm
Терминал.
Решение состоит в том, чтобы настроить Putty для отправки терминала другого типа.я пробовал xterm-color
и linux
. xterm-color
исправил Дом/Конец проблема, но цифровая клавиатура все еще была забавной.Установка его на linux
исправил обе проблемы.
Вы можете установить тип терминала в Putty в разделе «Соединение» -> «Данные».Не поддавайтесь искушению установить тип терминала в вашем .zshrc
с export TERM=linux
, это просто неправильно.Тип терминала должен быть указан в вашем терминальном приложении.Так что, если, например, вы подключаетесь с компьютера Mac с помощью SSH-клиента Mac, он может установить собственный тип терминала.
Обратите внимание, что TERM указывает тип вашего терминала и не имеет ничего общего с хостом, к которому вы подключаетесь.Я могу установить тип терминала на linux
в Putty и без проблем подключаемся к серверам FreeBSD.
Так что исправьте обе эти вещи, и все будет в порядке :)
Другие советы
В диалоговом окне конфигурации PuTTY перейдите в Connection -> Data и введите Linux в строку типа терминала перед подключением.
Это работает для меня
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
Кажется, это замазка.Gnome-терминал отправляет коды ^[OH
и ^[OF
для Home и End соответственно, а putty отправляет ^[[1~
и ^[[4~
.В шпатлевке есть возможность изменить клавиши Home/End с стандартный режим для rxvt режиме, и это, похоже, исправляет клавишу «Домой», но не клавишу «Конец» (которая теперь отправляет ^[Ow
).Думаю, пришло время отправить куда-нибудь отчет об ошибке...:-)
соответствующий ответ, который должен быть переносимым все дистрибутивов (хотя не обязательно всех версий zsh, ymmv здесь) — использовать вспомогательную утилиту zkbd из zkbd.
Определение клавиатуры
Большое количество возможных комбинаций клавиатур, рабочих станций, терминалов, эмуляторов и оконных систем не позволяет zsh иметь встроенные привязки клавиш для каждой ситуации.Утилита zkbd, расположенная в разделе «Функции/Разное», может помочь вам быстро создать привязки клавиш для вашей конфигурации.Запустите zkbd либо как автозагружаемую функцию, либо как сценарий оболочки:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
Когда вы запускаете zkbd, он сначала просит вас ввести тип терминала;если предлагаемое значение по умолчанию верно, просто нажмите Enter.Затем он попросит вас нажать несколько разных клавиш, чтобы определить характеристики вашей клавиатуры и терминала;ZKBD предупреждает вас, если он найдет что -то из обычного, например, ключ Delete, который не отправляет ни ^H, ни ^?.
Нажатия клавиш, считываемые zkbd, записываются как определение ассоциативного массива с именем key, записываемого в файл в подкаталоге .zkbd в каталоге HOME или ZDOTDIR.Имя файла состоит из термина, поставщика и параметров 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.
Обратите внимание, что для того, чтобы «автозагрузка zkbd» работала, файл zkdb должен находиться в одном из каталогов, указанных в вашем массиве fpath (см. zshparam(1)).Это уже должно быть так, если у вас стандартная установка zsh;если это не так, скопируйте Functions/Misc/zkbd в соответствующий каталог.
видеть man -P "less -p 'keyboard definition'"
zshcontrib или выполните поиск по мета-странице zshall
Эти привязки просто не являются частью привязок по умолчанию, установленных в режиме emacs.
выполнение «где-это начало строки» в моей установке zsh по умолчанию после запуска «bindkey -e» показывает, что он привязан только к ^a.Возможно, вам следует спросить разработчиков zsh, почему :-)