Come impostare tmux in modo che si avvii con le finestre specificate aperte?


Risposte:


258

È possibile scrivere un piccolo script di shell che avvia tmux con i programmi richiesti. Ho uno script di shell che chiamo dev-tmux. Un ambiente di sviluppo:

#!/bin/sh
tmux new-session -d 'vim'
tmux split-window -v 'ipython'
tmux split-window -h
tmux new-window 'mutt'
tmux -2 attach-session -d

Quindi ogni volta che voglio lanciare il mio ambiente di sviluppo preferito posso semplicemente farlo

$ dev-tmux

4
Grazie! Ho dovuto fare qualche evasione orribile per farlo funzionare insieme bash --rcfilea ottenere una bella shell su Linux scientifico con una versione specifica di devtools abilitata. Lascerò questo qui se qualcuno prova a fare lo stesso. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen,

1
Penso che la seconda riga debba essere cambiata, ha bisogno dell'opzione -s prima di 'vim'. Significa che "tmux new-session -d 'vim'" deve essere sostituito da "tmux new-session -d -s 'vim'"
Ahmad Yoosofan,

2
@AhmadYoosofan, vimLà sta per il comando che deve essere eseguito nel primo (e solo a quel tempo) riquadro della finestra. Se invece vuoi dare un nome alla sessione 'vim', allora sì, hai ragione, devi usare la -sbandiera. Sintassi completa: tmux new-session -d -s SessionName -n WindowName Command
Mitja

attenzione: se hai già avviato una sessione di tmux (altrove), i comandi potrebbero finire nell'altra sessione! La risposta di @ waqar-lim non ha questo problema.
haja,

174

Stavo cercando di creare una griglia complessa di riquadri e ho dovuto occuparmi di cambiare e dividere i riquadri più e più volte. Ecco i miei apprendimenti:

tmux new-session \;

Ti inizia con una nuova sessione. Per dividerlo in orizzontale o verticale utilizzare split-window -ho -vsuccessivamente, in questo modo:

tmux new-session \; split-window -v \; split-window -h \;

Crea 3 riquadri, in questo modo:

------------
|          |
|----------|
|    |     |
------------

Per eseguire comandi in quei riquadri, basta aggiungerli con il send-keys 'my-command'comando e C-mche lo esegue:

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; 

E la sessione risultante dovrebbe apparire così.

------------
|  tail    |
|----------|
|    | top |
------------

Ora ho provato a suddividere nuovamente il riquadro in basso a sinistra, quindi passare indietro usando last-pane, o in finestre più complesse, con select-pane -t 1dove 1è il numero del riquadro in ordine creato a partire da 0.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

Fa quello. Fondamentalmente conoscendo la tua strada split-windowed select-paneè tutto ciò di cui hai bisogno. È anche utile passare con -p 75una dimensione percentuale del riquadro creato da split-windowper avere un maggiore controllo sulla dimensione dei riquadri.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v -p 75 \; \
  split-window -h -p 30 \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

Il che si traduce in una sessione simile a quella

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------

Spero che aiuti gli tmuxappassionati in futuro.


2
linea guida straordinaria, potresti guidarmi come ridimensionare la larghezza del pannello verticale dopo la divisione.
MinhNV,

2
@MinhNV -h -p 30crea un pannello orizzontale con il 30% dell'altezza disponibile; -v -p 75lo stesso per verticale con larghezza del 75%.
Afr

1
Qual è lo scopo di \:? Ho visto degli script lavorare con e senza questo.
Kevin McDonough,

2
AGGIORNAMENTO: \;passa il punto e virgola a tmux anziché bash, consentendo l'invio dei comandi con una chiamata a tmux. stackoverflow.com/questions/20913198/…
Kevin McDonough,

96

Puoi creare sessioni diverse dalle tue in questo .tmux.confmodo:

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2

E quindi formatta le sessioni come richiesto:

#session1
new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

Questo aprirebbe 2 finestre, la seconda delle quali si chiamerebbe foo / bar e verrebbe divisa a metà in verticale (50%) con foo che corre sopra la barra. Il focus sarebbe nella finestra 2 (foo / bar), riquadro superiore (foo).

