Wie bringe ich tmux dazu, eine Reihe von Fenstern zu öffnen, ohne sie manuell einzugeben?

30

Daher möchte ich eine projektspezifische tmuxSitzung erstellen, in der bestimmte Befehle in bestimmten Bereichen automatisch angezeigt werden. Nach einem Online-Tutorial und der tmuxManpage habe ich mir Folgendes für eine Konfigurationsdatei ausgedacht:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

Das Ergebnis ist ... nichts. tmuxStartet mit einem einzelnen Fenster und einem einzelnen Bereich in diesem Fenster, ohne dass Befehle ausgeführt werden.

Wie würde ich vorgehen, um eine Konfigurationsdatei zu erstellen, mit der ich eine Reihe von Fenstern und Fenstern mit bestimmten Befehlen erstellen kann, die vorab ausgeführt wurden?

Nur meine richtige Meinung
quelle

Antworten:

36

Ihre Konfigurationsdatei funktioniert, es gibt jedoch einige Komplikationen.

Kurzzeitige Befehle

Erstens werden die von Ihnen gestarteten Befehle ( ls- Instanzen ) sehr schnell ausgeführt. Die Fenster und Fensterbereiche für die Befehle werden erstellt, verschwinden jedoch, sobald jeder Befehl beendet wird.

Wenn es Ihr Ziel ist, solche "One Shot" -Befehle tatsächlich in Ihrer endgültigen Konfiguration zu verwenden, sollten Sie wahrscheinlich die Fensteroption verwenden remain-on-exit(und möglicherweise die Sitzungsoption set-remain-on-exit, um einen Standard für alle in der Sitzung erstellten Fenster bereitzustellen). Wenn remain-on-exitfür ein Fenster festgelegt ist, wird es beim Beenden des Befehls nicht ausgeblendet. Möglicherweise möchten Sie die respawn-windoweinem Schlüssel zuordnen (Hinweis: respawn-windowDer ursprüngliche Befehl wird neu erzeugt; respawn-paneist auch in tmux 1.5 verfügbar, um einzelne Fenster neu zu erzeugen ).

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

Oder, wenn es Ihnen nichts ausmacht, wenn Ihr Anfangsfenster die Nummer 1 anstelle der Nummer 0 ist, können wir vermeiden, den globalen Wert zu ändern:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

Wenn Sie nur lseinen vereinfachten Platzhalterbefehl verwenden und tatsächlich beabsichtigen, einen interaktiven Befehl in Ihren Fenstern / Fenstern zu erzeugen, sollten Sie wahrscheinlich nur den Befehl erzeugen, den Sie später ausführen möchten. Wenn der gewünschte Befehl zu lange dauert es bis zur Inbetriebnahme während verwendet tmux Tests ersetzen dann eine Shell oder andere einfachen interaktiven Befehl (zB top, sqlite3usw.).

new-session Ist der Standardbefehl

Zweitens ist das Ausführen von tmux ohne ein Befehlsargument (z. B. tmux) gleichbedeutend mit dem Verwenden des new-sessionBefehls (dh tmuxdasselbe wie tmux new-session). Sie .tmux.conferstellen eine Sitzung für ihre Fenster / Fensterbereiche ( newist ein Alias ​​für new-session) und eine andere Sitzung wird für den impliziten new-sessionBefehl erstellt, der durch Starten von tmux ohne Befehlsargument angegeben wird . Wenn Sie die Standardstatusleiste verwenden, wird [1]links in der Statusleiste ein angezeigt, wenn Sie sich in der zusätzlichen Sitzung befinden (die erste Sitzung, die in erstellt wurde, .tmux.confist die Nummer 0).

Wenn Sie das Erstellen der zusätzlichen Sitzung vermeiden möchten, verwenden Sie tmux attachstatt plain tmux. Die Befehle von Ihrem .tmux.confwerden ausgeführt und erstellen Sitzung 0, und dann wird Ihr Client an diese Sitzung angefügt, anstatt eine neue zu erstellen.

Chris Johnsen
quelle
2
OK, ich bin hier vielleicht so dick wie ein Walsandwich, aber im Moment habe ich eine Konfigurationsdatei, die nur splitw- sonst nichts - enthält, und ich bekomme immer noch keinen geteilten Bildschirm, weil er es sagt Die aktuelle Sitzung kann nicht hergestellt werden. Wenn ich newdavor hinzufüge , bekomme ich ... ein Fenster, eine Scheibe. Ich kann nicht scheinen, damit das Leben von mir zwei Scheiben beim Start erhält.
NUR MEINE STELLUNGNAHME 18.10.10
1
Eine Konfigurationsdatei mit new, splitwfunktioniert dann bei mir, wenn ich tmux über startetmux attach . Beachten Sie, dass die .tmux.conf(oder die mit der -fOption angegebene) Datei nur verwendet wird, wenn noch kein Server ausgeführt wird. Überprüfen Sie, ob ein Server über ausgeführt wird tmux ls. Wenn Sie die Befehle aus einer Datei ausführen möchten, während ein Server bereits ausgeführt wird, gehen Sie folgendermaßen vor: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(Wenn Sie dies ausführen, während kein Server vorhanden ist, wird zuerst Ihre .tmux.conf(oder die -fDatei) und dann Ihre source-fileDatei ausgeführt.)
Chris Johnsen
Die Konfigurationsdatei wird mit -f angegeben - also gehe ich tmux new -f myconfig. Der Inhalt dieser Konfigurationsdatei enthält nur new gefolgt von splitw. Ich bringe alle tmux-Prozesse zum Erliegen, bevor ich die Befehlszeile ausprobiere tmux -f myconfig. Ich bekomme keine zwei Scheiben. Ich bin hier wirklich ratlos, was ich nach diesem Punkt tun soll (abgesehen davon, dass ich nur auf tmux verzichte).
NUR MEINE STELLUNGNAHME
4
@Just: Ob Sie ohne ein Befehlsargument verwenden -foder nicht, tmuxist dasselbe wie tmux new-session(wodurch für neue Server eine neue Sitzung erstellt wird, unabhängig davon, was Ihre Konfigurationsdatei tut). Ihr Pre-Split-Fenster wird in Sitzung 0 erstellt, aber der implizite new-sessionBefehl erstellt eine zusätzliche Sitzung (Sitzung 1; suchen Sie [1]in Ihrer Statuszeile nach) (und fügt sie hinzu). Verwenden Sie tmux -f myconfig attachdiese Option , um zu vermeiden, dass eine neue Sitzung erstellt wird, in der das vorab geteilte Fenster ausgeblendet wird.
Chris Johnsen
1
OK, ich denke, das Lesenlernen wird sich irgendwann für mich auszahlen. :) Danke für die Mühe und die Antwort. Alles funktioniert jetzt gut. Ich wünschte, es gäbe hier einen Ruf als "Trinkgeldgeber", damit ich Ihnen mehr als nur eine akzeptierte Antwort geben könnte.
NUR MEINE STELLUNGNAHME 18.10.10
9

