Aus Linux-Magazin 06/2013

Perl-Skript steuert Tmux-Konfiguration

© mreco99, 123rf.com

Statt die Fenster einer Entwicklungsumgebung stets aufs Neue manuell zurechtzuzupfen, lässt Perl-Meister Michael Schilli den Terminal-Multiplexer Tmux nur seine Konfigurationsdateien restaurieren.

Wer keine Entwicklungsumgebung wie Eclipse zum Programmieren nutzt, sondern viel auf der Kommandozeile eines Terminalfensters tippt, dem ist »screen« bestimmt nicht fremd. Das betagte Terminal-Utility stellt unter anderem sicher, dass nach Netzwerkproblemen der Initiator einer abgebrochenen SSH-Session genau dort problemlos fortsetzen kann, wo er aufgehört hatte zu tippen. Dabei stellt »screen« sich zwischen Anwender und im Terminal ablaufende Applikationen und gaukelt diesen aufmerksame User vor, auch wenn die schon längst ins Wochenende abgezischt sind.

Bekanntlich ist die Unix-Welt in den vergangenen 20 Jahren nicht stehen geblieben, und so hat sich das vergleichsweise junge Projekt Tmux [2] angeschickt »screen« zu verbessern und abzulösen. Wie »screen« bietet Tmux dem User mehrere Sessions, die wiederum aus so genannten Windows bestehen, was im Screen-Jargon keine Desktopfenster, sondern im gleichen Terminalfenster umschaltbare Textoberflächen sind. Mit Tastatur-Shortcuts unterteilt Tmux diese Fenster bei Bedarf noch weiter in vertikal oder horizontal angeordnete Panes (Fensterscheibe), die alle gleichzeitig sichtbar sind (Abbildung 1).

Tmux läuft auf allen gängigen Plattformen. Wer also mal auf einem Linux-Desktop und unterwegs auf einem Macbook arbeitet, findet in beiden Umgebungen die gleichen Windows und Panes vor.

Abbildung 1: Zwei »tmux«-Kommandos teilen das Window erst in zwei horizontale Panes und die rechte Pane anschließend in zwei vertikale.

Abbildung 1: Zwei »tmux«-Kommandos teilen das Window erst in zwei horizontale Panes und die rechte Pane anschließend in zwei vertikale.

Online PLUS

In einem Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/plus/2013/06

Server und Client

Ein automatisch gestarteter Tmux-Server behält den Überblick über aktive Sessions, der User kann sie per Kommandozeile fernsteuern. Das »tmux« -Kommando legt neue Sessions an oder zerstört sie wieder, fügt Fenster hinzu oder löscht sie und baut Panes ein und aus, vergrößert oder verkleinert sie. Für Entwicklungsumgebungen mit mehreren Windows und Panes bietet es sich an, die mühevolle Konfiguration im Sourcecode-Repository zu speichern und bei Bedarf mit einem einzigen Kommando anzuzeigen.

Tmux kann in den Panes auch Applikationen starten, den Lieblingseditor beispielsweise, der gleich eine Projektdatei lädt. Eine andere Pane startet vielleicht schon die Testsuite und eine dritte zeigt mit »tail« das Ende einer Logdatei an.

Anpassen erwünscht

Ein frisch installiertes Tmux wartet mit seltsamen Tastaturkombinationen auf. Um in einer Tmux-Session nicht die laufende Applikation wie den Editor anzusteuern, sondern den zwischengeschalteten Terminal-Multiplexer, tippt der User das so genannte Prefix. Eine jungfräuliche Tmux-Installation hat dafür [Ctrl]+[B] eingestellt, eine Tastenkombination, die bei häufigen Gebrauch nicht nur Sehnenscheidenentzündungen provoziert, sondern in Vi auch ein gängiges und damit geblocktes Kommando ist.

