Salvando mais posições de corsor (com tput?) no terminal bash

5

Eu sei que tput sc salva a posição atual do cursor e tput rc restaura exatamente onde tput sc foi chamado. O problema é que toda vez que tput sc é chamado, ele sobrescreve a posição anterior salva.

Existe uma maneira de salvar mais posições? tput sc pos1 e tput sc pos2 , que podem ser restaurados com, digamos, tput rc pos1 e tput rc pos2 , respectivamente? (A solução não precisa fazer uso de tput , eu mencionei porque é o único comando que eu sei que lida com a posição do cursor)

Se não, existe uma maneira de pelo menos salvar a posição do cursor localmente em uma função, de forma que se uma função usar tput sc e, em seguida, chamar outra função que execute tput sc , então cada função restaura sua própria posição do cursor salva quando invocar tput rc ?

Obrigado antecipadamente.

    
por AndreasT 26.10.2013 / 11:49

3 respostas

5

Você pode usar a seguinte função para extrair a posição atual do cursor em uma matriz simples:

extract_current_cursor_position () {
    export 
    exec < /dev/tty
    oldstty=$(stty -g)
    stty raw -echo min 0
    echo -en "3[6n" > /dev/tty
    IFS=';' read -r -d R -a pos
    stty $oldstty
    eval "[0]=$((${pos[0]:2} - 2))"
    eval "[1]=$((${pos[1]} - 1))"
}

(a origem do código usado nesta função foi obtida e adaptada de esta resposta )

Agora, por exemplo, para salvar a posição atual do cursor em pos1 , use:

extract_current_cursor_position pos1

Para salvar a posição atual do cursor em pos2 , use:

extract_current_cursor_position pos2

Para ver as posições do cursor salvas em pos1 e pos2 , você pode usar:

echo ${pos1[0]} ${pos1[1]}
echo ${pos2[0]} ${pos2[1]}

Para mover / restaurar a posição do cursor para pos1 , você precisa usar:

tput cup ${pos1[0]} ${pos1[1]}

Para mover / restaurar a posição do cursor para pos2 , você precisa usar:

tput cup ${pos2[0]} ${pos2[1]}
    
por Radu Rădeanu 26.10.2013 / 14:29
4
O comando

tput funciona através de sequências de controle de terminal, listadas aqui: link uma sequência para extrair a posição atual (Posição do cursor de consulta - \e[6n ) e parece que não está presente em tput . Para extrair use:

stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??}
30;1

Agora você pode extrair a posição da linha salva em $x para alguma outra variável e mover o cursor usando tput cup depois:

$ echo $my_saved_pos
12
$ tput cup $my_saved_pos 0
    
por Nykakin 26.10.2013 / 13:29
1

tput foi mencionado com um ? , portanto, considere códigos de movimento de códigos ANSI:

  • $'\e[s' - Salva a posição atual
  • $'\e[u' - restaura a posição anterior

Exemplo:

$ printf "\e[s\e[6CWORLD\e[uHELLO\n"
HELLO WORLD
    
por Tom Hale 25.04.2017 / 12:40