tmux in der Praxis: iTerm2 und tmux

Vor- und Nachteile der lokalen Verwendung von iterm2 gegenüber tmux. So richten Sie das iTerm2-Profil so ein, dass Tastenzuordnungen überschrieben werden, um analoge tmux-Aktionen auszulösen

Dies ist der 2. Teil der Postserie „tmux in Practice“.

Sie verwenden also den iTerm2-Terminalemulator unter OSX. Und Sie haben von tmux gehört und beschlossen, es auszuprobieren. Google hier, Google dort, nach einer Weile verstehen Sie Konzepte wie Terminal-Multiplexing, Fenster, Fensteraufteilung und verstehen die Verwendung von tmux auf Remotecomputern, um den Sitzungsstatus beizubehalten und abrupte Verbindungsabbrüche zu überstehen.

Irgendwann fragen Sie sich möglicherweise, ob tmux lokal verwendet wird.

"Da iTerm bereits mehrere virtuelle Fenster in einem einzigen" physischen "Fenster erstellen kann, Fenster teilen, austauschen und die Größe ändern kann, muss ich tmux wirklich auf meinem lokalen Computer anstelle von iTerm verwenden?"

Als ich tmux lernte, war ich immer wieder auf dieselbe Frage zurückgekommen. Ohne Übung war es nicht klar. Also habe ich beschlossen, es zu versuchen, und heute kann ich Vor- und Nachteile mit Ihnen teilen.

iTerm2 vs tmux auf lokalem Computer: Vor- und Nachteile

Leistungen:

  • Benannte Fenster. Ähnlich wie Registerkarten in iTerm, aber Sie können ihnen einen Namen geben
  • Eine Statuszeile mit systemweiten Informationen. Beinhaltet CPU, Speicher, Online- / Offline-Status, Akku, Benutzer, Host und Datum und Uhrzeit.
  • Mit der Statuszeile und einer Reihe benannter Fenster kann ich iTerm in den Vollbildmodus versetzen. Dies ermöglicht es mir, in einer ablenkungsfreien Umgebung zu arbeiten und zusätzlich 3 Zeilen zu erhalten. Diese wurden zuvor von der OSX-Menüleiste, dem iTerm-Fensterrahmen und der Reihe der iTerm-Registerkarten übernommen.
  • Überwachen Sie das Fenster auf Aktivität oder Stille. Wenn ich einen Befehl mit langer Laufzeit in einem Bereich ausführe, kann ich zu einem anderen Bereich wechseln und benachrichtigt werden, wenn für einige Zeit keine Ausgabe mehr im vorherigen Bereich angezeigt wird

    iTerm hat etwas Ähnliches, aber es geht nur darum, Sie zu benachrichtigen, wenn die Ausführung zur Eingabeaufforderung zurückkehrt, und erfordert die Installation einer zusätzlichen Shell-Integration

  • Neudefinierte Fensterlayouts. Gerade-horizontal, gerade-vertikal, Haupt-horizontal, Haupt-vertikal und gekachelt
  • Möglichkeit, zwischen mehreren lokalen tmux-Sitzungen pro Projekt zu wechseln, um den Kontext einfach zu wechseln
  • Wenn Sie tmux sowohl lokal als auch auf einem Remotecomputer verwenden, erhalten Sie dieselbe vertraute Terminalumgebung
  • Wenn Sie tmux verwenden, verlassen Sie sich viel weniger auf die einzigartigen Funktionen von iTerm2

    Dies erleichtert die Migration auf einen anderen Terminalemulator , sei es auf demselben oder einem anderen Betriebssystem (Linux).

Nachteile:

  • tmux verwaltet seinen eigenen Scrollback-Puffer. Es ist schwieriger, darauf zuzugreifen und Text zu kopieren als in iTerm (einfach scrollen und mit der Maus auswählen)
  • Wenn Sie Text in tmux kopieren, wird er im eigenen Puffer von tmux gespeichert und standardmäßig nicht für die Zwischenablage Ihres Betriebssystems freigegeben. Um 100% korrekt zu sein, funktioniert die Freigabe mit der Systemzwischenablage in iTerm2, jedoch nur, weil sie OSC 52 ANSI-Escape-Sequenzen unterstützt, mit denen Anwendungen wie tmux auf Daten in der Zwischenablage zugreifen und diese speichern können. iTerm2 ist ein Sonderfall. Versuchen Sie einfach, Text in tmux zu kopieren, das im OSX-Standardterminal ausgeführt wird, das OSC52 nicht unterstützt
  • Wenn Sie bereits an iTerm-Tastenkombinationen gewöhnt sind, müssen Sie lernen und zu tmux-Tastenkombinationen wechseln , die umständlich sind. Anstelle eines einzelnen Tastenanschlags wie ⌘⌥-> benötigen Sie zwei Tastenanschläge, s: pregefolgt von einer weiteren Taste, die einer bestimmten tmux-Aktion zugeordnet ist.

Persönlich habe ich mich entschlossen, mit tmux und seinen Funktionen fortzufahren und mich weniger auf iTerm2-spezifische Funktionen zu verlassen. In der Tat, im Moment benutze ich iTerm nur als Tunnel zu tmux?

Probleme mit dem Scrollback-Puffer und der Integration in die Zwischenablage des Betriebssystems sind äußerst wichtig , sodass Sie sogar entscheiden können, die Einführung von tmux aufzugeben. Wir werden diese Themen in meinen zukünftigen Beiträgen behandeln.

Überschreiben Sie die iTerm-Tastenzuordnungen, um eine tmux-Aktion auszulösen

