Memindahkan panel tmux ke jendela

228

Bagaimana cara memindahkan panel yang ada ke jendela lain di tmux ketika saya memiliki beberapa jendela, dan sebaliknya?

Saya datang dari layar , di mana saya bisa beralih ke panel dan kemudian beralih windows sampai saya mendapatkan yang saya inginkan; tmux tampaknya tidak mengizinkan ini.

Tuanratrat
sumber

Jawaban:

209

Perintah untuk melakukan ini adalah join-panedi tmux 1.4.

join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]  
    (alias: joinp)
    Like split-window, but instead of splitting dst-pane and creating
    a new pane, split it and move src-pane into the space.  This can
    be used to reverse break-pane.

Untuk menyederhanakan ini, saya memiliki ini mengikat saya .tmux.confuntuk itu:

# pane movement
bind-key j command-prompt -p "join pane from:"  "join-pane -s '%%'"
bind-key s command-prompt -p "send pane to:"  "join-pane -t '%%'"

Yang pertama mengambil panel dari jendela target dan menggabungkannya ke arus, yang kedua melakukan sebaliknya.

Anda kemudian dapat memuat kembali sesi tmux Anda dengan menjalankan yang berikut dari dalam sesi:

$ tmux source-file ~/.tmux.conf
jasonwryan
sumber
Saya mencoba metode ini tetapi ketika saya meletakkan kode Anda ke file .tmux.conf saya dan melakukan Ctrl-b, j, sepertinya tidak ada yang terjadi.
mrlanrat
2
Anda memerlukan setidaknya 2 jendela terbuka, dengan beberapa panel di masing-masing: lalu tekan Prefix+sdan masukkan nama jendela di prompt untuk mengirim panel ke jendela itu ...
jasonwryan
Saya masih belum beruntung dengan ini, tidak ada yang terjadi. Saya merasa tmux tidak membaca file .tmux.conf karena tidak merespon sama sekali terhadap Ctrl-b, j atau Ctrl-b, s. (ini adalah hanya 2 baris dalam file konfigurasi)
mrlanrat
7
@ mrlanrat Saya menemukan bahwa Anda harus mengawali nomor jendela dengan titik dua. Lihat jawaban saya di bawah ini.
Bruno Bronosky
1
Apa yang dimaksud dengan '%%'?
oligofren
152

join-pane adalah jawabannya. Saya juga mengalami masalah dengan upaya saya untuk menggunakannya berdasarkan dokumentasi tmux. Saya menemukan bahwa -t dan -s switch tampaknya menerima [sesi]: jendela dan bukan jendela [sesi:]. Dengan kata lain menentukan sesi adalah opsional, tetapi termasuk: adalah wajib. (Saya menggunakan tmux 1.5)

Oleh karena itu, untuk menambahkan panel ke jendela saat ini dan menempatkan jendela 1 ke dalam panel, perintahnya adalah (Ctrl-B atau apa pun kunci ikatan Anda, diikuti oleh) ...

:join-pane -s :1

Anda kemudian dapat memecahnya appart dengan break-pane yang secara default adalah: Ctrl-B! Jika Anda ingin mengikatnya ke pintasan, saya sarankan TIDAK mengesampingkan pengikatan bawaan seperti s, karena di ujung jalan Anda akan mencari di internet untuk jawaban yang melibatkan sesi pilih dan itu tidak akan berfungsi pada sistem Anda. Perhatikan bahwa break-pane terikat! dan @ tepat di sebelahnya dan tidak terikat apa pun secara default. Untuk alasan itu saya menyarankan ini mengikat ...

bind-key @ command-prompt -p "create pane from:"  "join-pane -s ':%%'"

Bergantian, untuk memiliki pemilih interaktif ...

bind-key @ choose-window 'join-pane -h -s "%%"'

Bergantian, untuk selalu bergabung dengan jendela yang terakhir dikunjungi ...

bind-key @ join-pane -h -s !

CATATAN: -hPenyebabnya menumpuk panel secara horizontal (dengan split vertikal) sebagai kebalikan dari perilaku default yang merupakan kebalikannya.

Yang paling penting adalah BELAJAR Anda apa pun yang Anda pilih untuk pintasan. Karena jika Anda hanya mengaturnya dan melupakannya, Anda akan tertatih-tatih ketika menemukan diri Anda di server asing. Dan mari kita hadapi itu, hal terpenting yang diberikan terminal multiplexer adalah sesi yang dapat diandalkan di server jarak jauh.

Ini menyelesaikan konversi saya dari Layar GNU ke Tmux. Saya tidak akan pernah melihat ke belakang.

Nikmati!

