Bagaimana cara mendapatkan tmux untuk membuka satu set panel tanpa memasukkannya secara manual?

30

Jadi, saya ingin membuat tmuxsesi khusus proyek yang muncul perintah tertentu di panel tertentu secara otomatis. Mengikuti tutorial online dan tmuxhalaman manual, inilah yang saya buat untuk file konfigurasi:

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

Hasilnya adalah ... tidak ada apa-apa. tmuxdimulai dengan satu jendela dan satu panel di jendela itu tanpa perintah dijalankan.

Bagaimana saya bisa membuat file konfigurasi yang sebenarnya memungkinkan saya untuk membuat satu set windows dan panes dengan perintah tertentu yang sudah dijalankan?

HANYA PENDAPAT SAYA yang benar
sumber

Jawaban:

36

File konfigurasi Anda berfungsi, tetapi ada beberapa komplikasi.

Perintah berumur pendek

Pertama, perintah yang Anda mulai (contoh ls ) selesai berjalan dengan sangat cepat. Jendela dan panel untuk perintah dibuat, tetapi menghilang begitu setiap perintah keluar.

Jika tujuan Anda adalah untuk benar-benar menggunakan perintah "satu tembakan" seperti itu dalam konfigurasi akhir Anda, maka Anda mungkin harus menggunakan opsi jendela remain-on-exit(dan mungkin opsi sesi set-remain-on-exituntuk menyediakan default untuk semua jendela yang dibuat dalam sesi). Ketika remain-on-exitdiatur untuk sebuah jendela, itu tidak akan hilang ketika perintah keluar. Anda mungkin ingin memetakan respawn-windowkunci ke (catatan: respawn-windowakan respawn perintah asli; respawn-panejuga tersedia di tmux 1.5 untuk respawn masing-masing panel).

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

Atau, jika Anda tidak keberatan jendela awal Anda menjadi nomor 1 dan bukan angka 0, maka kami dapat menghindari mengubah nilai global:

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

Jika Anda hanya menggunakan lsperintah placeholder yang disederhanakan dan Anda benar-benar berniat untuk menelurkan beberapa jenis perintah interaktif di windows / panel Anda, maka Anda mungkin harus menelurkan perintah yang ingin Anda jalankan. Jika perintah yang Anda maksudkan terlalu lama untuk memulai untuk menggunakannya selama pengujian tmux , maka gantilah shell atau perintah interaktif sederhana lainnya (mis top. sqlite3,, Dll.).

new-session Apakah Perintah Default

Kedua, menjalankan tmux tanpa argumen perintah (misalnya tmux) setara dengan menggunakan new-sessionperintah (yaitu tmuxsama dengan tmux new-session). Anda .tmux.confmembuat sesi untuk windows / panenya ( newadalah alias untuk new-session) dan sesi lain sedang dibuat untuk new-sessionperintah implisit yang ditentukan dengan memulai tmux tanpa argumen perintah. Jika Anda menggunakan bilah status default, Anda akan melihat a [1]di sebelah kiri bilah status ketika Anda berada di sesi "ekstra" (sesi awal yang dibuat di .tmux.confadalah angka 0).

Jika Anda ingin menghindari membuat sesi tambahan, maka gunakan tmux attachsebagai ganti polos tmux. Perintah dari Anda .tmux.confakan berjalan, membuat sesi 0, dan kemudian klien Anda akan melampirkan ke sesi itu daripada membuat yang baru.

Chris Johnsen
sumber
2
OK, saya mungkin setebal sandwich ikan paus di sini, tapi saat ini saya punya file konfigurasi yang hanya ada splitwdi dalamnya - tidak ada yang lain - dan saya masih tidak mendapatkan layar split karena katanya tidak dapat menetapkan sesi saat ini. Jika saya tambahkan newsebelumnya, saya mendapatkan ... satu jendela, satu panel. Saya tidak bisa, seumur hidup saya mendapatkan dua panel saat start-up.
HANYA PENDAPATAN SAYA yang benar
1
File konfigurasi dengan new, kemudian splitwberfungsi untuk saya ketika saya memulai tmux via tmux attach. Satu hal yang perlu diingat adalah bahwa .tmux.conf(atau file yang ditentukan dengan -fopsi) hanya digunakan jika tidak ada server yang sudah berjalan. Periksa apakah server berjalan melalui tmux ls. Jika Anda ingin menjalankan perintah dari file ketika server sudah berjalan, maka lakukan seperti ini: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(jika Anda menjalankan ini ketika tidak ada server Anda .tmux.conf(atau -ffile) akan berjalan dulu maka source-filefile Anda ).
Chris Johnsen
File konfigurasi sedang ditentukan dengan -f - jadi saya akan pergi tmux new -f myconfig. Isi file konfigurasi itu hanya new diikuti oleh splitw. Saya membunuh semua dan semua proses tmux sebelum saya mencoba baris perintah tmux -f myconfig. Saya tidak mendapatkan dua panel. Saya benar-benar bingung di sini dengan apa yang harus dilakukan melewati titik ini (selain hanya menyerah pada tmux).
HANYA PENDAPATAN SAYA yang benar
4
@Just: Apakah Anda menggunakan -fatau tidak, tmuxtanpa argumen perintah sama dengan tmux new-session(yang, untuk server baru, akan membuat sesi baru di atas apa pun yang dilakukan file konfigurasi Anda). Jendela pre-split Anda dibuat di sesi 0, tetapi new-sessionperintah implisit membuat (dan melampirkan) sesi tambahan (sesi 1; cari di [1]dalam baris status Anda). Gunakan tmux -f myconfig attachuntuk menghindari membuat sesi baru yang menyembunyikan jendela pre-split Anda.
Chris Johnsen
1
OK, saya kira belajar membaca pada akhirnya akan membuahkan hasil bagi saya. :) Terima kasih atas usaha dan jawabannya. Semuanya baik-baik saja sekarang. Saya berharap ada reputasi "toples" di sini sehingga saya bisa memberi Anda lebih dari sekadar jawaban yang diterima.
HANYA SAYA PENDAPAT benar
9

