Я нашел, что это комбинация:
Один
Разработчики 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.
Итак, исправьте обе эти вещи, и все будет в порядке:)