Detectando shift + keyup / down no terminal

6

Como faço isso? Eu quero um menu de terminal em que shift+up ou shift+down selecione várias linhas. ncurses parece ter problemas.

Eu não preciso necessariamente de uma biblioteca de terminais avançada. Eu só quero lidar com isso e, além disso, meu IO deve ser bem direto.

Algum conselho?

    
por PSkocik 22.11.2015 / 15:25

3 respostas

3

Os terminais transmitem caracteres, não chaves. A maioria dos caracteres é imprimível, o que não deixa muito espaço para codificar teclas de função e chats. As teclas de função são codificadas como sequências de escape, isto é, sequências de bytes que começam com o caractere de escape (valor de byte 27, que pode ser escrito como \e em muitas linguagens de programação). Para obter mais detalhes, consulte Como a entrada de teclado e a saída de texto funcionam?

Não existe um padrão universal sobre qual sequência de escape cada tecla ou teclado envia. A biblioteca de curses fornece uma camada de abstração que decodifica as teclas de função. Ele usa o termcap (estilo antigo) ou terminfo (moderno) biblioteca sob o capô; você pode usar termcap / terminfo diretamente se não quiser vincular com maldições.

Como alternativa, você pode codificar as seqüências de controle usuais para Up e Down . Embora não exista um padrão, quase todos os terminais enviam \eOA ou \e[A para Up e \eOB ou \e[B para Abaixo e nunca vi um terminal que enviou essas sequências para uma chave diferente.

Os keycords de Shift são outro assunto: as sequências de escape que enviam são mais diversificadas, e muitos terminais não distinguem, e. Acima de Shift + Acima . Você não pode confiar que eles sejam distintos, a menos que você suporte apenas um conjunto restrito de configurações. Existem padrões emergentes , mas eles ainda não são suportado por muitos emuladores de terminal populares.

Os terminais não enviam eventos de chave. (Seu caso de uso não os exige, de acordo com sua descrição.)

A menos que você possa solicitar um emulador de terminal específico (por exemplo, xterm recente), não dependa do usuário ser capaz de digitar Shift + Acima . Suporta um método alternativo, como uma tecla “start multiple selection” seguida de um simples Up / Abaixo .

    
por 23.11.2015 / 01:34
6

No contexto da pergunta, shift+up e shift+down referem-se a shift-cursor-up e shift-cursor-down (em vez de, por exemplo, shift-page-up e shift-page-down ), porque a pergunta foi feita sobre a seleção de vários < em> linhas .

Esta é, na verdade, mais de uma pergunta:

  • primeiro, como fazer com que as ncurses reconheçam shift+up , etc. e
  • se a biblioteca de menus ncurses faz isso e
  • como obter um menu fazendo isso, se não.

Primeiro, ncurses fornece definições predefinidas (por X / Open Curses) para um conjunto portátil (mais / menos) de chaves especiais. Referindo-se a terminfo (5) , você pode notar:

   key_sf                    kind   kF   scroll-forward key
   key_sleft                 kLFT   #4   shifted left-arrow
                                         key
   key_sr                    kri    kR   scroll-backward key
   key_sright                kRIT   %i   shifted right-arrow
                                         key

mas não há nada marcado como "tecla de seta para cima deslocada". Somente com alguma retrospectiva, pode-se relacionar kind e kri a kLFT e kRIT . Antes de adicionar suporte para chaves especiais modificadas para o xterm em 1999, havia pouca arte prévia:

Patch #94 - 1999/3/27 - XFree86 3.9Pf
add parameters to function keys to indicate if shift, control or alt are set. The codes are based on a description of a DEC VT510 with a PC keyboard, from Jeffrey Altman .

Mais tarde, esse esquema foi alterado para reduzir a confusão de aplicativos. Outros desenvolvedores que copiaram o recurso do xterm não o seguiram alterando seus programas:

Patch #167 - 2002/8/24 - XFree86 4.2.0
add modifyCursorKeys resource to control how the shift- and similar modifiers are used to make a cursor escape sequence. The default makes a modified escape sequence always start with CSI and puts the modifier as the second parameter, to avoid confusing applications that would interpret the first parameter as a repeat count. The original behavior can be obtained by setting the resource to 0 (newsgroup discussion with Stephen J Turnbull, Jeffrey Altman).

Enquanto isso, nas ncurses, parecia útil incorporá-las a descrições de terminal (porque ncurses usa o banco de dados terminal, digamos, tabelas como as que o tmux usa). Eles dependem de um recurso para recursos definidos pelo usuário introduzidos por ncurses 5.0 . No banco de dados do terminal, o recurso é mencionado para o xterm em 2004 :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

que (além de consolidar trabalhos anteriores desde 2001 ) tentou lidar com as variações codificações de modificadores que podem ser usadas com diferentes combinações de recursos xterm - bem como as semelhanças que diferem em graus variados do esquema de codificação xterm.

A convenção usada para os recursos definidos pelo usuário começou com a adição de kDN e kUP à lista (seu shift+down e shift+up ) e um número correspondente aos códigos modificadores xterm. Muito mais tarde, ficou claro que kind e kri poderiam ter o mesmo significado. Mas, como resultado, você pode encontrar descrições de terminal com kDN e kUP (que somente ncurses lê - outros aplicativos e bibliotecas que lêem o banco de dados de terminal negligenciando isso diretamente por cerca de 16 anos).

Os recursos estendidos estão resumidos no banco de dados do terminal .

Agora (começando a segunda parte), o ncurses fornece uma biblioteca de menus. Isso é (com algumas extensões, como suporte a caracteres multibyte), uma reimplementação da biblioteca de menus SVr4. Consulte a página de manual para menu_driver(3x) para isso, bem como os programas em ncurses-examples que demonstram a biblioteca. A resposta curta é que a biblioteca de menus não predefine o comportamento sobre o qual você está perguntando, mas que um aplicativo pode usar a biblioteca para fazer o que é solicitado. Comece olhando para ver como usar esse detalhe:

REQ_TOGGLE_ITEM
Select/deselect an item.

O problema maior é aquele gerado usando recursos definidos pelo usuário neste aplicativo. A maioria dos aplicativos que usam as bibliotecas de formulários e de menus baseiam-se em fazer declarações de caso com os símbolos predefinidos para chaves especiais. Para shift+up e shift+down você não teria isso (a menos que a coincidência de kind e kri fosse anotada e aplicada). Para recursos definidos pelo usuário, não há códigos de chave predefinidos (como KEY_DOWN in curses.h ). Você tem valores definidos em tempo de execução determinados pela função key_defined . Então, ao invés de uma simples declaração de caso ( é não KEY_SDOWN em curses.h ), alguma indireção é necessária.

    
por 23.11.2015 / 01:37
0

Experimente showkey ou ferramenta semelhante no prompt de comando.

Pressione a tecla de seta e, em seguida, mova + seta.

Se você obtiver ^[[A para a seta e shift + seta, por exemplo, acho que isso indica que o emulador de terminal simplesmente ignora o modificador de turno. Acabei de testar três emuladores de terminal populares e 2 de 3 ignoraram a tecla Shift.

Esta não é a melhor resposta, mas pode ajudar alguém a usar melhor um editor como Jupp , que permite a seleção de seta de deslocamento.

    
por 15.12.2016 / 10:49