Lassen Sie uns heute sehen, wie wir vertraute iTerm-Tastenkombinationen verwenden können, wenn wir in einer tmux-Umgebung arbeiten. Die Idee ist, Tastenanschläge in iTerm zuzuordnen, um tmux-Aktionen auszulösen.

Der einfache Weg wäre, einfach zu gehen .tmux.confund tmux-Aktionen diesen Tastenkombinationen zuzuordnen. Um beispielsweise die Größe des Bereichs in iTerm zu ändern, verwenden wir " ^⌘↑". Lassen Sie uns denselben Tastendruck in tmux auf etwas naive Weise zuordnen:

bind ^⌘↑ resize-pane -U

Der obige Code funktioniert jedoch nicht, da Sie ⌘ nicht in tmux-Tastenkombinationen verwenden können und die Verwendung von UMSCHALT ebenfalls sehr eingeschränkt ist. Und selbst wenn dies möglich war, würde iTerm diesen Tastenanschlag schon einmal abfangen.

Stattdessen richten wir ein neues iTerm-Profil ein und überschreiben Schlüsselzuordnungen, um vorkonfigurierte Bytesequenzen zu senden, die eine entsprechende Aktion in tmux auslösen.

Wenn beispielsweise " ^⌘↑" gedrückt wird, wird eine Folge von Bytes 0x01 0x1b 0x5b 0x31 0x3b 0x35 0x41über das Terminal an die laufende tmux-Instanz gesendet. Es interpretiert sie als C-a C-↑Tastenkombination und löst resize-pane -Uentsprechend unserer .tmux.confKonfiguration aus.

Wie können Sie diese Hex-Codes erhalten? Verwendung showkey, ododer hexdumpBefehle Binärdarstellung von Tastenbetätigungen von der Tastatur anzuzeigen:

$ showkey -aPress any keys - Ctrl-D will terminate this program
^A 1 0001 0x01^[[1;5A 27 0033 0x1b 91 0133 0x5b 49 0061 0x31 59 0073 0x3b 53 0065 0x35 65 0101 0x41

Hinweis : showkeyist unter OSX nicht verfügbar, aber Sie können SSH jederzeit auf einem Linux-Remotecomputer verwenden. Wenn es sich nach einem großen Overhead anhört, verwenden Sie einfach o d oder hexdump.

$ od -t x1
^A^[[1;5A // press C-a C-↑ on your keyboar0000000 01 1b 5b 31 3b 35 410000007

Sie können jede Taste auf diese Weise neu zuordnen, aber ich mache dies nur für die meisten gängigen, die in tmux analoge Aktionen haben.

Am Ende des Tages kann ich neue tmux Scheiben erstellen verwenden ⌘Dund ⌘⇧Dwählen Sie Scheiben mit ⌘⌥→ , ^Tab - Schaltern auf die zuletzt verwendeten Fenster ⌘⇧eingeben Bereich zu vergrößern, ^⌘←Bereich nach links , um der Größe, ⌘[ zum vorherigen Fensterbereich zu wählen, ⌘Waktuelle Fenster zu töten, und so weiter. Daher muss ich für die häufigsten Aktionen nicht gegen mein Muskelgedächtnis kämpfen.

Für alle anderen Aktionen ohne Korrespondenz verwende ich immer noch tmux way: C-aPräfix gefolgt von Aktionstaste. Wenn Sie neugierig sind auf eine vollständige Liste solcher Tastenkombinationen und wie dies alles in Aktion funktioniert, schauen Sie sich mein tmux-config-Repository an.

Also, I’ve found predefined layouts to be very useful: even-horizontal, even-vertical, main-horizontal, main-vertical, tiled. I usually work in main-vertical layout, and need to swap secondary pane with main forth and back. This is so common, that I decide to setup a keybinding both in tmux (prefix \) and iTerm (⌘\).

# Swap panes back and forth with 1st pane# When in main-(horizontal|vertical) layouts, the biggest/widest panel is always @1bind \ if '[ #{pane_index} -eq 1 ]' \ 'swap-pane -s "!"' \ 'select-pane -t:.1 ; swap-pane -d -t 1 -s "!"'

As an extra step, you can setup this new iTerm profile as default, and tell it to jump into tmux session right at the start.

And don’t forget to run you iTerm2 in full screen mode. It’s worth it.

Native integration between iTerm2 and tmux

There is an integration between iTerm2 and tmux powered by iTerm that you might be interesting in.

The idea is that iTerm still handles window and pane management, maintain scrollback buffers, copy/paste as usual, but all windows are backed by tmux session under the hood. It’s tmux session indeed, but abstracted and encapsulated by familiar iTerm environment for you. You can close iTerm, open it back and reattach to previous session, without state lost.

However, it makes little sense for local environment (only useful in case of an iTerm crash which is an extremely rare event). Personally, I don’t like this approach, because it hides me from the fact I’m using tmux, and exposes only those most common tmux features, which have analogues in iTerm (create window, split pane, resize window/pane, close session).

Resources and links

Tmuxintegration · Wiki · George Nachman / iterm2 · GitLab — //gitlab.com/gnachman/iterm2/wikis/TmuxIntegration

iTerm2 keymaps for tmux — Dan Lowe — //tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Auto-Starting Tmux in iTerm2 — Sašo Matejina — Medium — //medium.com/@sasom/auto-starting-tmux-in-iterm2-4276182d452a

samoshkin/tmux-config: Tmux configuration, that supercharges your tmux to build cozy and cool terminal environment — //github.com/samoshkin/tmux-config