Conserver les splits dans screen

Screen est génial mais il a un défaut : si vous le spliter, une fois détaché, vous perdez votre découpage. Il existe pourtant une astuce…

Explication

Le principe de screen est de permettre de lancer des programmes dans un terminal, de fermer ce terminal sans les arrêter et d'en reprendre le contrôle de n'importe où en toute transparence.

Screen perd ses splits lors du détachement. Donc, pour ne pas perdre les splits il faudrait ne pas détacher screen ce qui lui fait perdre tout son intérêt…

Mais puisque screen permet à un programme de ne pas s'arrêter, nous pourrions utiliser screen pour lancer screen ! Il suffirait alors de détacher/rattacher le screen parent pour accéder au screen enfant qui lui ne serait jamais détacher (puisqu'enfermé dans le screen parent)…

Démonstration

On commence par démarrer le screen enfant :

screen

On s'en détache avec Ctrl+a d. On peut vérifier sa présence avec screen -ls :

$ screen -ls
There is a screen on:
    30237.pts-0.pluton    (27.04.2010 23:13:12)    (Detached)
1 Socket in /var/run/screen/S-sbskl.

On lance ensuite le screen parent :

screen

Une fois le screen parent lancé, on rattache le screen enfant :

screen -r

Dans l'absolu, c'est terminée à deux détails près : Le premier est que pour dialoguer avec screen on utilise Ctrl+a mais là nous avons un screen dans un screen. Donc pour dialoguer avec le screen parent, pas de problème (mais aucun intérêt puisque qu'il se contente d'héberger le screen qui nous intéresse), c'est toujours Ctrl+a mais pour dialoguer avec le screen enfant il faut utiliser Ctrl+a a. Exemple, pour afficher la liste des terminaux de l'enfant : Ctrl+a a ". Le deuxième détail est que si vous avez personnalisé le fichier .screenrc avec une belle hardstatus, le parent et l'enfant auront chacun la leur. Pas très jolie…

Amélioration

Pour résoudre ces deux problèmes, nous allons dire au screen parent d'utiliser un fichier de configuration spécifique qui contiendra une redéfinition de Ctrl+a ainsi qu'un rattachement automatique au screen enfant. Nous l'appellerons .screenrc-parent :

escape ``
screen screen -r

Notez bien qu'il s'agit de l'apostrophe inversé (AltGr+7)

Résumé

Commencez par lancer le screen que vous allez utiliser (il utilise votre beau .screenrc):

screen

Détachez le avec Ctrl+a d et lancez le screen parent :

screen -c .screenrc-parent

Ô miracle… vous êtes directement dans votre screen enfant !

Maintenant, vous pouvez spliter avec Ctrl+a S (ou Ctrl+a | pour un split vertical) et faire tout ce que vous voulez dans screen.
Par contre pour détacher screen sans perdre vos splits, il faut soit fermer la fenêtre ou détacher le screen parent, avec `d (AltGr+7 d).

Pour vous rattachez et retrouvez vos splits :

screen -dRR

Voilà !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *