.zshrc ярлык, работающий на Arch, но не на Ubuntu

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

3
31.12.2018, 13:58
2 ответа

На большинстве терминалов, подобных xterm -, кнопка Вверх(и аналогичная ей клавиша для большинства навигационных клавиш )отправляют либо ␛[A, либо ␛OAв зависимости от того, был ли терминал переведен в . ] клавиатура передает режим или нет. Записи smkxи rmkxterminfo могут использоваться для перевода терминала в этот режим или из него.

Курсор с клавишейkcuu1(вверх на 1 )запись terminfo описывает последовательность, отправляемую с помощью Up в режиме передачи с клавиатуры , то есть ␛OA.

В Debian и производных есть файл /etc/zsh/zshrc, который выполняет

    function zle-line-init () {
        emulate -L zsh
        printf > /dev/tty '%s' ${terminfo[smkx]}
    }

Что переводит терминал в этот режим, когда zle активен, что означает, что теперь вы можете полагаться на базу данных terminfo, чтобы узнать, какие последовательности символов передаются ключами.

Файл также определяет ассоциативный массив $keyна основе записей terminfo, чтобы помочь вам сопоставить их с виджетами. Итак, в этих системах вы можете:

(($+key[Up])) && bindkey $key[Up] history-beginning-search-backward

Для чего-то, что работает в системах, где терминал находится в режиме передачи с клавиатуры и тех, которые не имеют или не имеют хэша $key,ты можешь сделать:

bindkey $terminfo[kcuu1] history-beginning-search-backward
bindkey ${terminfo[kcuu1]/O/[} history-beginning-search-backward

См. также:

4
27.01.2020, 21:13

Курсорные клавиши — это весело.

Хотя они и не так увлекательны, как редактирование клавиш, которые действительно забавны.

У вас есть два набора клавиш курсора на клавиатуре, один на клавиатуре курсора и один на клавиатуре калькулятора .

Большинство эмуляторов терминалов пытаются (иногда довольно плохо )использовать модель DEC VT, где каждый набор клавиш индивидуально переключается между режимом приложения и нормальным режимом используя настройки приватного режимаDECCKM(Режим клавиатуры курсора )иDECNKM(Режим цифровой клавиатуры )соответственно. Суть режима приложения заключается в том, что клавиши на соответствующей клавиатуре превращаются в дополнительные функциональные клавиши приложения.

⇐ Это клавиатура курсора.
  • В обычном режиме клавиши со стрелками отправляют управляющие последовательности ECMA -48 CUB, CUF, CUUи CUD, если только и #x2387; Модификатор Alt действует, и в этом случае они отправляют управляющие последовательности DECFNK.
  • В режиме приложения клавиши со стрелками отправляют SS3одиночную -сдвиг 3 последовательности.
⇐ Это клавиатура калькулятора.
  • В обычном режимеклавиши со стрелками отправляют управляющие последовательности ECMA -48 CUB, CUF, CUUи CUD, если только и #x2387; Модификатор Alt действует, и в этом случае они отправляют управляющие последовательности DECFNKили если комбинация числовой блокировки и сдвига не заставляет их отправлять цифры.
  • В режиме приложения клавиши со стрелками отправляют другой набор изSS3одиночных -сдвигов на 3 последовательности (, если, опять же, комбинация цифровой блокировки и сдвига не заставляет их отправлять цифры ).

Последовательность [A, которую вы указали ZLE для привязки к виджету, является псевдонимом ECMA -48 7 -для управляющей последовательности CSIA, которая являетсяCUP(«Курсор ВВЕРХ» )управляющая последовательность. Эта управляющая последовательность генерируется ТН DEC и их имитаторами терминала-эмуляторами только тогда, когда клавиатура находится в нормальном режиме, а и #x2387; Модификатор Alt не действует. Он не будет соответствовать последовательностям сдвига, отправляемым, когда соответствующие клавиатуры находятся в режиме приложений.

База данных terminfo мутит воду и вызывает здесь дополнительное веселье, потому что она не использует эту модель для терминального ввода-вывода. Скорее, он использует собственную другую модель, которая воплощает в себе понятия «локальных» и «удаленных» ключей, что на самом деле совсем не относится к переключению приложения/нормального режима DEC VT; и он имеет единый механизм локального/дистанционного переключения, который в конечном итоге обеспечивает неразделимое переключение обеих клавиатур между приложениями и обычными режимами.

terminfo — это способ не привязываться к одному конкретному типу терминала при настройке ZLE, на тот случай, если вы обнаружите, что у вас есть терминал или эмулятор терминала, который не имитирует DEC VT. И оболочка Z предоставляет вам способы доступа к необходимым записям возможностей из записи базы данных. Таким образом, вы можете прочитать из terminfo, какие управляющие последовательности terminfo ожидает от клавиш курсора вверх/вниз/влево/вправо,и введите соответствующие команды bindkey, которые сопоставляют эти управляющие последовательности с виджетами.

Проблема в том, что terminfo не подходит для этой работы. У него есть только способ записать одну управляющую последовательность для каждой клавиши, тогда как, как вы можете видеть, клавиши могут отправлять как минимум три разные последовательности, в зависимости от режима и нажатых модификаторов. (Модификаторы могут значительно влиять на отправляемые управляющие последовательности в модели DEC VT. )Итак, вам нужно переключить терминал в режим, который генерирует то, что вам сообщает terminfo.

Но становится еще хуже :terminfo не согласован. Единственная управляющая последовательность иногда представляет собой последовательность прикладного режима DEC VT, так как terminfo записывает для тип терминала putty, иногда последовательность нормального режима DEC VT, поскольку terminfo записывает для терминал rxvt. введите , но не последовательность DECFNK. Таким образом, у вас нет возможности узнать, следует ли вам переключиться в приложение или в обычный режим с любым терминалом или эмулятором терминала. То, что будет работать правильно для одного, пойдет не так для другого.

Другой подход, таким образом, состоит в том, чтобы игнорировать terminfo и осознавать, что вы уже и вполне счастливо предполагаете, что ваш терминал всегда будет похож на DEC VT с исходной командой bindkey. Вам просто нужно два из них, чтобы убедиться, что ваш терминал находится в режиме приложения или в обычном режиме, управляющая последовательность, которую он отправляет, будет соответствовать:

bindkey "^[OA" history-beginning-search-backward

Однако это не справится с нажатыми клавишами-модификаторами, которые добавляют дополнительные параметры к последовательности управления CUP, что приводит к сбою упрощенного сопоставления строк, которое использует ZLE, когда все, что он ищет, является обычным без параметров CUP. Вы должны вручную ввести дополнительную команду bindkeyдля каждой возможной управляющей последовательности CUP, являющейся результатом каждой возможной комбинации модификаторов.

seq 1 8 |
while read -r i
do
    bindkey "^[[1;${i}A" history-beginning-search-backward
done

ZLE здесь не одинок. Другие программы на базе terminfo -,такие как оболочка fish, страдают таким же образом. (Разработчики оболочки fishтакже обнаружили, что тот выбор приложения/нормального режима, который подходит для одного эмулятора терминала, будет неправильным для другого. )Изменение архитектуры этого (сравнения libtermkey, которое имеет фактический парсер управляющей последовательности ECMA -48 для ввода )в этих программах, давно назрело. Но никто -еще не занимался этим.

Дополнительная литература

2
27.01.2020, 21:13

Теги

Похожие вопросы