Enregistrer plus de positions corsor (avec tput?) Dans le terminal bash

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