Saya tidak yakin saya mengerti apa yang Anda maksud dengan "memasukkan secara manual", tetapi ini adalah bagaimana saya melakukannya. Saya menulis skrip "autostart" yang diluncurkan oleh manajer jendela saya. Itu mengandung:

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

di mana setiap file .session terlihat seperti ini:

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

Tunggu, masih ada lagi! Saya memiliki semakin banyak file .session yang saya muat dengan konsole:

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

di mana work_console.tabs terlihat seperti ini:

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

Lalu saya tekan F12 untuk meluncurkan konsole.

John Schmitt
sumber
konsole tampaknya rusak jadi saya sudah beralih ke Terminal , yang berfungsi dengan baik. Saya memiliki posting yang lebih rinci di milis tmux-pengguna.
John Schmitt
1
Hanya komentar kecil, Anda bisa mengganti '! -z 'dengan' -n 'dalam tes Anda;)
lilorox
6

misalkan Anda ingin meluncurkan 3 tugas pemantauan server (di sini ping localhost) tidak perlu dipusingkan dengan file konfigurasi dan sesi yang disimpan. Itu semua bisa dilakukan dari command-line.

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
sumber
Terima kasih atas kesederhanaannya - persis contoh yang saya cari!
dsz
5

Saya menemukan teamocil sangat berguna untuk mengotomatiskan tmux windows / sesi.

Ini ditulis dalam Ruby sehingga Anda perlu menginstalnya.

Berikut ini contoh konfigurasi:

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

Anda dapat memiliki pengaturan jendela dan pemisahan.

Keris
sumber
4

Alternatif lain yang mirip dengan teamcoil adalah tmuxinator , ini pada pengembangan aktif dan bekerja dengan cukup baik. Ini juga direkomendasikan (dan agak ditinjau) pada tmux yang luar biasa : Pengembangan Bebas Tikus Produktif dari Rak Buku Pragmatis .

Pablo Olmos de Aguilera C.
sumber
Menemukannya sedikit lebih bersih daripada teamocil (tapi sangat mirip) dan saya menggunakannya sekarang. Saya cukup senang dengan cara kerjanya!
Aktau
4

**

  • Lebih baik Simpan Sesi Anda!

** Saya menemukan bahwa untuk admin malas seperti saya, saya lebih suka menyimpan sesi tmux, daripada menghabiskan berjam-jam mencoba membangunnya dengan sempurna. Saya mengelola lebih dari 30 server, dan sesi tmux saya dinamis, dengan konfigurasi yang berubah setiap saat. Itu sakit di leher, sampai saya baru-baru ini menemukan tmux-menghidupkan kembali plugin ini hanya hebat. Cobalah. Saat ini, repositori Ubuntu memiliki tmux 1.8, plugin ini perlu 1.9, jadi Anda perlu melakukan upgrade secara manual

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

Setelah itu Anda dapat menginstalnya dengan

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

Kemudian dd baris ini ke bagian bawah ~ / .tmux.conf (jika ~ / .tmux.conf tidak tersedia, buat file kosong)

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

Saya juga menambahkan baris ini di akhir ~ / .tmux.conf sehingga plugin menyimpan sesi untuk semua program yang saya jalankan

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

Kemudian muat ulang lingkungan tmux.

tmux source-file ~/.tmux.conf

Itu dia! Kamu selesai. Sekarang, jalankan tmux seperti biasa, ubah ukuran panel Anda, buat panel baru, buat sesi baru ... dll. Ketika Anda puas dengan konfigurasi yang Anda capai (di beberapa jendela dan beberapa sesi), cukup klik ctrl + b lalu ctrl + s untuk menyimpan sesi. Untuk menguji hasilnya, cukup bunuh semua tmux

killall tmux

Kemudian, jalankan lagi tmux

tmux

Kemudian, dari dalam tmux klik ctrl + b lalu ctrl + r (untuk mengembalikan) Secara ajaib, semua jendela, panel, dan sesi Anda dipulihkan dengan geometri dan pengaturan yang sama. Semoga ini bisa membantu.

pengguna1757247
sumber