È quindi possibile avviare la sessione tmux preferita (in questo caso, sessione1) con PrefixShifts


4
Non è possibile avviare quella sessione all'interno di .tmux.conf senza richiedere file extra?
Eno,

2
Uno di questi potrebbe: in questo modo puoi facilmente aggiungere altre sessioni personalizzate - e un paio di piccoli file di testo non sono certo un sovraccarico ...
Jasonwryan,

1
Non sarebbe questo un annidamento di sessione? Voglio dire che Prefix Shift Sho bisogno di essere in tmux e l'approvvigionamento del tuo file tenta di avviare una nuova sessione che a tmux non piace e che non farà a meno che tu non lo costringa.
user35915

1
@utente35915 semplicemente non avvierà una sessione figlio, ma una sessione separata - su cui puoi passare usando ad esempio prefisso-s o prefisso-) e prefisso- (
vedi

1
Questa dovrebbe essere la risposta accettata. Tuttavia, l'associazione a s (non a S) avrà la precedenza sull'associazione tmux incorporata per le sessioni di elenco.
contare il

54

Usa tmuxinator : ti consente di configurare più sessioni e puoi scegliere quale avviare in qualsiasi momento. È possibile avviare comandi in particolari finestre o riquadri e assegnare titoli a Windows. Ecco un esempio di utilizzo con lo sviluppo di applicazioni Django .

File di configurazione di esempio:

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

Vedere il file README al link sopra per una spiegazione completa.


2
tmuxinator è fondamentalmente esattamente quello che stavo cercando. Grazie!
Forza Justin,

3
c'è anche tmuxp che è abbastanza simile: github.com/tony/tmuxp
Ben Creasy


16
:~$ tmux new-session "tmux source-file ~/session1"  

session1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  

crea un alias in .bashrc

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  

~ Che cos'è neww? Non riesco a trovare quel comando da nessuna parte. ~ Sembra che sia new-window, anche se non riesco a capire perché usi sia la forma lunga che quella corta.
oligofren,

11

Innanzitutto ho avuto l'approccio di @jasonwryan ma se hai più di 2 configurazioni, può diventare confuso.

Quindi ho creato una funzione alias:

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}

In ~/.tmux/ho più sessioni per molti usi. Ad esempio, lavoro per diverse aziende che hanno un altro ambiente di sviluppo. Quindi con la funzione alias sopra posso semplicemente chiamare: tmx company1e caricare la configurazione di cui ho bisogno.

Aggiornamento: lo scopo di "$ 2" dopo il tmuxcomando è che sei in grado di passare altri argomenti tmux.


1
Combinando questo con i suggerimenti di @ soc1c è stata creata una configurazione super dolce ( github.com/fatso83/dotfiles/commit/35a7ed ). Grazie!
oligofren

La funzione in realtà non funziona quando non esiste già una sessione tmux esistente da agganciare (ottenere no server running on /tmp/tmux-1000/default). Ecco perché dovevo correggere il comando tmux new-session. Ref github.com/fatso83/dotfiles/commit/…
oligofren

1
Ho fatto la mia configurazione di tmux con systemd. Quindi c'è sempre una sessione in esecuzione dopo l'avvio. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd Ci scusiamo per non averlo menzionato.
danbruegge,

10

Dal mio script "get.all", che invoco ogni mattina per eseguire una serie di lavori "get.XXX" successivi per aggiornare il software che seguo. Alcuni di loro si stanno abbandonando automaticamente. Altri richiedono più interazione una volta terminato il get (come chiedere di creare emacs).

#!/bin/sh
tmux att -t get ||
tmux \
  new -s get -n capp \; \
  send-keys 'get.capp' C-m \; \
  neww -n emacs \; \
  send-keys 'get.emacs' C-m \; \
  neww -n git \; \
  send-keys 'get.git' C-m \; \
  neww -n mini \; \
  send-keys 'get.mini' C-m \; \
  neww -n port \; \
  send-keys 'get.port' C-m \; \
  neww -n rakudo \; \
  send-keys 'get.rakudo' C-m \; \
  neww -n neil \; \
  send-keys 'get.neil && get.neil2 && exit' C-m \; \
  neww -n red \; \
  send-keys 'get.red && exit' C-m \; \
  neww -n cpan \; \
  send-keys 'get.cpan && exit' C-m \; \
  selectw -t emacs