Ich bin nicht sicher, ob ich verstehe, was Sie unter "manuell eingeben" verstehen, aber so mache ich es. Ich habe ein "Autostart" -Skript geschrieben, das mein Fenstermanager startet. Es beinhaltet:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

Dabei sieht jede .session-Datei ungefähr so ​​aus:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

Warten Sie, es gibt noch mehr! Ich habe eine ständig wachsende Anzahl von .session-Dateien, die ich mit konsole lade:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

wo work_console.tabs ungefähr so ​​aussieht:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

Dann drücke ich F12, um die Konsole zu starten.

John Schmitt
quelle
konsole scheint kaputt zu sein also habe ich auf terminal umgestellt , was gut funktioniert. Ich habe einen ausführlicheren Beitrag auf der Mailingliste von tmux-users.
John Schmitt
1
Nur ein kleiner Kommentar, den Sie ersetzen können! -z 'mit' -n 'in deinen Tests;)
Lilorox
6

Angenommen, Sie möchten drei Serverüberwachungsaufgaben starten (hier ping localhost). Es ist nicht erforderlich, mit Konfigurationsdateien und gespeicherten Sitzungen zu experimentieren. Dies kann alles über die Befehlszeile erfolgen.

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Jasen
quelle
Vielen Dank für die Einfachheit - genau das Beispiel, das ich gesucht habe!
DSZ
5

Ich fand teamocil sehr nützlich, um tmux windows / sessions zu automatisieren.

Es ist in Ruby geschrieben und muss installiert werden.

Hier ist eine Beispielkonfiguration:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

Sie können eine Anordnung von Fenstern und Teilungen festlegen.

Kris
quelle
4

Eine andere Alternative, die teamcoil ähnelt, ist tmuxinator , das sich in der aktiven Entwicklung befindet und recht gut funktioniert. Es wird auch für den erstaunlichen tmux empfohlen (und ein wenig rezensiert) : Produktive mausfreie Entwicklung von The Pragmatic Bookshelf .

Pablo Olmos de Aguilera C.
quelle
Fand es ein bisschen sauberer als teamocil (aber trotzdem sehr ähnlich) und benutze es gerade. Ich bin ziemlich zufrieden damit, wie es funktioniert!
Aktau
4

**

  • Besser speichern Sie Ihre Sitzung!

** Ich fand, dass ich für einen faulen Administrator wie mich die Sitzung von tmux lieber retten würde, als Stunden damit zu verbringen, zu versuchen, sie perfekt zu erstellen. Ich verwalte mehr als 30 Server und meine tmux-Sitzungen sind dynamisch, wobei sich die Konfiguration ständig ändert. Es hat mir im Nacken wehgetan , bis ich kürzlich herausgefunden habe, dass tmux-resurrect dieses Plugin einfach großartig ist. Versuche es. Gegenwärtig haben Ubuntu-Repositories tmux 1.8, dieses Plugin benötigt 1.9, daher müssten Sie manuell upgraden

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

Danach können Sie es per installieren

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

Setzen Sie dann diese Zeile an das Ende von ~ / .tmux.conf (falls ~ / .tmux.conf nicht verfügbar ist, erstellen Sie eine leere Datei)

run-shell ~/clone/path/resurrect.tmux

Ich füge diese Zeile auch am Ende der ~ / .tmux.conf hinzu, damit das Plugin Sitzungen für alle von mir ausgeführten Programme speichert

set -g @resurrect-processes ':all:'

Laden Sie dann die tmux-Umgebung neu.

tmux source-file ~/.tmux.conf

Das ist es! Du bist fertig. Führen Sie nun tmux wie gewohnt aus, ändern Sie die Größe Ihrer Fenster, erstellen Sie neue Fenster, erstellen Sie neue Sitzungen ... usw. Wenn Sie mit der erreichten Konfiguration zufrieden sind (in mehreren Fenstern und mehreren Sitzungen), klicken Sie einfach auf Strg + B und dann auf Strg + S, um die Sitzung zu speichern. Um die Ergebnisse zu testen, töten Sie einfach alle tmux

killall tmux

Führen Sie dann erneut tmux aus

tmux

Klicken Sie dann in tmux auf Strg + B und dann auf Strg + R (für die Wiederherstellung). Auf magische Weise werden alle Ihre Fenster, Fensterbereiche und Sitzungen mit derselben Geometrie und Anordnung wiederhergestellt. Hoffe das würde helfen.

user1757247
quelle