Bagaimana cara mengatur tmux sehingga dimulai dengan windows tertentu dibuka?

Jawaban:

258

Anda dapat menulis skrip shell kecil yang meluncurkan tmux dengan program yang diperlukan. Saya memiliki yang berikut dalam skrip shell yang saya sebut dev-tmux. Lingkungan pengembang:

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

Jadi setiap kali saya ingin meluncurkan lingkungan dev favorit saya, saya bisa melakukannya

$ dev-tmux
Amjith
sumber
4
Terima kasih! Saya harus melakukan beberapa pelarian mengerikan untuk mendapatkan ini bekerja dikombinasikan dengan bash --rcfileuntuk mendapatkan shell yang bagus di linux ilmiah dengan versi devtools khusus diaktifkan. Akan meninggalkan ini di sini jika seseorang mencoba melakukan hal yang sama. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen
1
Saya pikir baris kedua harus diubah, perlu opsi -s sebelum 'vim'. Ini berarti "tmux sesi-baru -d 'vim'" harus diganti dengan "tmux sesi-baru -d -s 'vim'"
Ahmad Yoosofan
2
@AhmadYoosofan, The vimada singkatan dari perintah yang akan dieksekusi di panel jendela pertama (dan pada saat itu saja) Jika Anda ingin memberi nama sesi 'vim' maka ya, Anda benar, Anda harus menggunakan -sbenderanya. Sintaks keseluruhan: tmux new-session -d -s SessionName -n WindowName Command
Mitja
hati-hati: jika Anda sudah memulai sesi tmux (di tempat lain), perintahnya bisa berakhir di sesi lain! Jawaban @ waqar-lim tidak memiliki masalah ini.
haja
174

Saya sedang mencoba membuat grid panel yang kompleks dan harus berurusan dengan switching dan split panel berulang-ulang. Inilah pembelajaran saya:

tmux new-session \;

Membuat Anda memulai dengan sesi baru. Untuk membaginya gunakan horizontal atau vertikal split-window -hatau -vselanjutnya, seperti itu:

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

Membuat 3 panel, seperti ini:

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

Untuk menjalankan perintah di panel itu, cukup tambahkan dengan send-keys 'my-command'perintah dan C-myang menjalankannya:

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

Dan sesi yang dihasilkan akan terlihat seperti itu.

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

Sekarang saya mencoba lagi membagi-bagi panel kiri bawah, jadi beralih menggunakan kembali last-pane, atau di windows yang lebih kompleks, dengan di select-pane -t 1mana 1adalah jumlah panel agar dibuat dimulai dengan 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 \;

Apakah itu. Pada dasarnya mengetahui jalan keluar Anda split-windowdan select-paneitulah yang Anda butuhkan. Ini juga berguna untuk lulus dengan -p 75ukuran persentase panel yang dibuat oleh split-windowuntuk memiliki kontrol lebih besar atas ukuran panel.

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 \;

Yang menghasilkan sesi tampak seperti itu

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

Harapan yang membantu tmuxpeminat di masa depan.

Afr
sumber
2
pedoman yang luar biasa, dapatkah Anda membimbing saya cara mengubah ukuran lebar panel vertikal setelah split.
MinhNV
2
@MinhNV -h -p 30membuat panel horizontal dengan 30% dari ketinggian yang tersedia; -v -p 75sama untuk vertikal dengan lebar 75%.
Afr
1
Apa tujuan dari \:? Saya telah melihat skrip bekerja dengan dan tanpa ini.
Kevin McDonough
2
UPDATE: \;meneruskan tanda titik koma ke tmux, bukan bash, memungkinkan perintah untuk dikirim dengan satu panggilan ke tmux. stackoverflow.com/questions/20913198/…
Kevin McDonough
96

Anda dapat sumber sesi yang berbeda dari .tmux.confseperti Anda :

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

Dan kemudian format sesi seperti yang Anda butuhkan:

#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

Ini akan membuka 2 jendela, yang kedua akan diberi nama foo / bar dan akan dibagi secara vertikal menjadi setengah (50%) dengan foo berjalan di atas bar. Fokus ada di jendela 2 (foo / bar), panel atas (foo).

Anda kemudian dapat memulai sesi tmux yang Anda sukai (dalam hal ini, session1) dengan PrefixShifts