8

Se vuoi solo dividere lo schermo su 2 riquadri (dire in orizzontale), puoi eseguire questo comando (non sono richiesti script tmux o shell):

tmux new-session \; split-window -h \;

Lo schermo sarà simile al seguente:

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16

8

Ed è così che lo faccio:

#!/bin/bash

function has-session {
  tmux has-session -t name_of_my_session 2>/dev/null
}

if has-session ; then
  echo "Session already exists"
else
  cd /path/to/my/project
  tmux new-session -d -s name_of_my_session 'vim'
  tmux split-window -h -p 40 start_web_server
  tmux split-window -v
  tmux attach-session -d -t name_of_my_session
fi

Ho un file per ciascuno dei miei progetti. Inoltre puoi raggrupparli per avere un po 'di lavoro, altri per progetti di hobby.

Inoltre puoi spostarlo nella ~/bincartella, aggiungerlo a PATHe dare il tmux_my_awesome_projectnome. Quindi sarai in grado di eseguirlo da ogni luogo.


4

Questo funziona per me. Creazione di 5 finestre con i nomi indicati e selezione automatica della homefinestra.

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1

3

Prova fratello , è un bootstrapper di progetto.

Fornisce semplici API con cui interagire tmux .

Sembra qualcosa del genere:

#!/bin/sh
# @ project_name/tasks/init.sh
structure project_name
  window editor
    run 'vim'
  window terminal
    run 'echo happy coding ...'
focus editor
connect project_name

Per avviare un progetto è sufficiente eseguire il comando seguente:

bro start <project_name>

Dai un'occhiata allo screencast qui sotto, mostra come iniziare broe usare la sua tmuxAPI.

https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif


2

Il plug -in tmux-continuum salverà automaticamente la sessione di tmux e la caricherà al successivo avvio di tmux, dovrebbe essere più facile da installare rispetto ad alcune delle soluzioni di script personalizzate qui.

Caratteristiche:

  • risparmio continuo dell'ambiente tmux
  • tmux automatico si avvia all'accensione del computer / server
  • ripristino automatico all'avvio di tmux

Per salvare la sessione su richiesta è possibile utilizzare il plug-in tmux-resurrect . tmux-resurrect è anche richiesto per eseguire tmux-continuum

tmux-resurrect salva tutti i piccoli dettagli dal tuo ambiente tmux in modo che possa essere completamente ripristinato dopo un riavvio del sistema (o quando ne hai voglia). Non è richiesta alcuna configurazione. Dovresti sentirti come se non avessi mai smesso di fumare.


2

C'è un plugin tmux per questo.

Dai un'occhiata a tmux-resurrect

Ripristina l'ambiente tmux dopo il riavvio del sistema.

Tmux è eccezionale, tranne quando è necessario riavviare il computer. Si perdono tutti i programmi in esecuzione, le directory di lavoro, i layout dei riquadri ecc. Esistono utili strumenti di gestione, ma richiedono una configurazione iniziale e aggiornamenti continui con l'evoluzione del flusso di lavoro o l'avvio di nuovi progetti.

tmux-resurrect salva tutti i piccoli dettagli dal tuo ambiente tmux in modo che possa essere completamente ripristinato dopo un riavvio del sistema (o quando ne hai voglia). Non è richiesta alcuna configurazione. Dovresti sentirti come se non avessi mai smesso di fumare.

O tmux-continuum

Caratteristiche:

  • risparmio continuo dell'ambiente tmux
  • tmux automatico si avvia all'accensione del computer / server
  • ripristino automatico all'avvio di tmux

2

È possibile utilizzare gli hook di tmux per eseguire comandi quando viene creata una nuova sessione. In particolare, ciò si ottiene utilizzando il session-createdgancio.