Bruno Bronosky
sumber
2
Saya telah melewatkan ':' juga ... terima kasih untuk ini.
rascalking
Saya mendapat 2 suara di atas ini baru-baru ini tanpa komentar yang menyarankan mengapa. Itu hanya budaya kasar dan anti-FOSS.
Bruno Bronosky
1
dokumentasi tidak berbicara tentang titik dua sama sekali! Nice one
JonnyRaa
1
Menggunakan sintaks dot itulah yang membantu saya window.panemisalnya join-pane -s 1.0untuk memindahkan panel 0 di jendela 1 ke jendela saat ini. Lebih detail di maciej.lasyk.info/2014/Nov/19/tmux-join-pane
mbigras
Pada tmux 2.1, :tampaknya tidak diperlukan lagi (mis. Lakukan saja :join-pane -s 1). Mungkin itu adalah bug di versi sebelumnya
villapx
38

Saya pikir saya menyukai apa yang telah saya gunakan untuk memindahkan panel ke jendela mereka sendiri dengan lebih baik. saya menggunakan

break-pane -t :

Saya mengetahuinya melalui eksperimen, tetapi tampaknya bekerja dengan sangat baik. Anda dapat mengikat atau alias dengan mudah, tidak perlu skrip.

Joshua K
sumber
2
+1. Saya cenderung menggunakan ini lebih sering daripada join-pane.
Chris B
14

Jika Anda tidak ingin mengetik pengidentifikasi panel ke prompt, Anda juga bisa menggunakan

bind-key j "join-pane -s !"

yang akan bergabung dengan panel / jendela aktif terakhir ke jendela saat ini.

Bernhard T
sumber
1
Versi mana yang Anda gunakan? Saya mendapatkan unknown command: join-pane -s !1,6.
paradroid
Menggunakan 2.0 di sini, tetapi hanya menempatkan baris ke conf tanpa tanda kutip tampaknya berfungsi dengan baik. bind-key j join-pane -s !
bkzland
13

Setelah melihat-lihat jawaban lain dan membaca halaman manual tmux saya memutuskan untuk mengikat berikut untuk saat ini:

bind-key S choose-window 'join-pane -v -s "%%"'
bind-key V choose-window 'join-pane -h -s "%%"'

Ini akan memungkinkan Anda secara interaktif memilih jendela untuk bergabung, dan mencerminkan huruf kecil s/ vbinding saya untuk membuat pemisahan vertikal / horizontal baru. Jika ada yang tahu cara memilih panel individual, bukan windows, beri tahu saya.

toupeira
sumber
Ini sangat membantu. Terima kasih. Sayangnya -vdan -htidak membuat "splits" vertikal dan horizontal masing-masing. Mereka membuat " panel susun " vertikal dan horizontal masing-masing. (Artinya, panel yang ditumpuk secara vertikal memiliki pemisahan horizontal.) Jadi, Anda harus melatih otak Anda seperti itu. Juga -vmerupakan default, jadi saya akan meninggalkan itu dan hanya menempatkan -hdi sana sehingga Anda ~/.tmux.confbertindak sebagai lembar contekan untuk Anda lihat.
Bruno Bronosky
Saya suka ini lebih baik daripada jawaban lain untuk "kebalikan dari break-pane". Setelah memecah panel bebas ke jendela sendiri untuk sementara, nanti saya ingin mengirimnya kembali ke salah satu jendela yang lebih tua dan ini menangani itu dengan anggun.
Stabledog
13

Ikatan kunci

Secara default, Ctrl+ b, !akan memecah panel aktif ke jendela baru dan beralih ke sana.

Di mana Ctrl+ badalah awalan default untuk .

Detail

The tmuxperintah mengeksekusi kunci ini adalah break-pane(alias: breakp) seperti yang diterapkan dalam cmd-break-pane.cdan terikat sebagai default di kunci-bindings.c seperti yang terlihat dalam list-keys(alias: lsk) output perintah:

bind-key    -T prefix       !                 break-pane
muru
sumber
4

Anda tidak perlu mengubah ikatan utama Anda.

Sementara panel yang ingin Anda pindahkan memiliki fokus, ketik Awalan lalu di :join-pane -t :1mana 1pun nomor jendela tujuan dalam sesi yang sama. Anda dapat memindahkannya ke sesi lain dengan menambahkan namanya seperti project:3. Bagi saya join-panetab-pelengkap otomatis dari j.

Tambahkan -hatau -valihkan ke perintah untuk mengatur orientasi pemisahan baru yang dibuat di tujuan, atau cukup buka dan Awalan + spaceuntuk mengatur ulang.

Walf
sumber