Ответ 1
Я нашел комбинацию:
One
Разработчики 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 в разделе Connection → Data. Не испытывайте соблазн установить тип вашего терминала в .zshrc
с помощью export TERM=linux
, это просто неправильно. Тип терминала должен быть указан вашим терминальным приложением. Таким образом, если, например, вы подключаетесь из Mac-контейнера с клиентом Mac SSH, он может установить собственный тип терминала.
Обратите внимание, что TERM указывает тип вашего терминала и не имеет ничего общего с хостом, к которому вы подключаетесь. Я могу установить тип терминала в linux
в Putty и без проблем подключиться к серверам FreeBSD.
Итак, исправьте обе эти вещи, и вы должны быть в порядке:)