Ad esempio, per dividere lo schermo in tre modi con htop in esecuzione in basso a destra è possibile aggiungere la seguente riga al ~/.tmux.conffile:

set-hook -g session-created 'split -h ; split -v top'

Il vantaggio di questo metodo è che non è necessario eseguire tmux in alcun modo speciale (ad esempio, shell script o alias) per ottenere il risultato desiderato. Puoi anche combinare questo con quello tmux new-session -A -s mysessiondescritto in questa altra risposta in modo tale che i comandi hook vengano eseguiti solo quando crei per la prima volta la sessione e non sugli allegati successivi.

Questa funzione è stata aggiunta da d15d54c2c nel 2016. La prima versione a includerla è la 2.4.


1

Dovresti specificarlo nel tuo file tmux config ( ~/.tmux.conf), ad esempio:

new mocp
neww mutt

new -d
neww
neww

(apre una sessione con 2 finestre con mocp lanciato nel primo e mutt nel secondo e un'altra sessione staccata con 3 finestre vuote).


1

Ho creato questo script . Non ha bisogno di contaminanti, rubini o altri. È solo uno script bash, configurabile:

Un file chiamato config dovrebbe contenere qualcosa del genere:

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

e il codice bash dovrebbe essere:

#!/bin/bash

if [ -r config ]; then
    echo ""
    echo "Loading custom file"
    . config
else
    . config.dist
fi

tmux start-server

window=0
windownumber=-1

for i in "${combo[@]}"; do

    if [ $((window%2)) == 0 ]; then
        name=${i}
        ((windownumber++))
    else
        command=${i}
    fi

    if [ ${combo[0]} == "${i}" ]; then
        tmux new-session -d -s StarTmux -n "${name}"
    else
        if [ $((window%2)) == 0 ]; then
            tmux new-window -tStarTmux:$windownumber -n "${name}"
        fi
    fi

    if [ $((window%2)) == 1 ]; then
        tmux send-keys -tStarTmux:$windownumber "${command}" C-m
    fi

    ((window++))
done

tmux select-window -tStarTmux:0
tmux attach-session -d -tStarTmux

Ciao sensorario, sebbene questo link possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. Dai un'occhiata qui: perché e come vengono eliminate alcune risposte?
bummi,

Nb incredibilmente, tmux start_servernon avvia un server da solo. Vedi github.com/tmux/tmux/issues/182
Jack Wasey

1

Ho appena provato a usare tutte le idee in questa pagina e non mi piaceva nessuna di esse. Volevo solo una soluzione che fosse iniziata con un set specifico di finestre all'apertura del mio terminale. Volevo anche che fosse idempotente, ovvero l'apertura di una nuova finestra del terminale prende il posto della sessione tmux della precedente.

Le soluzioni sopra spesso tendono ad aprire più sessioni di tmux e ne voglio solo una. Innanzitutto, ho aggiunto questo al mio ~/.bash_profile:

tmux start-server
if [[ -z "$TMUX" ]]
then
  exec tmux attach -d -t default
fi

quindi ho aggiunto quanto segue al mio ~/.tmux.conf:

new -s default -n emacs /usr/local/bin/emacs
neww -n shell /usr/local/bin/bash
neww -n shell /usr/local/bin/bash
selectw -t 1

ora ogni volta che avvio un terminale o avvio tmux o qualsiasi altra cosa, ricollego alla mia configurazione desiderata esistente (la sessione denominata default) o creo una nuova sessione con quella configurazione.


sorprendentemente, tmux start_servernon avvia un server da solo. Vedi github.com/tmux/tmux/issues/182
Jack Wasey

1

tmuxp supporta la configurazione della sessione JSON o YAML e un'API python. Un semplice file di configurazione di tmuxp per creare una nuova sessione nella sintassi YAML è:

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd

0

Questo script avvia una sessione con il nome "e" e tre finestre

#!/bin/sh 
tmux new-session -s e   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t e:1 -n home   'cd ~; bash -i'
tmux new-window  -t e:2 -n log   'cd /var/log; bash -i'

tmux select-window -t e:1
tmux -2 attach-session -t e
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.