Je sais que tput sc
enregistre la position actuelle du curseur et que tput rc
restitue exactement à l’endroit où tput sc
était appelé. Le problème est que chaque fois que tput sc
est appelé, il écrase la position enregistrée précédente.
Existe-t-il un moyen de sauvegarder davantage de positions, par exemple tput sc pos1
et tput sc pos2
qui peuvent être restaurées avec, par exemple, tput rc pos1
et tput rc pos2
respectivement? (La solution n’a pas besoin d’utiliser tput
, je l’ai mentionnée car c’est la seule commande que je connaisse qui gère la position du curseur)
Sinon, existe-t-il un moyen de sauvegarder au moins la position du curseur localement dans une fonction, de sorte que si une fonction utilise tput sc
, puis appelle une autre fonction qui tput sc
, chaque fonction restaure sa propre position de curseur enregistrée lors de l’appel de tput rc
?
Merci d’avance.
Vous pouvez utiliser la fonction suivante pour extraire la position actuelle du curseur dans un tableau simple:
extract_current_cursor_position () { export $1 exec < /dev/tty oldstty=$(stty -g) stty raw -echo min 0 echo -en "\033[6n" > /dev/tty IFS=';' read -r -d R -a pos stty $oldstty eval "$1[0]=$((${pos[0]:2} - 2))" eval "$1[1]=$((${pos[1]} - 1))" }
(la source de code utilisée dans cette fonction a été prise et adaptée à partir de cette réponse )
Maintenant, par exemple, pour enregistrer la position actuelle du curseur dans pos1
, utilisez:
extract_current_cursor_position pos1
Pour enregistrer la position actuelle du curseur dans pos2
, utilisez:
extract_current_cursor_position pos2
Pour voir les positions du curseur enregistrées dans pos1
et pos2
, vous pouvez utiliser:
echo ${pos1[0]} ${pos1[1]} echo ${pos2[0]} ${pos2[1]}
Pour déplacer / restaurer la position du curseur sur pos1
, vous devez utiliser:
tput cup ${pos1[0]} ${pos1[1]}
Pour déplacer / restaurer la position du curseur sur pos2
, vous devez utiliser:
tput cup ${pos2[0]} ${pos2[1]}
tput
commande tput
fonctionne via des séquences de contrôle de terminal, répertoriées ici: http://sydney.edu.au/engineering/it/~tapted/ansi.html Il existe une séquence pour extraire la position actuelle (Query Cursor Position – \e[6n
) et on dirait que ce n’est pas présent en tput
. Pour l’extraire, utilisez:
stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??} 30;1
Vous pouvez maintenant extraire la position de ligne enregistrée dans $x
dans une autre variable et déplacer votre curseur à l’aide de tput cup
:
$ echo $my_saved_pos 12 $ tput cup $my_saved_pos 0
tput
été mentionné avec un ?
, considérez donc les codes de mouvement des codes ANSI:
$'\e[s'
– Enregistre la position actuelle $'\e[u'
– Restaure la position précédente Exemple:
$ printf "\e[s\e[6CWORLD\e[uHELLO\n" HELLO WORLD