Eu escrevi o seguinte script para imprimir a linha e a linha atuais toda vez que ela muda, também conhecida como toda vez que pressiono para cima, para baixo, para a esquerda ou para a direita, mas a saída é sempre a mesma:
row:43:col:141
Acredito que isso significa canto superior esquerdo da tela, onde 0 0 estaria no canto inferior direito, mas não tenho muita certeza.
aqui está meu script:
#!/bin/bash
echo "press a key"
tput clear
row=$(tput lines)
col=$(tput cols)
while true; do
echo "row:$row:col:$col"
K1=,K2=,K3=
read -s -N1
K1="$REPLY"
read -s -N1 -t 0.001
K2="$REPLY"
read -s -N1 -t 0.001
K3="$REPLY"
key="$K1$K2$K3"
case "$key" in
$'\033[A') tput cuu 1;;
$'\033[B') tput cud 1;;
$'\033[C') tput cuf 1;;
$'\033[D') tput cup $row $(($col-1));;
*) echo "pressed a key!";;
esac
row=$(tput lines)
col=$(tput cols)
done
exit 0
aparentemente não há como mover o cursor para a esquerda usando tput, então usei:
tput cup $row $(($col-1))
mas isso também não funciona, alguma idéia de como consertar?
tput lines
etput cols
retorne o tamanho atual da janela em unidades de caracteres. Se você arrastar a janela para alterar seu tamanho, você (normalmente) verá os novos valores mudarem de forma interativa. Eles não têm nada a ver com a posição do cursor.Além disso, o canto superior esquerdo da janela é (0,0). Seu canto inferior direito é atualmente (42.140), porque as posições são baseadas em zero.
tput cub1
deve mover-se para a esquerda. Todascub1
,cuf1
,cuu1
,cud1
são palavras únicas - sem espaços. Não existe cub2 etc. Além disso,tput cud1
move o cursor para a primeira coluna da linha abaixo:tput cuu1
permanece na mesma coluna da linha acima. (No entanto, isso pode ser um bug na minha configuração.)Não acho que exista uma opção tput para ler a posição do cursor. É considerado responsabilidade do programador acompanhar onde ele foi parar ou mover o cursor para onde a próxima saída de texto deve ser colocada. Você pode salvar um local com
tput sc
e restaurar esse local (talvez várias vezes) comtput rc
.cursor_address (cup), column_address (hpa) e row_address (vpa) usam números absolutos de linhas e colunas (com base em zero) e são mais úteis do que movimentos de um caractere.
O conjunto completo de comandos do terminal deve ser documentado em
man -s 5 terminfo
, mastput
é uma ferramenta bastante desajeitada (um novo processo para cada comando), portantoncurses
(ou pelo menosC
) é necessária para qualquer trabalho sério.Esta é minha breve verificação de como eles funcionam no meu arquivo
TERM=xterm-256color
.EDITAR:
Você pode otimizar o código perguntando
tput
uma vez para cada sequência que pretende usar e tendo uma função que se repete. Isso evitará chamar tantos processos externos e tornará o código mais simples e legível.O código abaixo ilustra essas otimizações. Há uma boa quantidade de código único para buscar as sequências tput e definir funções utilitárias. Depois disso, o trabalho de exibição real é breve, eficiente e bastante legível.
A substituição de processos não funciona bem nessas sequências: por exemplo, remove novas linhas. O método abaixo (leia-se, recusando todos os delimitadores) é robusto.
Este código ilustra como as teclas do cursor podem ser usadas para mover-se
X
pela tela.O tamanho da tela é
0 ≤ row < rows
e0 ≤ col < cols
.Use as teclas do cursor para se movimentar e Escsair. Não seria difícil modificar o código das operações esquerda/direita para lidar com o wraparound. Nem seria terrivelmente difícil permitir que caracteres impressos fossem gravados na tela, no estilo de um processador de texto.