Come faccio a far sì che tmux apra un set di riquadri senza inserirli manualmente?


30

Quindi, voglio fare una tmuxsessione specifica del progetto che faccia apparire automagicamente determinati comandi in determinati riquadri. Seguendo un tutorial online e la tmuxpagina man, questo è quello che mi viene in mente per un file di configurazione:

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

Il risultato è ... niente. tmuxsi avvia con una singola finestra e un singolo riquadro in quella finestra senza comandi eseguiti.

Come farei per creare un file di configurazione che in realtà mi permetta di creare un set di finestre e riquadri con determinati comandi pre-eseguiti?

Risposte:


36

Il file di configurazione funziona, ma ci sono un paio di complicazioni.

Comandi di breve durata

Innanzitutto, i comandi che stai avviando (istanze di ls ) finiscono per essere eseguiti molto rapidamente. Le finestre e i riquadri per i comandi vengono creati, ma scompaiono non appena ogni comando viene chiuso.

Se il tuo obiettivo è effettivamente utilizzare tali comandi "one shot" nella tua eventuale configurazione, allora probabilmente dovresti usare l'opzione window remain-on-exit(e possibilmente l'opzione di sessione set-remain-on-exitper fornire un valore predefinito per tutte le finestre create nella sessione). Quando remain-on-exitè impostato per una finestra, non scomparirà alla chiusura del comando. Probabilmente vorrai mappare il respawn-windowto a key (nota: respawn-windowrespawn il comando originale; respawn-paneè disponibile anche in tmux 1.5 per rigenerare i singoli riquadri).

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

Oppure, se non ti dispiace che la tua finestra iniziale sia il numero 1 anziché il numero 0, possiamo evitare di modificare il valore globale:

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

Se stavi usando solo lsun comando segnaposto semplificato e in realtà intendi generare un tipo di comando interattivo nelle finestre / riquadri, probabilmente dovresti semplicemente generare il comando che intendi eventualmente eseguire. Se l'avvio richiesto impiega troppo tempo per avviarlo durante il test tmux , sostituire una shell o un altro comando interattivo (ad es top. sqlite3, Ecc.).

new-session È il comando predefinito

In secondo luogo, eseguire tmux senza un argomento di comando (ad esempio tmux) equivale a usare il new-sessioncomando (cioè tmuxè uguale a tmux new-session). Il tuo .tmux.confcrea una sessione per le sue finestre / riquadri ( newè un alias per new-session) e un'altra sessione viene creata per il new-sessioncomando implicito specificato avviando tmux senza un argomento di comando. Se stai utilizzando la barra di stato predefinita, vedrai a [1]nella parte sinistra della barra di stato quando ti trovi nella sessione "extra" (la sessione iniziale creata nel .tmux.confnumero 0).

Se vuoi evitare di creare la sessione extra, usa tmux attachinvece di plain tmux. .tmux.confVerranno eseguiti i comandi dal tuo , creando la sessione 0, e quindi il tuo client si collegherà a quella sessione invece di crearne una nuova.


2
OK, forse sto diventando grosso come un sandwich di balene qui, ma in questo momento ho un file di configurazione che ha solo splitwal suo interno - nient'altro - e non sto ancora ottenendo uno schermo diviso perché lo dice impossibile stabilire la sessione corrente. Se lo aggiungo newprima, ottengo ... una finestra, un riquadro. Non riesco a sembrare, per la mia vita ottenere due riquadri all'avvio.
SOLO IL MIO OPINIONE corretta,

1
Un file di configurazione con new, quindi splitwfunziona per me quando avvio tmux via tmux attach. Una cosa da ricordare è che il .tmux.conf(o il file specificato con l' -fopzione) viene utilizzato solo se non è già in esecuzione alcun server. Controlla se un server è in esecuzione tramite tmux ls. Se vuoi eseguire i comandi da un file quando un server è già in esecuzione, fallo in questo modo: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(se lo esegui quando non c'è un server, il tuo .tmux.conf(o il -ffile) verrà eseguito per primo, quindi il tuo source-filefile).
Chris Johnsen,

