= This Page =

diese seite ist eine vorbereitung fuer ein paar vortraege bei der c-base.

Vortragende:
 * Anselm "mnemonikk" Helbig
 * Sven "SvenG" Guckes

{{{
(1) Einfuehrung von GNU screen
(2) Einfuehrung von tmux
(3) Workshop zu tmux
}}}

related tools:
 * detach
 * dvtm
 * twin

= Colors =

256 colors.  depends on surrounding 

= Window Title =

defaut title:  first process

= Window Number =

es geht.

= Command Line =

key binding
tab completion of command names and options

scripting: sequences?  branches/conditional!

= Copy+Paste =

default key bindings a la emacs
no incremental search though

buffer list

= Misc =

synchronize panes: ...

sinnvolle defaults
statuszeilen
CTRL-B als command key
(entwicklung innerhalb screens mit CTRL-A als command key)
mehrfaches splitting (hor+vert), persistent ueber detach+reattach
sharing of windows between sessions

- Sessions =
spezialfall: sessions mit teilmenge einer anderen session
permissions: nur fuer einen ganze session

= Window Splitting =
screen: a split is for all windows
tmux: splits are per window (panes)

window numbers and clock in ascii

farben

= Development =

BSD license
OpenBSD
-> CVS

= Communication =

chat, mail, wiki
sourceforge

= Tmux-Vortrag =

Anselms Notizen zum tmux-Vortrag auf dem Linuxtag 2010.

== Was ist tmux? ==

Tmux ist ein "Terminal-MUltipleXer" wie GNU screen. 

== Was ist ein Terminal-Multiplexer? ==

Ein Terminal-Multiplexer ist ein Terminalprogramm (vergleiche
z.B. gnome-terminal), das selbst in einem Terminal laeuft. Man findet
teilweise Features, wie sie auch in konventionellen Terminalprogrammen
vorhanden sind:

 * mehrere "Reiter"
 * Copy & Paste
 * zurueckrollen ("scrollback buffer")

Im Unterschied zu den gaengigen Terminalprogrammen

 * benoetigt der Terminal-Multiplexer keine grafische Oberflaeche
 * kann auf einem entfernten Rechner in einer SSH-Sitzung laufen
 * kann auch im Hintergrund laufen

== Was ist der Unterschied zwischen tmux und GNU screen? ==

 * Tmux ist wesentlich juenger (ca. 2007, screen ca. 1987) und wird aktiv weiterentwickelt.
 * Tmux ist Teil von OpenBSD und steht unter der BSD-Lizenz, screen gehoert zum GNU-Projekt und steht unter der GPL.
 * Tmux ist kleiner, schneller und verbraucht weniger Speicher und CPU.
 * Tmux ist leichter zu konfigurieren, z.B. ist die Fensterliste in der Statusleiste standardmaessig sichtbar (vgl. byobu-Projekt fuer screen AKA screen-lauchner).
 * Tmux laesst sich besser skripten.

Screen unterstuetzt mehr (obskure) Terminals, kann ohne Hilfsprogramme
via telnet und die serielle Schnittstelle kommunizieren. Gemeinsames
Arbeiten in derselben Screen-Sitzung wird besser unterstuetzt (ACLs).

== Features von tmux ==
=== Allgemeine Struktur ===

{{{
Server  => hat (mehrere) "Sessions"
Session => hat (mehrere) "Windows"
Window  => hat (mehrere) "Panes"

0:1.2   => Session 0, Window 1, Pane 2
}}}


=== Panes ===

 * Horizontal und vertikal splitten mit C-b " und  C-b %.
 * Layout waehlen mit C-b M-1 bis C-b M-4
 * Anders als bei screen bleiben gehoeren die Splits zum "window" und nicht zur Session und bleiben beim Umschalten erhalten. Das ist eher vergleichbar mit dem Verhalten von kachelnden Fenstermanagern wie Dwm, Xmonad oder Awesome.
 * Panes lassen sich mit join-pane auf andere Windows schieben oder per break-pane in ein neues Window ueberfuehren.

=== Skripte ===

Befehle lassen sich ueber die interaktive Eingabezeile (C-b :, bietet
TAB-Vervollstaendigung) oder ueber das tmux-Kommando absetzen,
Beispiele:

{{{
tmux new-window -d htop              # oeffnet htop in einem neuen Fenster, dieses wird nicht automatisch selektiert
tmux send-keys -t :3 q               # schickt das Zeichen "q" an das Fenster mit der Nummer 3 (koennte z.B. htop beenden)
tmux new-window                      # oeffnet ein neues Fenster mit einer Shell und selektiert es
tmux send-keys -t :3 "echo foo" C-m  # auch Steuerzeichen koennen mit send-keys gesendet werden
}}}

Durch die folgenden Kommandos werden zuerst drei vim-Instanzen mit drei verschiedenen Dateien in drei Panes im neuen Fenster "3" geoeffnet. Danach wird das Layout angepasst und ein Modus aktiviert, in dem alle Tastendruecke an alle Panes weitergeleitet werden. 
{{{
tmux new-window   -d -t :3 "vim foo.txt"
tmux split-window -d -t :3 "vim bar.txt"
tmux split-window -d -t :3 "vim baz.txt"
tmux select-layout -t :3 even-vertical
tmux set-window-option synchronize-panes on
}}}

Hier ein Beispiel, wie man diese Funktionalitaet als Shellfunktion umsetzen koennte:
{{{
multivim() { 
  tmux new-window "vim $1"
  shift
  for file in "$@"; do
    tmux split-window "vim $file"
  done
  tmux select-layout even-vertical
  tmux set-window-option synchronize-panes on
}
}}}

=== Buffer ===

C-b [ geht (wie in screen) in den Copy-Modus, der, anders als bei
screen, standardmaessig Emacs-Keybindungs unterstuetzt. Anders als bei
screen gibt es mehrere "paste buffer".

{{{
tmux capture-pane  # speichert den sichtbaren Bildschirminhalt in einen Buffer
tmux list-buffers  # zeigt alle vorhandenen Buffer, reisst den Inhalt an
tmux show-buffer   # schreibt den Inhalt eines Buffers an die Standardausgabe
tmux load-buffer   # liest den Inhalt einer Datei in einen Buffer
tmux save-buffer   # schreibt einen Buffer in eine Datei
}}}

=== Weitere Funktionen ===

{{{
C-b w (choose-window)  # grafische Fensterliste
C-b q (display-panes)  # Panes koennen per Ziffer angewaehlt werden
}}}

Die Fenstergroesse wird, wenn noetig, verkleinert. Eine Session kann
man mehrmals offen haben oder ein Fenster auf verschiedenen Sessions
betrachten (innerhalb desselben Servers).

== Tmux in Ubuntu ==

Tmux ist seit karmic koala (9.10) in "universe", aktuell ist Version
1.1 (vom 2010-11-05) in lucid lynx (10.04) verfuegbar.  Die aktuelle
stabile Version von tmux ist 1.2 (vom 2010-03-10). Es ist auch nicht
schwer, tmux aus den Quellen zu bauen, die Entwicklung findet in CVS
statt, die einzigen Abhaengigkeiten sind libevent und ncurses.



EOF