Comando Posix que move o cursor para uma posição específica na janela do terminal

3

na escola nos foi atribuído um dever de casa no qual devemos imprimir uma arte ascii em uma janela de terminal. Uma entrada é um dado no formato [x_coordinate, y_coordinate, char_ascii_value] (não há dados para coordenadas onde não se deve imprimir nenhum caractere). Eu não tenho nenhum problema em realmente fazê-lo, mas eu acho que estou simplesmente com preguiça de entrar no ciclo e imprimir um espaço vazio toda vez que não há dados para o personagem, então vá para outra linha no terminal e faça o mesmo, etc .

Então eu estava pensando que deve haver um jeito mais fácil! Como temos permissão para trabalhar apenas com comandos que estão em POSIX, existe algum comando que permita mover o cursor para uma posição específica no terminal?

Eu corri para o comando chamado tput e tput cup faz exatamente o que eu preciso, mas não tenho certeza se tput cup está em POSIX.

P.S. Por favor, não tome isso como uma espécie de trapaça. Estou apenas tentando encontrar uma maneira de facilitar minha vida em vez de escrever código sem cérebro.

    
por Xoroxoxoxoxoso 17.06.2015 / 19:15

2 respostas

4

Como o mikeserv explica, o POSIX não especifica tput cup . POSIX especifica tput , mas apenas minimamente. Dito isto, tput cup é amplamente suportado!

A maneira padronizada de posicionar o cursor é usar seqüências de escape ANSI . Para posicionar o cursor, você usaria algo como

printf "[%d;%dH%s" "$Y" "$X" "$CHAR"

, que imprimirá $CHAR na linha $Y e na coluna $X . Uma solução mais completa seria

printf "7[%d;%dH%s8" "$Y" "$X" "$CHAR"

que restaurará a posição do cursor.

    
por 17.06.2015 / 20:45
0

tput é deixado vago e mínimo em POSIX porque existe uma especificação mais detalhada em X / Open Curses:

Parece não haver um link direto para uma versão HTML do último (em particular, a linha de comando tput ), mas é mais detalhada (cerca de duas vezes mais longa). Citando a descrição em X / Open Curses:

7319 When XCURSES is supported, this description for the tput utility replaces that in the XC
7320 specification.
7321 The tput utility uses the terminfo database to make the values of terminal-dependen
7322 capabilities and information available to the shell (see sh in the XCU specification); to clear
7323 initialize, or reset the terminal; or to return the long name of the requested terminal type. Th
7324 tput utility outputs a string if the capability attribute (capname) is of type string, or an integer i
7325 the attribute is of type integer. If the attribute is of type boolean, tput simply sets the exit statu
7326 (0 for TRUE if the terminal has the capability, 1 for FALSE if it does not), and produces n
7327 output.

o programa recuperará qualquer valor do banco de dados do terminal. A maioria das plataformas que você usa fornece uma implementação de X / Open Curses. Os detalhes finos podem diferir, é claro. Em algumas plataformas, você pode encontrar uma versão de tput que usa nomes termcap em vez de terminfo . Mas não é provável que você encontre isso em uma tarefa usando "POSIX" e, em qualquer caso, você pode atingir o mesmo objetivo, usando um vocabulário ligeiramente diferente.

No entanto, nem curses nem seqüências de escape ANSI fazem parte do POSIX. Sequências de escape são padronizadas no ECMA-48:

Como regra geral, o POSIX não se sobrepõe muito a outros padrões (você encontrará a maioria das exceções a essa regra versus o padrão C). Da mesma forma, X / Open Curses não se sobrepõe muito ao ECMA-48: a forma e o conteúdo das seqüências de escape não são detalhados naquele documento.

Estritamente falando, você não pode fazer sua tarefa usando apenas o POSIX. Você só pode fazer isso usando POSIX mais a variedade usual de padrões relacionados para os quais existe uma implementação em seu sistema.

O motivo de aplicativos como tput (e bibliotecas como curses ) é fornecer uma camada para ocultar detalhes e inconsistências nas implementações. POSIX só vai tão longe, e omite a maioria dos recursos interessantes de um sistema operacional, por exemplo, gerenciamento de usuários, segurança e, claro, terminais de gerenciamento. Mesmo com sequências de escape, existem várias maneiras de mover o cursor em vários terminais. Aqui estão alguns resumos terminfo desses:

   carriage_return           cr     cr   carriage return (P*)
                                         (P*)

   column_address            hpa    ch   horizontal position
                                         #1, absolute (P)

   cursor_address            cup    cm   move to row #1 col-
                                         umns #2

   cursor_down               cud1   do   down one line

   cursor_home               home   ho   home cursor (if no
                                         cup)

   cursor_left               cub1   le   move left one space

   cursor_mem_address        mrcup  CM   memory relative cur-
                                         sor addressing, move
                                         to row #1 columns #2

   cursor_right              cuf1   nd   non-destructive

   cursor_to_ll              ll     ll   last line, first
                                         column (if no cup)

   cursor_up                 cuu1   up   up one line
                                         space (move right
                                         one space)

   parm_left_cursor          cub    LE   move #1 characters
                                         to the left (P)

   parm_right_cursor         cuf    RI   move #1 characters
                                         to the right (P*)

   restore_cursor            rc     rc   restore cursor to
                                         position of last

   row_address               vpa    cv   vertical position #1
                                         absolute (P)

   save_cursor               sc     sc   save current cursor
                                         position (P)

   tab                       ht     ta   tab to next 8-space
                                         hardware tab stop

                                         save_cursor
    
por 19.06.2016 / 10:41