2008-10-02 10 views
26

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

Я был в состоянии решить, что добавление этих строк в мой файл zshrc ...

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

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

+0

Спасибо за вышеуказанные привязки. Работа для меня в SecurtCRT – MikeRoger 2015-02-17 17:12:07

ответ

54

Я нашел, что это сочетание:

Один

Разработчики ЗШ не думаю, что ЗШ следует определять на действия , Конец:, 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.

Два

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

Решение заключается в настройке Putty для отправки другого типа терминала. Я пробовал xterm-color и linux. xterm-color исправлено Главная/Конец Проблема, но Numpad все еще был забавным. Установив его на linux, исправлены обе проблемы.

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

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

Таким образом, исправить обе эти вещи, и вы должны быть хорошо :)

+3

Еще один способ исправить смешное поведение клавиатуры: откройте настройки сеанса, перейдите в «Terminal -> Features» и установите флажок «Disable application keypad mode». См. Здесь: http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-appkeypad – exhuma 2010-04-05 09:36:09

+1

Мне пришлось добавить `` vi-begin-of-line`` и `` vi- end-of-line`` привязки к режиму viins, а также полностью исправить мою проблему с помощью zsh + putty. Теперь он работает. – 2011-12-01 20:16:22

+0

У меня не было успеха с кодом .zshrc, который наклеил @hopla. Поэтому мне пришлось использовать решение на следующей странице wiki wiki [http://zshwiki.org/home/zle/bindkeys](http://zshwiki.org/home/zle/bindkeys) в разделе о чтении из $ terminfo [] плюс решение hopla о настройке типа терминала на «linux». На странице вики ZSH говорится, что в основном то же самое, но без параметров «-M ...», переданных в bindkey. Это работает только в режиме vi vi bindkey. – 2012-02-15 02:31:24

0

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

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

+0

По умолчанию установка ubuntu связывает их в глобальном файле zshrc, но насколько я вижу, привязки не работают для шпатлевки. – agnul 2008-10-02 13:01:26

3

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

13

В диалоговом окне конфигурации PuTTY, перейдите в Connection -> Data и тип линукс в терминал типа строки перед подключением.

2

Соответствующий ответ, который должен быть переносимым через Все distros (не обязательно все версии zsh, хотя, ymmv здесь), должны использовать утилиту zkbd helper из zkbd.

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

Run 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. 

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

см man -P "less -p 'keyboard definition'" zshcontrib, или искать мета-справочную страницу zshall

5

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

bindkey -v 

bindkey '\eOH' beginning-of-line 
bindkey '\eOF' end-of-line 

 Смежные вопросы

  • Нет связанных вопросов^_^