Wie führe ich einen Shell-Befehl aus .tmux.conf aus?

8

Wie .tmux.confführe ich einen Shell-Befehl aus oder auf andere Weise automatisch aus, wenn tmux gestartet wird, ohne einen anderen Befehl ausführen zu müssen?

Wie kann ich beispielsweise einen Alias, eine Funktion oder ein Skript erstellen, auf das es ankommt?

tmuxirc -> tmux + irssi

Emanuel Berg
quelle

Antworten:

9

Es hört sich so an, als ob Sie tmux extern von Ihrer Shell aus aufrufen möchten, anstatt dies von tmux aus zu tun. Es .tmux.confist also der falsche Ort. Sie können einen Shell-Alias ​​verwenden (platzieren Sie diesen .bashrczur Wiederverwendung in Ihrem ):

alias tmuxirc='tmux new-session -s irc irssi'
Chris Down
quelle
Ich benutze zsh, aber sonst 100% richtig.
Emanuel Berg
14

Es scheint zwar nicht das zu sein, wonach Sie gesucht haben, aber die Lösung für:

Wie führe ich einen Shell-Befehl aus .tmux.conf aus?

ist run-shelloder in seiner abgekürzten Form , run. Von der tmuxManpage:

run-shell shell-command
               (alias: run)
         Execute shell-command in the background without creating a win-
         dow.  After it finishes, any output to stdout is displayed in
         copy mode.  If the command doesn't return success, the exit sta-
         tus is also displayed.

Wenn Sie beim Starten im Hintergrund ein Skript im Hintergrund starten müssen tmux, können Sie es verwenden run "command > /dev/null".

Severyn Kozak
quelle
6

Ich mache etwas Ähnliches mit einem Skript. Wenn ich tmux mit meiner Entwicklungskonfiguration starten möchte, nenne ich es. Das Skript selbst sieht folgendermaßen aus:

#!/bin/sh
tmux has-session -t development
if [ $? != 0 ]; then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development 'cd /var/www/htdocs/' C-m
    tmux send-keys -t development 'vim' C-m
    tmux split-window -v -t development
    tmux split-window -v -t development
    tmux select-layout -t development main-horizontal
    tmux send-keys -t development:0.1 'cd /var/www/htdocs/' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:1 'cd /var/www/htdocs/' C-m
    tmux select-window -t development:0
fi
tmux attach -t development

Dies gibt mir eine tmux-Sitzung mit 2 Fenstern, Fenster 1 hat eine Vim-Sitzung im oberen Bereich des Bildschirms, mit zwei Terminals im unteren 3. oder so des Bildschirms, die alle auf mein Verzeichnis / var / www / htdocs / zeigen . Fenster 2 ist nur eine Vollbildkonsole. Das Gute daran ist, dass die Sitzung nicht neu erstellt wird, wenn sie bereits vorhanden ist, sondern nur an sie angehängt wird.

ShawnW.
quelle
Vielleicht möchten Sie sich tmuxinator ansehen .
Chris Down
Wie führt man dieses Skript von conf aus?
Chovy
1

Es gibt einen display-messageBefehl in der tmuxManpage:

Display-Nachricht [-p] [-c Ziel-Client] [-t Zielbereich] [Nachricht]

(Alias: Anzeige)

Eine Nachricht anzeigen. Wenn -p angegeben wird, wird die Ausgabe auf stdout gedruckt, andernfalls wird sie in der Statuszeile des Zielclients angezeigt. Das Format der Nachricht wird im Abschnitt FORMATE beschrieben. Informationen werden aus dem Zielbereich übernommen, wenn -t angegeben wird, andernfalls der aktive Bereich für die Sitzung, die an den Zielclient angehängt ist.

Und im Abschnitt FORMATE gibt es eine Variable mit dem Namen session_name, die durch den Namen der Sitzung ersetzt wird, wenn Sie sie im Format verwenden #{session_name}.

Versuchen Sie auszuführen, tmux display-message -p '#{session_name}'wenn Sie sich in einer tmux-Sitzung befinden. Vielleicht sehen Sie eine Nummer, es ist die ID der Sitzung, die Sie angehängt haben. Ausführen tmux ls, um die Sitzungsliste zu überprüfen.

Wenn Sie jedoch einen tmux mit starten tmux new -s myproject, sehen Sie myprojectals Ausgabe, aber keine Zahl. Weil Sie den Namen der Sitzung angegeben haben, als Sie tmux gestartet haben.

Meine Lösung besteht also darin, einen Code in die ~/.bashrcDatei zu legen :

# [tmux] load scripts in ~/.tmux on creating a new pane
# load order: __before__.sh, ${session_name}.sh, __after__.sh
function tmux_load_startup_scripts_by_session_name() {  
  if [[ -n ${TMUX} ]]; then
    local env_before_script="${HOME}/.tmux/__before__.sh"
    [[ -f "${env_before_script}" ]] && { . "${env_before_script}"; }
    local env_main_script="${HOME}/.tmux/$(tmux display-message -p '#{session_name}').sh"
    [[ -f "${env_main_script}" ]] && { . "${env_main_script}"; }
    local env_after_script="${HOME}/.tmux/__after__.sh"
    [[ -f "${env_after_script}" ]] && { . "${env_after_script}"; }
  fi
}
tmux_load_startup_scripts_by_session_name  

Verwendungszweck

mkdir ~/.tmux
cat "__before__.sh" > ~/.tmux/__before__.sh
cat "__after__.sh" > ~/.tmux/__after__.sh
cat "sample.sh" > ~/.tmux/sample.sh
tmux new -s sample

Sie sehen die Ausgabe in jedem Panel, das Sie erstellen:

__before__.sh
sample.sh
__after__.sh

Der Vorteil dieser Lösung besteht darin, dass Sie verschiedene Skripte für verschiedene Projekte oder Umgebungen angeben können.

Ggicci
quelle