Подтвердить что ты не робот

Главная/Завершить ключи в zsh не работают с шпатлевкой

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

Мне удалось решить, что добавление этих строк в файл zshrc...

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

... но мне все еще интересно, что здесь не так. Любая идея?

4b9b3361

Ответ 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.

Итак, исправьте обе эти вещи, и вы должны быть в порядке:)

Ответ 2

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

Ответ 3

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

bindkey -v

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

Ответ 4

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

Ответ 5

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

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

Запустите zkbd либо как автозагружаемую функцию, либо как оболочку script:

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.

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

см. man -P "less -p 'keyboard definition'" zshcontrib или выполните поиск мета-man-страницы zshall

Ответ 6

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

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