Почему Esc-[ не прокручивает влево в `less`?

Почему Esc-[ не прокручивает влево в `less`?

Согласностраница руководствадля lesskeyследующие клавиши привязаны к левой и правой прокрутке:

\e[       left-scroll
\e]       right-scroll
\e(       left-scroll
\e)       right-scroll
\kl       left-scroll
\kr       right-scroll

Клавиши со стрелками и Esc-(/ Esc -)работают нормально, как и Esc-]для прокрутки вправо, но Esc-[не работают для прокрутки влево. Вместо этого он просто показывает это в командной строке:

ESC[

Добавление этой строки в ~/.lesskeyфункции в качестве обходного пути:

\e[ left-scroll

Но почему это не работает по умолчанию?

Я наблюдал такое поведение в XFCE4 на Debian stretch, а также в Kubuntu 18.04, а также в различных эмуляторах терминала.

$ less --version
less 487 (GNU regular expressions)
Copyright (C) 1984-2016  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

Я думал о том, чтобы подать отчет об ошибке, носписок известных ошибок и запросов на функции предполагает, что это известное поведение:

Запросы на улучшение

[ . . . ]

Номер ссылки: 175

Реализовано в версии: 322

Добавить альтернативную команду для ESC-[.

Это на самом деле ограничение lessили особенность того, как терминалы обрабатывают клавишу Escape?

решение1

Это потому, что ESC [также является началом последовательности символов, отправляемых несколькими функциональными клавишами на некоторых терминалах, такими как Homeили Endили PageUp... Они также связаны с каким-то действием в less.

Поэтому при lessполучении ESC [, он ждет большего (без тайм-аута, как это делают некоторые другие приложения).

На моем терминале ESC[6~есть PageDown. Если я нажимаю Alt+[, я вижу ESC [как вы. Но тогда я могу войти 6и ~и это делает прокрутку вниз.

Если вы запустите TERM=vt100 lessвместо less, где vt100на странице terminfo нет записи для Homeили End... вы увидите ESC [, что работает.

Однако если вы добавите \e[ left-scrollего в свой ~/.lesskey(и запустите lesskeyдля компиляции в ~/.less), вы заметите, что ESC [прокрутка влево работает, но все Home, PageUP... перестают работать, они все прокручиваются влево, а дополнительные символы, которые они отправляют, вызывают некоторый звуковой сигнал.

Если посмотреть на код, то все дело в порядке обработки таблицы команд. ~/.lessТаблица команддобавлено в последний раз, новставлен в голову, поэтому его записи обрабатываютсядовстроенные.

При ESC [вводе, если запись для \e[ left-scrollнайдена первой, она обрабатывается, если запись для \kD forw-screen(которая на многих терминалах переводится как \e[6~ forw-screen) найдена первой, тоэто всего лишьпрефикссоответствовать, иlessждет больше информации.

Итак, это своего рода ошибка. Исправлением было бы добавление тайм-аута. Однако добавление короткого тайм-аута означало бы отказ от многоклавишных команд; длинный тайм-аут, чтобы дать пользователю достаточно времени для ввода многоклавишной команды, вероятно, сделал бы ESC [слишком неотзывчивым.

Теперь, терминалы, которые имеют PageUp, и т. д., также, как правило, имеют клавишу Leftи Right, которые также привязаны к left-scroll, right-scroll, поэтому вы можете использовать ее вместо этого для прокрутки.

Связанный контент