Mengikat kunci tmux ke beberapa perintah

37

Saya meluncurkan jendela multi-tmux untuk memonitor beberapa parameter server. Dengan Ctrl-S saya dapat membuka jendela baru dengan perintah monitor lain.

Sekarang saya ingin mengikat Ctrl-Q untuk membuka jendela multipane lain dengan beberapa monitor. Bagaimana cara saya mengikat kunci ke beberapa perintah? Saya mencoba merantai mereka; dan \; - tidak ada yang membantu. Tolong, beri tahu apa yang harus saya gunakan daripada ... di bawah ini.

Apakah mungkin ketika saya membuka jendela baru untuk menunda perintah latar belakang yang tumpang tindih dengannya?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."
jackhab
sumber

Jawaban:

37

Todd Freed benar, cara "benar" untuk melakukan ini adalah menggunakan \;. Semacam. Tapi ada halangan.

Anda lihat, Anda bergabung dengan urutan perintah tmux bersama dengan memberikan tmux konjungsi ;. Dengan demikian, dalam file yang bersumber dari tmux, Anda mungkin mengatakan

new-session "monitor1" ; split-window -v "monitor2"

jika, karena suatu alasan, Anda menginginkan itu semua dalam satu jalur. Sekarang, Anda dapat memberikan bahwa satu-baris pernyataan majemuk dengan tmuxperintah dari shell juga tapi yang ;harus melarikan diri sehingga menafsirkan shell sebagai argumen lain untuk tmux. Jadi, yang setara dengan yang di atas dari shell adalah

$ tmux new-session "monitor1" \; split-window -v "monitor2"

Demikian pula, bind-keyperintah tmux mengambil serangkaian argumen yang merupakan perintah tmux dan argumen untuk dijalankan ketika tombol ditekan. Jika Anda ingin mengikat C-qurutan di atas dari dalam file yang bersumber dari tmux, Anda akan mengatakannya

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Di sini kita telah lolos ; dari tmux , sehingga tmux tidak menafsirkannya sebagai akhir dari bind-keyperintah, tetapi sebagai argumen lain untuk bind-keymengatakannya untuk membentuk perintah majemuk sebagai nilai terikat C-qkunci.

Jadi apa yang terjadi ketika kita ingin membuat tmux melakukan itu dari shell? Banyak yang melarikan diri.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

Pertama, kita harus melarikan diri \ dan; masing - masing dari shell , menyebabkan shell untuk melewati dua karakter \;sebagai argumen tmux. Ini kemudian lolos ;dari tmux, menyebabkannya menetapkan seluruh pernyataan majemuk sebagai pengikatan C-q.


Sekarang, semua yang dikatakan, jika Anda menggunakan pengaturan tmux yang kompleks seperti ini berulang kali, saya sarankan Anda membuat file tmux untuk menyimpannya di:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Lalu:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Akan jauh lebih mudah untuk mempertahankannya.

Peeja
sumber
3
Untuk membuat kunci yang mengikat ke beberapa perintah dari baris perintah tidak terlalu mengerikan untuk dilihat, Anda juga dapat melepaskan diri dari \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap
12

Jadi jawaban sebenarnya adalah: Anda mem-chain perintah dengan backslash diikuti dengan tanda titik koma.

bind-key C send-keys foo \; send-keys bar

Anda akan meletakkannya di tmux.conf Anda, atau jalankan dari tmux ":" prompt

Todd Freed
sumber
ini hebat dan bekerja untuk menggunakan sesi tmux bersarang dan menavigasi melalui jendela tmux bersarang.
Paul
1
Ini tidak bekerja dari baris perintah shell. Yaitu `tmux bind-key C tombol kirim foo \; bilah kirim-kunci "memiliki efek mengikat" foo "ke" C "tetapi segera mencetak" bilah "
Lqueryvg
Ya, Anda akan menjalankannya dari dalam tmux. Diperbarui untuk memperjelas.
Todd Freed
Bagus! Ini benar-benar berfungsi ... muchas gracias!
Taman Brad
Catatan: a; di dalam tanda kutip tunggal tidak perlu melarikan diri
syarat
2

Anda dapat melakukan ini dengan solusi kecil. Mirip dengan jawaban yang menyarankan skrip untuk dijalankan (yang menangani kasus Anda dengan baik), umumnya dapat dilakukan dengan menggunakan "run-shell" dan memanggil tmux sendiri sebagai perintah shell.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

yang akan mengirim kunci 'xyz', tmux perintah 'clear-history', dan kemudian memanggil builtin 'clear' shell.

Seluruh string hanyalah urutan perintah beberapa shell.

Menyeberang
sumber
1

Anda dapat menambahkan sesuatu seperti ini ke binding utama ke .tmux.conffile Anda :

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Dan di dalam tmux-new-session.shkamu dapat memiliki:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit
paradroid
sumber
1

Semua yang ditampilkan di sini tidak akan berfungsi, karena ini

bind q send-keys "command1" \; send-keys "command2"

akan menjalankan command2 segera dan q akan diikat hanya untuk mengirim-kunci "command1"

Inilah solusinya:

bind R source-file "$HOME/.tmux/reload.tmux"

Dalam file ~ / .tmux / reload.tmux masukkan beberapa perintah seperti:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."
lzap
sumber
1
Oh, tunggu, gunakan apa yang dikatakan Peeja (\\;;) :-)
lzap