Il file di configurazione viene specificato con -f - quindi vado tmux new -f myconfig. Il contenuto di quel file di configurazione contiene solo new seguito da splitw. Sto uccidendo tutti i processi tmux prima di provare la riga di comando tmux -f myconfig. Non ho due riquadri. Sono davvero in perdita qui con cosa fare oltre questo punto (oltre a rinunciare a tmux).
SOLO IL MIO OPINIONE corretta,

4
@Just: Sia che tu lo usi -fo meno, tmuxsenza un argomento di comando è lo stesso di tmux new-session(che, per i nuovi server, creerà una nuova sessione in cima a qualunque cosa faccia il tuo file di configurazione). La finestra pre-suddivisa viene creata nella sessione 0, ma il new-sessioncomando implicito sta creando (e collegandosi a) una sessione aggiuntiva (sessione 1; cercare [1]nella riga di stato). Utilizzare tmux -f myconfig attachper evitare di creare la nuova sessione che nasconde la finestra pre-suddivisa.
Chris Johnsen,

1
OK, immagino che imparare a leggere alla fine mi ripagherà. :) Grazie per lo sforzo e la risposta. Ora funziona tutto bene. Vorrei che ci fosse una reputazione "ribaltamento" qui in modo da poterti dare più di una semplice risposta accettata.
SOLO IL MIO OPINIONE corretta,

9

Non sono sicuro di capire cosa intendi per "immissione manuale", ma è così che lo faccio. Ho scritto uno script di "avvio automatico" che viene avviato dal mio gestore di finestre. Contiene:

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

dove ogni file .session è simile al seguente:

#!/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

Aspetta, c'è di più! Ho un numero sempre crescente di file .session che carico con konsole:

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

dove work_console.tabs è simile al seguente:

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

Quindi premo F12 per avviare Konsole.


Konsole sembra essere rotto, quindi sono passato al Terminale , che funziona bene. Ho un post più dettagliato sulla mailing list di tmux-users.
John Schmitt,

1
Solo un piccolo commento, puoi sostituire "! -z 'con' -n 'nei tuoi test;)
lilorox,

6

supponiamo che tu voglia avviare 3 attività di monitoraggio del server (qui ping localhost) non è necessario pasticciare con i file di configurazione e le sessioni salvate. Tutto può essere fatto dalla riga di comando.

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

Grazie per la semplicità - esattamente l'esempio che stavo cercando!
dsz,

5

Ho trovato teamocil molto utile per automatizzare tmux windows / sessioni.

È scritto in Ruby, quindi è necessario che sia installato.

Ecco una configurazione di esempio:

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

Puoi avere una disposizione di finestre e divisioni.



4

**

  • Meglio salvare la tua sessione!

** Ho scoperto che per un amministratore pigro come me, preferirei salvare la sessione di tmux, piuttosto che passare ore a cercare di costruirla perfettamente. Sto amministrando più di 30 server e le mie sessioni di tmux sono dinamiche, con la configurazione che cambia continuamente. E 'stato un dolore al collo, fino a quando non ho scoperto di recente che resmect questo plugin è semplicemente fantastico. Provaci. Attualmente, i repository Ubuntu hanno tmux 1.8, questo plug-in necessita di 1.9, quindi è necessario aggiornarlo manualmente

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

Dopo di che puoi installarlo da

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

Quindi dd questa riga alla fine di ~ / .tmux.conf (se ~ / .tmux.conf non è disponibile, crea un file vuoto)

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

Aggiungo anche questa riga alla fine di ~ / .tmux.conf in modo che il plugin salvi le sessioni per tutti i programmi che eseguo

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

Quindi ricaricare l'ambiente tmux.

tmux source-file ~/.tmux.conf

Questo è tutto! Hai fatto. Ora, esegui tmux normalmente, ridimensiona i tuoi riquadri, crea nuovi riquadri, crea nuove sessioni ... ecc. Quando sei soddisfatto della configurazione che hai raggiunto (in diverse finestre e diverse sessioni), fai clic su ctrl + b quindi ctrl + s per salvare la sessione. Per testare i risultati, basta uccidere tutti i tmux

killall tmux

Quindi, esegui di nuovo tmux

tmux

Quindi, all'interno di tmux, fai clic ctrl + b, quindi ctrl + r (per il ripristino) Magicamente, tutte le finestre, i riquadri e le sessioni vengono ripristinati con la stessa geometria e disposizione. Spero che questo possa aiutare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.