# scratchterm - toujours un terminal sous la main 2020-11-07T21:07:51Z Séduit par le concept de "scratchpad" présent dans i3, j'ai voulu concevoir un truc semblable, peu importe le gestionnaire de fenêtres, et si possible avec les outils de base à OpenBSD. C'est chose faîte, j'ai désormais accès à un terminal qui fait les 2/3 de l'écran et apparaît/disparaît avec un simple raccourci clavier. Sont utilisés * tmux * xwininfo * xterm avec titre, classe et nom personnalisés * xkill Cela me permet par exemple d'ouvrir un terminal pour lancer une opération longue, fermer ce terminal, puis le réouvrir plus tard pour voir où ça en est. Une démonstration sera peut-être plus claire : => /pub/videos/scratchterm.mp4 Voici comment ça marche. Tout d'abord, on récupère les dimensions de l'écran après avoir définit le nom de notre outil : ``` name=scratchterm # screen size sw=$(/usr/X11R6/bin/xwininfo -root|sed '/Width/!d;s/.* //') sh=$(/usr/X11R6/bin/xwininfo -root|sed '/Height/!d;s/.* //') ``` Ensuite, on calcule mes dimensions du terminal, disons les 2/3 de l'écran : ``` # dimension # 2/3 of screen w=$(($sw*2/3)) h=$(($sh*2/3)) ``` Toutefois, pour préciser les dimensions d'un terminal, il faut donner le nombre de colonnes et de lignes, pas un nombre de pixels... Là j'ai pas mal galéré pour trouver quelque chose d'à peu près correct. Il semble qu'un caractère fasse environ 7 pixels de large et 15 pixels de haut... ``` # a char is approx 7x15 px columns=$(($w/7)) rows=$(($h/15)) ``` Ensuite, on calcule la position sur l'écran de la fenêtre , au centre. ``` # position x=$((($sw-$w)/2)) y=$((($sh-$h)/2)) ``` Ça nous donne cette géométrie : ``` geometry="${columns}x${rows}+${x}+${y}" ``` Ensuite, on va créer une session tmux spécialement pour notre scratchterm sauf si elle existe déjà. ``` session=$name tmux start-server tmux has-session -t $session || \ tmux new -d -s $session -n $name ``` Enfin, soit on affiche notre scratchterm, soit on le ferme. Pour savoir s'il est déjà ouvert, on peut récupérer l'id de toutes les fenêtrs ouvertes pour voir s'il y a notre scratchterm dans la liste. Si oui, on la xkill, sinon, on ouvre un terminal avec la bonne session tmux : ``` # show/hide scratchterm id_=$(xwininfo -root -children | grep "$name" | awk '{print $1}') if [ -n "$id_" ]; then # window exist, kill it xkill -id $id_ else xterm -T $name -name $name -class $name -geometry "${geometry}@c"\ -e tmux a -t $session & fi ``` Dans la version que j'utilise, le terminal est st avec le patch pour avoir de la transparence. => https://st.suckless.org st ``` st -A .9 -c $name -n $name -T $name -g "$geometry" -e tmux a -t $session ``` J'ai ce script associé à un raccourci Alt-x, et je dois dire que j'ai du mal à m'en passer. :) Le script peut se trouver ici : => https://si3t.ch/code/prxbins.tgz scratchterm dans l'archive prxbins.tgz ### Une réaction? => mailto:bla@bla.si3t.ch?subject="scratchterm---toujours-un-terminal-sous-la-main" 📧 Envoyez votre commentaire par mail. => mailto:bla+subscribe@bla.si3t.ch 📫 Abonnez-vous pour recevoir les réponses => /log/commentaires/ 📚 Consultez les archives. => mailto:bla+unsubscribe@bla.si3t.ch 💨 Vous désinscrire