Por que Esc-[ não rola para a esquerda em `menos`?

Por que Esc-[ não rola para a esquerda em `menos`?

De acordo compágina de manualpara lesskey, as seguintes teclas estão vinculadas à rolagem para a esquerda e para a direita:

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

As teclas de seta e Esc-(/ Esc -)funcionam bem, assim como Esc-]a rolagem para a direita, mas Esc-[não funcionam para a rolagem para a esquerda. Em vez disso, apenas mostra isso no prompt da linha de comando:

ESC[

Adicionar esta linha às ~/.lesskeyfunções como uma solução alternativa:

\e[ left-scroll

Mas por que não funciona por padrão?

Eu observei esse comportamento no XFCE4 no Debian stretch, bem como no Kubuntu 18.04, bem como em uma variedade de emuladores de terminal.

$ 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

Pensei em preencher um relatório de bug, masa lista de bugs conhecidos e solicitações de recursos sugere que é um comportamento conhecido:

Solicitações de melhorias

[. . . ]

Número de referência: 175

Implementado na versão: 322

Adicione um comando alternativo para ESC-[.

Isso é realmente uma limitação lessou é uma peculiaridade na maneira como os terminais lidam com a tecla Escape?

Responder1

É porque ESC [também é o início da sequência de caracteres enviados por diversas teclas de função em alguns terminais, como Homeou Endou PageUp... Esses também estão vinculados a alguma ação em less.

Então, quando lessrecebe um ESC [, ele está esperando por mais (sem atingir o tempo limite, como fazem alguns outros aplicativos).

No meu terminal ESC[6~está PageDown. Se eu pressionar Alt+[, vejo ESC [como você vê. Mas então posso entrar 6e ~rolar para baixo.

Se você executar TERM=vt100 lessem vez de less, onde a vt100página terminfo não possui nenhuma entrada para Homeou End... você verá ESC [que funciona.

Se, no entanto, você adicionar \e[ left-scrollao seu ~/.lesskey(e executar lesskeypara compilá-lo ~/.less), você notará que os ESC [trabalhos rolam para a esquerda, mas todos os Home, PageUP... param de funcionar, todos rolam para a esquerda e os caracteres extras que eles enviam causam alguns bipes.

Olhando para o código, o que importa é a ordem em que a tabela de comandos é processada. A ~/.lesstabela de comando éadicionado por último, masinserido na cabeça, então suas entradas são processadasantesos embutidos.

Após uma ESC [entrada, se a entrada for \e[ left-scrollfor encontrada primeiro, ela será processada; se aquela for \kD forw-screen(que em muitos terminais se traduz como \e[6~ forw-screen) for encontrada primeiro, entãoé apenas umprefixocorresponder, elessespera por mais entrada.

Então, é uma espécie de bug. A solução seria adicionar um tempo limite. Adicionar um tempo limite curto significaria, no entanto, desistir de comandos com várias teclas; um longo tempo limite para dar tempo suficiente para um usuário inserir um comando com várias teclas provavelmente deixaria ESC [de responder.

Agora, os terminais que possuem PageUp, etc, geralmente também possuem Leftuma Rightchave que também está vinculada a left-scroll, right-scroll, então você pode querer usá-la para rolar.

informação relacionada