Вопрос

Я использую 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, почему :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top