Я только что загрузил стабильную версию и получил ту же ошибку, что и вы. Я попытался использовать предыдущую версию, она отображала сообщение, но сразу же продолжила. Я подозреваю, что у нас есть некоторая несовместимость с последней версией.
На большинстве терминалов, подобных xterm -, кнопка Вверх(и аналогичная ей клавиша для большинства навигационных клавиш )отправляют либо ␛[A
, либо ␛OA
в зависимости от того, был ли терминал переведен в . ] клавиатура передает режим или нет. Записи smkx
и rmkx
terminfo могут использоваться для перевода терминала в этот режим или из него.
Курсор с клавишей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
См. также:
Хотя они и не так увлекательны, как редактирование клавиш, которые действительно забавны.
У вас есть два набора клавиш курсора на клавиатуре, один на клавиатуре курсора и один на клавиатуре калькулятора .
Большинство эмуляторов терминалов пытаются (иногда довольно плохо )использовать модель DEC VT, где каждый набор клавиш индивидуально переключается между режимом приложения и нормальным режимом используя настройки приватного режимаDECCKM
(Режим клавиатуры курсора )иDECNKM
(Режим цифровой клавиатуры )соответственно. Суть режима приложения заключается в том, что клавиши на соответствующей клавиатуре превращаются в дополнительные функциональные клавиши приложения.
CUB
, CUF
, CUU
и CUD
, если только и #x2387; Модификатор Alt действует, и в этом случае они отправляют управляющие последовательности DECFNK
.SS3
одиночную -сдвиг 3 последовательности.CUB
, CUF
, CUU
и CUD
, если только и #x2387; Модификатор Alt действует, и в этом случае они отправляют управляющие последовательности DECFNK
или если комбинация числовой блокировки и сдвига не заставляет их отправлять цифры.SS3
одиночных -сдвигов на 3 последовательности (, если, опять же, комбинация цифровой блокировки и сдвига не заставляет их отправлять цифры ).Последовательность ␛
[
A
, которую вы указали ZLE для привязки к виджету, является псевдонимом ECMA -48 7 -для управляющей последовательности CSI
A
, которая является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 для ввода )в этих программах, давно назрело. Но никто -еще не занимался этим.