Glücklicherweise erlaubt Tmux alles umstellen, und so stöpselt jeder Realo sofort nach der Installation seine eigene ».tmux.conf« -Datei zusammen, meine ist auf [3] dokumentiert. Sie beruht letztlich nur auf allgemeinen Empfehlungen, etwa das Prefix »screen« -kompatibel auf [Ctrl]+[A] zu stellen und den Rest auf »vim« -ähnliche Kombinationen: [H]=links, [J]= abwärts, [K]=aufwärts, [L]=rechts. Damit brauche ich zum Wechseln zwischen den Panes keine Emacs-ähnlichen Textkommandos anzugeben, sondern springe mit Prefix,[H] zum Beispiel in die Pane linker Hand.

Angepasste Shortcuts bringen natürlich gewisse Nachteile mit sich, etwa dass jeder einen anderen Tmux-Dialekt versteht und in fremden Umgebungen hilflos zappelt wie eine Käfer auf dem Rücken. Jederzeit versteht Tmux aber ausgeschriebene Kommandos, die es mit der Tastenkombination Prefix,[:] (Prefix gefolgt von einem Doppelpunkt) auf der Statuszeile entgegennimmt.

Die gleichen Kommandos akzeptiert »tmux« auf der Kommandozeile, sodass zusammengezimmerte Skripte, die eine Fenstergruppe aufsetzen, global gültig sind. So schickt das Perl-Skript in Listing 1 in Zeile 19 den Befehl »tmux kill-session« mit dem Namen der Session (»log4perl« ) los, falls der User es mit der Option »-k« aufgerufen hat. Der Befehl nimmt Verbindung zum Tmux-Server auf (falls dieser läuft), fragt nach der Session und lässt sie zusammenfalten.

Listing 1

tmux-setup

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Sysadm::Install qw( tap cd );
04 use Log::Log4perl qw(:easy);
05 use Getopt::Std;
06 sub tmux; # declare as function
07
08 my($home)   = glob "~";
09 my $session = "log4perl";
10
11 getopts "vk", \my %opts;
12
13 my $loglevel = $INFO;
14 $loglevel = $DEBUG if $opts{ v };
15
16 Log::Log4perl->easy_init( $loglevel );
17
18 if( $opts{ k } ) {
19   tmux "kill-session", "-t", $session;
20   exit 0;
21 }
22
23 tmux "source", "$home/.tmux.conf";
24
25 if( 0 == tmux "has-session",
26               "-t", $session ) {
27   DEBUG "Session $session already exists";
28 } else {
29   DEBUG "Creating session $session";
30   tmux "new-session", "-s", $session,
31         "-d";
32   tmux "split-window", "-h";
33   tmux "split-window", "-v";
34   tmux "send-keys", "-t", "$session:0.0",
35   "vim -p `find . -name '*.pm' | head -2`",
36     "C-m";
37   tmux "send-keys", "-t", "$session:0.1",
38        "perl Makefile.PL; make test", "C-m";
39   tmux "send-keys", "-t", "$session:0.2",
40        "vim t/*.t", "C-m";
41 }
42
43 tmux "attach", "-t", $session;
44
45 ###########################################
46 sub tmux {
47 ###########################################
48   my( $stdout, $stderr, $rc ) =
49      tap "tmux", @_;
50
51   return $rc;
52 }

Nur einmal

Die Option »-v« (verbose) veranlasst Listing 1 dazu, die Log4perl-Konfiguration auf den Loglevel »$DEBUG« zu stellen, während es sonst mit »$INFO« weit weniger geschwätzig ist. Damit das Skript nicht jedes Tmux-Kommando ausschreiben muss, ruft die Funktion »tmux()« ab Zeile 46 das Kommando »tmux« über die Shell auf. Die Funktion »tap()« aus dem CPAN-Modul Sysadm::Install leitet dies in die Wege. Die Klammern bei den Aufrufen von »tmux()« sollen wegfallen dürfen, darum deklariert Zeile 6 sie als Funktion im aktuellen Namespace.

Zeile 23 liest mit »source« die Konfigurationsdatei ».tmux.conf« aus dem Homeverzeichnis des Users ein. Eigentlich sollte »tmux« dies automatisch tun, doch die beim Testen verwendete Version sah sich dazu nicht berufen – wohl ein Bug. Des Weiteren prüft es in Zeile 25 mit dem Befehl »tmux has-session« , ob die aufzusetzende Tmux-Session vielleicht schon läuft, und fällt durch bis zum Befehl »attach« in Zeile 43, falls die Session schon steht, um sich nur noch mit ihr zu verbinden.

