Я запускаю zsh в качестве оболочки по умолчанию в системе Ubuntu, и все работает нормально с использованием gnome-terminal (который, насколько я знаю, эмулирует xterm). Когда я вхожу в систему из окна Windows через ssh и putty (который также эмулирует xterm), внезапно клавиши home / end больше не работают.
Я смог решить эту проблему, добавив эти строки в мой файл zshrc ...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
... но мне все еще интересно, что здесь не так. Любая идея?
Спасибо за команду. У меня сработала эта настройка: bindkey '^[OH' beginning-of-line
и bindkey '^[OF' end-of-line
.
Эти привязки просто не кажутся частью привязок по умолчанию, установленных в режиме emacs.
выполнение "where-is begin-of-line" в моей установке zsh по умолчанию после запуска "bindkey -e" показывает, что он привязан только к ^ a. Возможно, вам стоит спросить разработчиков zsh, почему :-)
Установка ubuntu по умолчанию связывает их в глобальном файле zshrc, но, насколько я вижу, привязки не работают для шпатлевки.
Кажется, замазка. Gnome-terminal отправляет коды ^[OH
и ^[OF
для Home и End соответственно, а putty отправляет ^[[1~
и ^[[4~
. В замазке есть возможность изменить ключи Home / End из режима стандарт в режим rxvt, и это, похоже, исправляет ключ Home, но не ключ End (который теперь отправляет ^[Ow
). Думаю, пора куда-нибудь подать отчет об ошибке ... :-)
Я нашел это комбинацию:
Один
Разработчики 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, но цифровая клавиатура все еще была забавной. Установка linux
устранила обе проблемы.
Вы можете установить тип терминала в Putty в меню Connection -> Data. Не поддавайтесь соблазну установить тип терминала в .zshrc
на export TERM=linux
, это неправильно. Тип терминала должен быть указан в вашем терминальном приложении. Так что если, например, вы подключаетесь из компьютера Mac с помощью SSH-клиента Mac, он может установить собственный тип терминала.
Обратите внимание, что TERM указывает тип вашего терминала и не имеет ничего общего с хостом, к которому вы подключаетесь. Я могу установить тип своего терминала linux
в Putty и без проблем подключиться к серверам FreeBSD.
Итак, исправьте обе эти вещи, и все будет в порядке :)
Еще один способ исправить странное поведение клавиатуры: откройте настройки сеанса, перейдите к Terminal -> Features
и установите флажок Disable application keypad mode
. Смотрите здесь: the.earth.li/~sgtatham/putty/0.60/htmldoc/…
Мне пришлось добавить привязки vi-beginning-of-line
и vi-end-of-line
к режиму viins, чтобы полностью решить мою проблему с zsh + putty. Но теперь это работает.
Я не добился успеха с кодом .zshrc, который вставил @hopla. Поэтому мне пришлось использовать решение на следующей вики-странице zsh http://zshwiki.org/home/zle/bindkeys в разделе о чтении из $ terminfo [] плюс решение hopla об установке типа терминала на "linux". На вики-странице ZSH говорится, что нужно делать в основном то же самое, но без параметров «-M ...», переданных в bindkey. Однако для меня это работает только в режиме bindkey "vi".
Исправление @exhuma сработало для меня. У меня возникли проблемы с управлением emacs на коробке CentOS5 из Windows через PuTTy -> zsh -> tmux -> emacs
Тип терминала для PuTTY - putty
в Dickey terminfo с 2001 года. invisible-island.net/ncurses/terminfo.ti.html#tic-putty
В диалоговом окне конфигурации PuTTY перейдите в Подключение -> Данные и введите linux в строку типа терминала перед подключением.
Это тот самый!
Это работает для меня, но, кроме того, я должен запустить Midnight Commander с помощью mc -x
, если я хочу использовать в нем мышь.
Для меня в Win10 нет раздела Connection -> Data в PuTTY 0.73 64-bit, просто Connection -> SSH, и я нигде не могу найти параметр "Terminal-type". Возможно, этот ответ устарел?
@Eric nope, Connection -> Данные все еще находятся для меня в PuTTY 0.74 64-bit в Win10.
соответствующий ответ, который должен быть переносимым между дистрибутивами все (не обязательно для всех версий zsh, здесь ymmv), - использовать вспомогательную утилиту zkbd от zkbd.
Keyboard Definition
The large number of possible combinations of keyboards, workstations, terminals, emulators, and window systems makes it impossible for zsh to have built-in key bindings for every situation. The zkbd utility, found in Functions/Misc, can help you quickly create key bindings for your configuration.Run zkbd either as an autoloaded function, or as a shell script:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
When you run zkbd, it first asks you to enter your terminal type; if the default it offers is correct, just press return. It then asks you to press a number of different keys to determine characteristics of your keyboard and terminal; zkbd warns you if it finds anything out of the ordinary, such as a Delete key that sends neither ^H nor ^?.
The keystrokes read by zkbd are recorded as a definition for an associative array named key, written to a file in the subdirectory .zkbd within either your HOME or ZDOTDIR directory. The name of the file is composed from the TERM, VENDOR and OSTYPE parameters, joined by hyphens.
You may read this file into your .zshrc or another startup file with the
source' or
.' commands, then reference the key parameter in bindkey commands, like this:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
Note that in order for `autoload zkbd' to work, the zkdb file must be in one of the directories named in your fpath array (see zshparam(1)). This should already be the case if you have a standard zsh installation; if it is not, copy Functions/Misc/zkbd to an appropriate directory.
см. man -P "less -p 'keyboard definition'"
zshcontrib или поиск по мета-странице zshall
Это работает для меня
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
Это испортило мою (вроде). Теперь вместо тильды он делает мои буквы заглавными и строчными.
Для меня было достаточно bindkey -v.
после помещения этого в мой .zshrc: <c-p> и <c-n> больше не работают и просто выводят ^ P ^ N - Но использование '\ e [1 ~' и '\ e [4 ~' работает
Прошло уже почти 11 лет с тех пор, как этот вопрос был впервые опубликован. В то время некоторые дистрибутивы поставлялись с записью terminfo putty
, но в лучшем случае она была посредственной. С тех пор ситуация улучшилась, и хаки, которые требовались более десяти лет, больше не требуются. PuTTY по-прежнему по умолчанию устанавливает TERM
на xterm
для совместимости, но если вы подключаетесь к современным современным системам, вам, вероятно, повезет, переопределив это и установив его на putty-256color
:
putty-256color
: toe -a | grep -F putty
.putty-256color
.COLORTERM
truecolor
/etc/ssh/sshd_config
и добавьте COLORTERM
в строку AcceptEnv
.exec zsh
после изменения TERM
. zsh не будет реагировать на изменения в TERM
во время его работы.TERM
действительно установлен на то, что вы планировали: echo $TERM
screen
или tmux
? Это еще одна целая банка червей. Протестируйте без них первыми, чтобы сузить круг проблем. В tmux попробуйте установить TERM=tmux-256color
. На экране попробуйте TERM=screen-256color
.У меня это сработало на Gentoo - и Gentoo принял COLORTERM без изменений. Gentoo также имеет терминатор экрана для putty-256color, поэтому я ожидаю, что screen тоже будет работать.
У меня нет Connection -> Data в PuTTY 0.73
Спасибо за привязки выше. Сейчас работаю для меня в SecureCRT