jasonwryan
sumber
4
Tidak bisakah sesi itu dimulai di dalam .tmux.conf tanpa memerlukan file tambahan?
Eno
2
Salah satunya dapat: dengan cara ini Anda dapat dengan mudah menambahkan sesi yang lebih khusus - dan beberapa file teks kecil bukanlah biaya tambahan ...
jasonwryan
1
Bukankah ini sesi yang bersarang? Maksud saya untuk menjalankan Prefix Shift Ssaya harus berada di tmux dan mencari file Anda mencoba untuk memulai sesi baru yang tmux tidak suka dan tidak akan lakukan kecuali Anda memaksanya.
user35915
1
@ user35915 tidak akan memulai sesi anak, tetapi yang terpisah - pada yang Anda dapat beralih menggunakan misalnya awalan-s atau awalan-) dan awalan- (
sehe
1
Ini harus menjadi jawaban yang diterima. Namun mengikat s (bukan S) akan menggantikan tmux bawaan untuk sesi daftar.
Hitung0
54

Gunakan tmuxinator - memungkinkan Anda untuk mengkonfigurasi banyak sesi, dan Anda dapat memilih mana yang akan diluncurkan pada waktu tertentu. Anda dapat meluncurkan perintah di jendela atau panel tertentu dan memberikan judul ke windows. Berikut adalah contoh penggunaan dengan mengembangkan aplikasi Django .

Contoh file konfigurasi:

# ~/.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

Lihat README di tautan di atas untuk penjelasan lengkap.

Hamish Downer
sumber
2
tmuxinator pada dasarnya adalah persis apa yang saya cari. Terima kasih!
Justin Force
3
ada juga tmuxp yang cukup mirip: github.com/tony/tmuxp
Ben Creasy
16

lihat @ https://github.com/remiprev/teamocil

Anda dapat menentukan struktur Anda menggunakan YAML

windows:
  - name: sample-window
    splits:
      - cmd: vim
      - cmd:
        - ipython
        width: 50
      - cmd:
        height: 25
locojay
sumber
16
:~$ tmux new-session "tmux source-file ~/session1"  

sesi 1

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

buat alias di .bashrc

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  
manajer m_
sumber
~ Apa neww? Saya tidak dapat menemukan perintah itu di mana pun. ~ Kelihatannya seperti itu new-window, meskipun saya tidak mengerti mengapa Anda menggunakan bentuk panjang dan pendek.
oligofren
11

Pertama saya mendapat pendekatan dari @jasonwryan tetapi jika Anda memiliki lebih dari 2 konfigurasi, ini bisa membingungkan.

Jadi saya membuat fungsi alias:

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

Dalam ~/.tmux/saya punya beberapa sesi untuk banyak kegunaan. Misalnya saya bekerja untuk perusahaan yang berbeda yang saling memiliki lingkungan pengembang. Jadi dengan fungsi alias di atas saya cukup memanggil: tmx company1dan memuat konfigurasi yang saya butuhkan.

Pembaruan: Tujuan dari "$ 2" setelah tmuxperintah adalah, agar Anda dapat melewati argumen tmux tambahan.

danbruegge
sumber
1
Menggabungkan ini dengan tips dari @ soc1c membuat pengaturan super-manis ( github.com/fatso83/dotfiles/commit/35a7ed ). Terima kasih!
oligofren
Fungsi tidak benar-benar berfungsi ketika belum ada sesi tmux yang ada untuk dihubungkan (get no server running on /tmp/tmux-1000/default). Itu sebabnya saya perlu memperbaiki perintah tmux new-session. Ref github.com/fatso83/dotfiles/commit/…
oligofren
1
Saya melakukan pengaturan tmux dengan systemd. Jadi selalu ada sesi berjalan setelah boot. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd Maaf karena tidak menyebutkannya.
danbruegge
10

Dari skrip "get.all" saya, yang saya panggil setiap pagi untuk menjalankan banyak pekerjaan "get.XXX" berikutnya untuk menyegarkan perangkat lunak yang saya lacak. Beberapa dari mereka berhenti secara otomatis. Yang lain membutuhkan lebih banyak interaksi setelah mendapatkan selesai (seperti meminta untuk membangun 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
Randal Schwartz
sumber
8

Jika Anda hanya ingin membagi layar menjadi 2 panel (katakan secara horizontal), Anda dapat menjalankan perintah ini (tidak diperlukan skrip tmux atau shell):

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

Layar Anda akan terlihat seperti ini:

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

Dan ini adalah bagaimana saya melakukannya:

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

Saya punya satu file untuk setiap proyek saya. Anda juga dapat mengelompokkan mereka untuk memiliki beberapa untuk pekerjaan beberapa untuk proyek hobi.

Anda juga dapat memindahkannya ke ~/binfolder, menambahkannya ke PATHdan memberi tmux_my_awesome_projectnama. Maka Anda akan dapat menjalankannya dari setiap tempat.

Artur Małecki
sumber
4

Ini bekerja untuk saya. Membuat 5 jendela dengan nama yang diberikan dan memilih otomatis ke homejendela.

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

Coba bro , ini adalah bootstrapper proyek.

Ini memberikan apis mudah untuk berinteraksi tmux.

Itu terlihat seperti ini:

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

Untuk meluncurkan proyek, yang perlu dilakukan adalah menjalankan perintah berikut -

bro start <project_name>

Lihat screencast di bawah ini, ini menunjukkan cara memulai brodan menggunakan tmuxapinya.

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

Asur
sumber
2

Plugin tmux-continuum akan secara otomatis menyimpan sesi tmux Anda dan memuatnya saat berikutnya tmux dimulai, akan lebih mudah untuk diatur daripada beberapa solusi skrip khusus di sini.

Fitur:

  • penghematan terus menerus dari lingkungan tmux
  • tmux otomatis mulai ketika komputer / server dihidupkan
  • pemulihan otomatis ketika tmux dimulai

Untuk menyimpan sesi Anda sesuai permintaan, Anda dapat menggunakan plugin tmux-resurrect . tmux-resurrect juga diperlukan untuk menjalankan tmux-continuum

tmux-resurrect menyimpan semua detail kecil dari lingkungan tmux Anda sehingga dapat sepenuhnya dipulihkan setelah sistem dinyalakan kembali (atau ketika Anda menginginkannya). Tidak diperlukan konfigurasi. Anda harus merasa seperti Anda tidak pernah berhenti tmux.

Padhraic
sumber
2

Ada plugin tmux untuk ini.

Lihat tmux-bangkit kembali

Kembalikan lingkungan tmux setelah sistem dinyalakan kembali.

Tmux bagus, kecuali ketika Anda harus me-restart komputer. Anda kehilangan semua program yang sedang berjalan, direktori kerja, tata letak panel dll. Ada alat manajemen yang membantu di luar sana, tetapi mereka memerlukan konfigurasi awal dan pembaruan terus-menerus ketika alur kerja Anda berkembang atau Anda memulai proyek baru.

tmux-resurrect menyimpan semua detail kecil dari lingkungan tmux Anda sehingga dapat sepenuhnya dipulihkan setelah sistem dinyalakan kembali (atau ketika Anda menginginkannya). Tidak diperlukan konfigurasi. Anda harus merasa seperti Anda tidak pernah berhenti tmux.

Atau tmux-kontinum

Fitur:

  • penghematan terus menerus dari lingkungan tmux
  • tmux otomatis mulai ketika komputer / server dihidupkan
  • pemulihan otomatis ketika tmux dimulai
Syakur Rahman
sumber
2

Anda dapat menggunakan kait tmux untuk menjalankan perintah saat sesi baru dibuat. Secara khusus, ini dicapai dengan menggunakan session-createdkail.

Misalnya, untuk membagi layar tiga cara dengan htop berjalan di kanan bawah Anda dapat menambahkan baris berikut ke ~/.tmux.conffile Anda :

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

Keuntungan dari metode ini adalah Anda tidak harus menjalankan tmux dengan cara khusus (yaitu, skrip shell atau alias) untuk mendapatkan hasil yang diinginkan. Anda juga dapat menggabungkan ini dengan yang tmux new-session -A -s mysessiondijelaskan dalam jawaban lain ini sehingga perintah kait hanya dijalankan ketika Anda pertama kali membuat sesi dan bukan pada lampiran berikutnya.

Fitur ini ditambahkan oleh d15d54c2c pada tahun 2016. Rilis pertama yang menyertakannya adalah 2.4.

kevmitch
sumber
1

Anda harus menentukannya di file konfigurasi tmux Anda ( ~/.tmux.conf), misalnya:

new mocp
neww mutt

new -d
neww
neww

(membuka satu sesi dengan 2 jendela dengan mocp diluncurkan di pertama dan mutt di kedua, dan sesi terpisah dengan 3 jendela kosong).

Victor Deryagin
sumber
1

Saya sudah membuat skrip ini . Tidak perlu tmuxinator, ruby ​​atau yang lainnya. Ini hanya skrip bash, dapat dikonfigurasi:

File bernama config harus berisi sesuatu seperti ini:

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

dan kode bash seharusnya:

#!/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
sensorario
sumber
Hai sensorario, sementara tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. Silakan lihat di sini: Mengapa dan bagaimana beberapa jawaban dihapus?
bummi
Nb luar biasa, tmux start_servertidak memulai server sendiri. Lihat github.com/tmux/tmux/issues/182
Jack Wasey
1

Saya hanya mencoba menggunakan semua ide di halaman ini dan saya tidak suka ide-ide itu. Saya hanya ingin solusi yang memulai tmux dengan satu set jendela spesifik ketika terminal saya dibuka. Saya juga ingin itu menjadi idempoten, yaitu membuka jendela terminal baru mengambil alih sesi tmux dari yang sebelumnya.

Solusi di atas sering cenderung membuka beberapa sesi tmux dan saya ingin hanya satu. Pertama, saya menambahkan ini ke ~/.bash_profile:

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

kemudian saya menambahkan yang berikut ini ke ~/.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

sekarang setiap kali saya memulai terminal atau memulai tmux atau apa pun, saya menyambungkan kembali ke pengaturan yang ada yang saya inginkan (nama sesi default), atau membuat sesi baru dengan pengaturan itu.

Phil Hollenback
sumber
luar biasa, tmux start_servertidak memulai server sendiri. Lihat github.com/tmux/tmux/issues/182
Jack Wasey
1

tmuxp mendukung konfigurasi sesi JSON atau YAML dan API python. File konfigurasi tmuxp sederhana untuk membuat sesi baru dalam sintaks YAML adalah:

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

Script ini memulai sesi dengan nama "e" dan tiga jendela

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