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

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

Я смог решить эту проблему, добавив эти строки в мой файл zshrc ...

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

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

Спасибо за привязки выше. Сейчас работаю для меня в SecureCRT

MikeRoger 17.02.2015 20:12

Спасибо за команду. У меня сработала эта настройка: bindkey '^[OH' beginning-of-line и bindkey '^[OF' end-of-line.

codeman48 12.07.2018 11:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
38
2
26 074
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Установка ubuntu по умолчанию связывает их в глобальном файле zshrc, но, насколько я вижу, привязки не работают для шпатлевки.

agnul 02.10.2008 17:01

Кажется, замазка. 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/…

exhuma 05.04.2010 13:36

Мне пришлось добавить привязки vi-beginning-of-line и vi-end-of-line к режиму viins, чтобы полностью решить мою проблему с zsh + putty. Но теперь это работает.

Daniel Baulig 02.12.2011 00:16

Я не добился успеха с кодом .zshrc, который вставил @hopla. Поэтому мне пришлось использовать решение на следующей вики-странице zsh http://zshwiki.org/home/zle/bindkeys в разделе о чтении из $ terminfo [] плюс решение hopla об установке типа терминала на "linux". На вики-странице ZSH говорится, что нужно делать в основном то же самое, но без параметров «-M ...», переданных в bindkey. Однако для меня это работает только в режиме bindkey "vi".

Alex Q 15.02.2012 06:31

Исправление @exhuma сработало для меня. У меня возникли проблемы с управлением emacs на коробке CentOS5 из Windows через PuTTy -> zsh -> tmux -> emacs

BungleFeet 04.02.2014 14:42

Тип терминала для PuTTY - putty в Dickey terminfo с 2001 года. invisible-island.net/ncurses/terminfo.ti.html#tic-putty

JdeBP 06.01.2020 17:37

В диалоговом окне конфигурации PuTTY перейдите в Подключение -> Данные и введите linux в строку типа терминала перед подключением.

Это тот самый!

lewis4u 13.04.2017 13:25

Это работает для меня, но, кроме того, я должен запустить Midnight Commander с помощью mc -x, если я хочу использовать в нем мышь.

Melebius 22.05.2018 09:27

Для меня в Win10 нет раздела Connection -> Data в PuTTY 0.73 64-bit, просто Connection -> SSH, и я нигде не могу найти параметр "Terminal-type". Возможно, этот ответ устарел?

Eric 04.06.2020 22:46

@Eric nope, Connection -> Данные все еще находятся для меня в PuTTY 0.74 64-bit в Win10.

Alex thunder Shevchenko 03.12.2020 11:35

соответствующий ответ, который должен быть переносимым между дистрибутивами все (не обязательно для всех версий 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

Это испортило мою (вроде). Теперь вместо тильды он делает мои буквы заглавными и строчными.

Jonathan 19.02.2018 16:54

Для меня было достаточно bindkey -v.

teadotjay 04.08.2018 20:08

после помещения этого в мой .zshrc: <c-p> и <c-n> больше не работают и просто выводят ^ P ^ N - Но использование '\ e [1 ~' и '\ e [4 ~' работает

eli 23.10.2019 11:00

Прошло уже почти 11 лет с тех пор, как этот вопрос был впервые опубликован. В то время некоторые дистрибутивы поставлялись с записью terminfo putty, но в лучшем случае она была посредственной. С тех пор ситуация улучшилась, и хаки, которые требовались более десяти лет, больше не требуются. PuTTY по-прежнему по умолчанию устанавливает TERM на xterm для совместимости, но если вы подключаетесь к современным современным системам, вам, вероятно, повезет, переопределив это и установив его на putty-256color:

  1. Убедитесь, что на хосте есть запись terminfo для putty-256color: toe -a | grep -F putty.
  2. Отмените все взломы, которые вы могли использовать, чтобы PuTTY работал должным образом с zsh или другими программами.
  3. Убедитесь, что PuTTY обновлен. Он не будет уведомлять вас, когда доступны обновления, а если они устарели, вы, вероятно, столкнетесь с множеством тех же проблем. Вы можете поддерживать его в актуальном состоянии автоматически, используя что-то вроде Шоколадный.
  4. В диалоговом окне конфигурации PuTTY перейдите в «Соединение» -> «Данные» и установите «Строка типа терминала» на putty-256color.
  5. Пока вы в нем, на том же экране конфигурации добавьте новую переменную среды, чтобы включить 24-битный цвет. Эта переменная не стандартизирована, но она отправляется рядом других основных эмуляторов терминала (например, iTerm2), и многие программы ее понимают.
    1. Переменная: COLORTERM
    2. Значение: truecolor
  6. На момент написания я не нашел дистрибутива, который по умолчанию принимает переменную COLORTERM через SSH. Вам нужно будет отредактировать конфигурацию OpenSSH на хосте, чтобы разрешить это. Например, в дистрибутивах, подобных Debian, отредактируйте /etc/ssh/sshd_config и добавьте COLORTERM в строку AcceptEnv.
  7. Теперь все должно "просто работать". Если нет:
    1. Убедитесь, что вы повторно подключились после внесения изменений, или, по крайней мере, запустите exec zsh после изменения TERM. zsh не будет реагировать на изменения в TERM во время его работы.
    2. Убедитесь, что TERM действительно установлен на то, что вы планировали: echo $TERM
    3. Вы используете последнюю версию своего дистрибутива? Например, если вы используете сборку с долгосрочным жизненным циклом поддержки, даже если ваша версия технически все еще поддерживается, она может не иметь актуальных записей terminfo.
    4. Вы используете screen или tmux? Это еще одна целая банка червей. Протестируйте без них первыми, чтобы сузить круг проблем. В tmux попробуйте установить TERM=tmux-256color. На экране попробуйте TERM=screen-256color.
    5. Вы используете последнюю версию PuTTY?
    6. Есть ли у вас RC-файлы, в которых реализованы привязки клавиш или другие взломы? Попробуйте использовать стандартные RC-файлы.
    7. Вы уже изменили различные настройки PuTTY, чтобы попытаться исправить проблему, прежде чем пытаться исправить terminfo? Возможно, вам потребуется сбросить эти настройки.

У меня это сработало на Gentoo - и Gentoo принял COLORTERM без изменений. Gentoo также имеет терминатор экрана для putty-256color, поэтому я ожидаю, что screen тоже будет работать.

ZiggyTheHamster 22.05.2020 21:47

У меня нет Connection -> Data в PuTTY 0.73

Eric 04.06.2020 22:54

Другие вопросы по теме