Start | Anteckningar | Motorcyklar | Recept | Temperaturer

Screen

Konfiguration

Jag använder programmet screen väldigt ofta för att kunna återansluta till sesisoner på maskiner jag loggar in och ut från. Dels behålls alla inställningar och startade program fortsätter köra, dels ser jag att när screen är avslutat så har maskinen bootat om. Problemet är att i grundutförande finns det lite småsaker jag stör mig på:

Det visade sig att även om konfigfilen ser ganska rörig ut så var allt utom statusfältet ganska rättframt. Min ~/.screenrc

# ----- Use scroll mouse for the scrolling -----
termcapinfo xterm|xterms|xs|rxvt ti@:te@
# ----- Start two named sessions -----
screen -t emacs emacs -nw
screen -t console
screen -t console
# ----- Misc settings -----
defscrollback 2000
startup_message off
bind f eval "hardstatus alwaysignore"
bind F eval "hardstatus alwayslastline"
# ----- The status bar at the bottom -----
hardstatus on
hardstatus alwayslastline
hardstatus string "%{= kC}%H| %{ =g}%-w%{= W}%f%t%{-}%+w %-= %{C}|%Y-%d-%m %{W}%c%{g} "

...och här är resultatet:

"Defrag"

En sak jag länge har stört mig på med GNU Screen är att när man stänger terminaler i oordning och öppnar nya så startar nyöppnade terminaler där det "finns hål" i nummerordningen. Jag vill att alla nya terminaler skall hamna bredvid varandra och vill alltså kunna "defragmentera" min session då och då.

Jag har inte kunnat hitta ett snyggt sätt att göra det på då jag inte kan dumpa en fönsterlistning till stdout och använda för omnumreringen. Istället tvingades jag loopa från 0 till EttHögtTal<TM> och dumpa skärminnehållet i varje. Med den informationen kan man sedan organisera om. Fult, men fantastiskt behändigt!

defragscreen.sh

#!/bin/bash

tmpdir=$HOME/tmp/screen
[   -d $tmpdir ] && \rm $tmpdir/*
[ ! -d $tmpdir ] && mkdir -p $tmpdir

for win in {0..100}
do
   screen -X at $win hardcopy $tmpdir/$win
done

cd $tmpdir
i=0
for win in `echo *`
do
   if [ $win != $i ]
      then
         screen -X at $win number $i
         echo "$win -> $i"
      fi
   let "i++"
done