Shift-Space em menos

9

Nos navegadores modernos e em outro software com conteúdo de texto, Spacerola mais ou menos uma tela. ShiftSpacerola para cima em tudo, menos less.

Como alguém pode usar ShiftSpacepara rolar para cima less? Ou, como alternativa, existe outro pager (a compatibilidade com POSIX é o meu único requisito) que poderia fazer o trabalho?

Foi-me dito que alguns emuladores de terminal e algumas bibliotecas de interface do usuário do terminal (ncurses?) Não reconhecem ShiftSpace. Esse é um problema válido?

Orfeu
fonte
O que há de errado com o botão PgUp ? Não grande o suficiente?
Goldilocks
@ goldilocks: não há nada errado em querer usar o Shift-Space, especialmente se você está acostumado a usá-lo com outras ferramentas. Acontece que é impossível lessdistinguir entre Espaço e Shift-Space.
Keith Thompson
Você pode configurar seu terminal (emulador) para enviar bou ^B(0x2) <shift-Space>. Note-se que bé um pouco acima da barra de espaço em várias configurações de teclado
Stéphane Chazelas
@KeithThompson: Apenas uma piada amigável, espero. Eu simpatizo; Eu gostaria de ser /adotado universalmente como "texto de pesquisa" em várias ferramentas comuns, mas, ao mesmo tempo, tenho receio de impor padrões meglomaníacos excessivos que tornam ainda mais fácil fazer algo que pode ser feito com um toque de tecla (universalmente reconhecível). Interessante saber que, nesse caso, é uma limitação técnica (consulte a resposta do 200_success) e não o design simplório que explica.
precisa saber é o seguinte
1
@KeithThompson, consulte o translationsrecurso do widget VT100.
Stéphane Chazelas 28/08

Respostas:

6

Eu acho que você trouxe um choque cultural causado por uma limitação técnica. Como Shift+ Spacegera a mesma saída que Space, o modelo de terminal Unix os trata de forma idêntica. Para distinguir entre os dois, você precisa de um ambiente de programação que suporte eventos chave acima / abaixo. Isso é possível no X11 e nos emuladores de terminal que suportam chaves de remapeamento. Um exemplo de remapeamento Shift+ Spacepara PageUp:

# For [u]rxvt, in ~/.Xdefaults:
URxvt.keysym.Shift-space: \033[5~
200_success
fonte
1
A maioria dos emuladores de terminal suporta chaves de remapeamento, portanto, é possível fazê-lo com a maioria dos emuladores de terminal ( xterm -xrm 'XTerm.VT100.translations: #override Shift <KeyPress> space: string(0x2)'no xterm, por exemplo, ou você envia a mesma sequência que a enviada <PageUp>). Obviamente, isso tornaria a digitação do texto pressionada a tecla Shift.
Stéphane Chazelas
1

Nos emuladores de terminal, esse recurso interrompe a digitação de texto em maiúsculas com espaços incorporados mantendo pressionada a tecla Shift. Por exemplo, se você quiser digitar "É um título", terá que liberar o Shift entre "A" e "T". Mantê-lo pressionado afasta o cursor e posiciona incorretamente o restante do que você digita. Acredito que seria muito mais irritante do que você ganha com o recurso de rolagem para cima.

Tendo o comportamento regular ao digitar texto e rolar para cima sempre que o Space rolar para baixo, exigiria uma reformulação e uma forte cooperação dos aplicativos (por exemplo, um aplicativo capaz de alternar o que o Shift + Space envia), tenho certeza de que isso não acontecerá.

A principal diferença é que um aplicativo GUI conhece o "contexto", esteja você editando ou visualizando conteúdo; os emuladores de terminal não têm como saber disso.

Egmont
fonte
1

Os emuladores de terminal enviam o mesmo caractere para Spacee Shift+Space. Se não o fizessem, seria estranho digitar texto enquanto mantinha pressionada a Shifttecla (consulte a resposta do @ egmont que se expande nesse argumento).

No entanto, você pode contornar isso mapeando Shift+Spacepara uma sequência de caracteres que acabariam inserindo um espaço por padrão e para o qual você poderia configurar aplicativos como lessrolar para cima com a tecla pressionada.

Por exemplo, essa sequência poderia ser ` DEL SPC(altere DELpara BSem sistemas em que BS é o erasecaractere).

Para xterm, adicione o recurso:

XTerm.VT100.translations: #override \
  Shift <KeyPress> space: string("`") string(0x7f) string(" ") 

E configure lesscom:

printf '%s\n' '#command' '`\177\40 back-screen' | lesskey -
Stéphane Chazelas
fonte
1

lessatualmente não suporta isso, mas definitivamente pode ser adicionado .

Se um programa usa uma sequência de controle xterm para definir modifyOtherKeys2 escrevendo \e[>4;2mno terminal, faz xtermanotações nas teclas com informações adicionais sobre quais teclas modificadoras estão ativas. Especificamente para a Spacechave, com modifyOtherKeysativo no xterm, Shift+ se Spacetransforma em \e[27;2;32~. lessteria que interpretar corretamente isso como Shift+ Spacee, em seguida, acionar uma rolagem para cima.

Enquanto isso definitivamente funcionaria no xterm, não funcionaria em todas as aplicações de terminal. Mas os terminais que não reconhecem essa sequência de escape para ligar modifyOtherKeysapenas ignoram essa sequência de escape e continuam enviando aos programas um caractere de espaço normal quando você pressiona Shift+ Space.

Há uma página bastante detalhada no site xterm que explica como os modifyOtherKeyscódigos são calculados: https://invisible-island.net/xterm/modified-keys.html

andrew
fonte