Falls die Session noch nicht bekannt ist, erzeugt der Befehl »new-session« in Zeile 30 eine neue mit dem Namen »log4perl« . Der Name der Session verweist auf das Log4perl-Projekt, in dessen Git-Repository sie als Entwicklungsumgebung Dienst tut. Der Parameter »-d« (detach) am Schluss des Tmux-Kommandos bestimmt, dass das Skript nicht sofort in die Session hineinspringt und das GUI darstellt, sondern brav bis zum Befehl »attach« in Zeile 43 rattert, ehe der User etwas zu sehen bekommt.

Fenster, spalte dich!

Die »split-window« -Anweisungen ab Zeile 32 mit den Optionen »-h« (horizontal) und »-v« (vertikal) erzeugen zusätzliche Panes im Window, indem sie das Fenster einmal horizontal und einmal vertikal teilen. Windows und Panes nummeriert Tmux von 0 beginnend durch – aber Vorsicht, eine oft genutzte Tmux-Konfigurationsoption stellt den Startpunkt der Rechnung auf 1 um!

Um also bei einem jungfräulichen Tmux die zweite Pane im ersten Window der Session »log4perl« zu adressieren, notiert Zeile 37 »log4perl:0.1« und gibt mit »send-keys« das Kommando zum Ablaufen der Testsuite mit einem abschließenden »C-m« (Return) an. Genauso könnte man aber mit »vagrant ssh« schon mal in eine Vagrant-VM wechseln, wie im vorigen Snapshot besprochen, um sicherzustellen, dass die Testsuite auch im staubfreien Reinraum abläuft.

Zeile 35 findet die ersten zwei ».pm« -Dateien in der Hierarchie des gewählten Perl-Projekts und übergibt ihre Namen dem Editor »vim« mit der Option »-p« , der sie in so genannten Tabs in der Pane auf der linke Seite anzeigt (Abbildung 2).

Abbildung 2: Ein Tmux-Window mit Editor, Testsuite und einer Testdatei.

Abbildung 2: Ein Tmux-Window mit Editor, Testsuite und einer Testdatei.

Installation

Tmux ist in den Repositories vieler Distributionen vorhanden, in Ubuntu führt

sudo apt-get install tmux

direkt zum Ziel. Weil die Tmux-Entwickler in letzter Zeit offensichtlich sehr fleißig waren, sollten Benutzer mindestens zu Version 1.7 oder gar 1.8 greifen, um in den Genuss aller in diesem Artikel vorgestellten Features zu kommen. Tüftler können den Sourcecode direkt von [2] holen und kompilieren. Wichtige Abhängigkeiten bestehen nur zu Libevent (mindestens 1.4.14 oder 2.0) und zu Ncurses. Das Skript auf [4] erledigt die Kompilationsschritte automatisch.

Im Tmux-Buch [5] gibt ein erfahrener Anwender nützliche Tipps für gängige Aufgaben – von Entwicklungsumgebungen bis zur Pair-Programmierung, bei der zwei Entwickler örtlich getrennt gleichzeitig in der gleiche Session in unterschiedliche Panes tippen. Und das Beste: Ins Source-Control-System eingecheckt kann auch der nächste Entwickler einfach die Toolumgebung aufsetzen und sofort produktiv mitarbeiten.

Infos

  1. Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2013/06/Perl
  2. Tmux: http://tmux.sourceforge.net
  3. Michael Schillis Tmux-Konfiguration: http://github.com/mschilli/dotfiles/.tmux.conf
  4. Skript zum statischen Kompilieren von Tmux auf schwierigen Plattformen: https://gist.github.com/ryin/3106801
  5. Brian Hogan, “Tmux: Productive Mouse-Free Development”: Pragmatic Bookshelf, 2012

Der Autor

Michael Schilli arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er nach praktischen Anwendungen der Skriptsprache Perl. Unter mailto:mschilli@perlmeister.com beantwortet er gerne Fragen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben