Bagaimana cara menggilir panel di dalam jendela di tmux seperti di layar?

41

Saya pikir Memindahkan panel tmux ke jendela adalah pertanyaan yang sama tetapi sepertinya tidak.

Berasal dari menggunakan layar GNU secara teratur, saya mencari tmux untuk melakukan hal yang sama. Salah satu hal yang saya lakukan secara teratur adalah membuka beberapa jendela berbeda, satu dengan beberapa kode terbuka di vim, dan beberapa terminal terbuka untuk menguji kode, dan kadang-kadang satu atau dua jendela untuk berbagai hal lainnya. Saya membagi layar secara vertikal dan akan sering memiliki jendela vim di panel atas dan kemudian salah satu jendela lain di bane bawah.

Perintah utama yang kemudian saya gunakan adalah Ctrla, Tabuntuk memutar di antara panel dan Ctrla, nuntuk memutar antara jendela di dalam panel. Misalnya, dengan vim di panel atas, saya beralih ke panel bawah dan kemudian memutar melalui terminal lain, melakukan apa pun yang saya butuhkan. Layar tetap terbelah sepanjang waktu.

Masalahnya adalah saya tidak dapat menemukan kemampuan yang sebanding dengan layar Ctrla, ndi tmux. Mengganti jendela tampaknya tidak berfungsi di dalam panel, tetapi melompat seluruhnya. Jika layar terpecah, hanya dua pilihan yang tampaknya melompat ke beberapa jendela yang tidak terpecah dan kemudian membelahnya atau untuk melakukan sub-split panel. Tidak juga yang saya cari.

Saran (selain hanya bertahan dengan layar)?

FooBar
sumber
Terminologi Anda sedikit membingungkan. Dalam tmuxsebuah jendela dapat dibagi menjadi beberapa panel. Apakah Anda mencoba untuk menggilir antara panel di jendela dengan keybind?
jasonwryan
Saya mencoba mengikuti nomenklatur alat, tetapi saya akui itu membingungkan. Saya tahu cara mengubah fokus dari satu panel ke panel lainnya. Yang saya coba cari tahu adalah bagaimana siklus apa yang ditampilkan di panel tertentu tanpa mengubah tata letak.
FooBar
Jadi untuk memindahkan konten dari satu panel ke panel lainnya? Apakah Anda mencari swap-pane? Jika Anda ingin meniru layar Ctrl-a n, maka setara tmux adalah Ctrl-b n.
jasonwryan

Jawaban:

28

tmux dan layar memiliki model yang berbeda sehingga tidak ada padanan yang tepat.

Dalam istilah layar , pemisahan memungkinkan Anda menampilkan beberapa jendela secara bersamaan. next( C-a n) memutar jendela melalui bagian aktif perpecahan; ini memungkinkan Anda memutar jendela "tersembunyi" melalui wilayah aktif perpecahan.

Dalam istilah tmux , split membagi sebuah jendela menjadi satu atau lebih panel. Setiap bagian dari jendela terbagi adalah panel individu, panel tidak pernah disembunyikan (jika jendela dipilih (terlihat) semua panelnya juga), dan panel hanya dapat digunakan dalam satu split dari satu jendela (panel dapat tidak berada di banyak jendela, dan itu tidak bisa di banyak jendela yang sama). Ada perintah untuk memindahkan panel di dalam (atau di antara) jendela, tetapi tidak dengan cara yang sama dengan nextdi layar .


Anda dapat menggunakan penjilidan seperti berikut untuk mengatur efek yang serupa:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

Anda mungkin ingin meletakkan ini di ~/.tmux.conffile Anda , tetapi Anda bisa mengetik / menempelnya setelah Prefix :mengikatnya di server Anda saat ini.

Untuk menggunakan penjilidan, pilih "jendela utama" Anda, pisahkan, buat jendela "pane container" segera setelah "jendela utama", lalu gunakan penjilidan untuk memutar panel di "jendela utama" di antara grup di "jendela utama". jendela pane container ”.

Inilah cara Anda membuat pengaturan:

  • Pilih jendela untuk digunakan sebagai "jendela utama" Anda. Mulai (mis.) Vim di dalamnya.

  • Bagi "jendela utama" Anda menjadi dua panel.

    Misalnya Prefix "( :split-window)

    Anda dapat menggunakan panel ini sebagai jendela pengujian Anda (atau penampil log, atau apa pun).

  • Buat jendela baru ("wadah pane") segera setelah jendela utama Anda.

    Misalnya Prefix c( :new-window)

    Penting bahwa tidak ada jendela lain yang berada di antara indeks "jendela utama" dan jendela "wadah pane" ( +dalam penspesifikasi jendela yang digunakan dalam perintah terikat berarti "jendela bernomor lebih tinggi berikutnya").

  • Membagi jendela ini menjadi beberapa panel. Untuk memutar melalui tiga panel, bagi jendela ini menjadi dua panel (panel ketiga adalah yang ada di "jendela utama").

    Mungkin Anda membutuhkan shell untuk git , dan shell untuk menjalankan antarmuka database. Letakkan masing-masing di panel terpisah di jendela "wadah wadah" ini.

  • Beralih kembali ke "jendela utama" Anda. Pilih panel yang ingin Anda “putar”.

    Anda dapat menggunakan Prefix Up/ Down/ Left/ Rightuntuk bergerak di antara panel.

  • Aktifkan ikatan untuk menukar panel saat ini dengan panel pertama di jendela "wadah wadah" dan ("di belakang layar") memutar panel di dalam jendela "wadah wadah" (sehingga saat berikutnya Anda menjalankan penjilidan, perintah pertama swap dengan panel "selanjutnya" dalam urutan).

    Prefix Control- n(penggunaan mengikat Cn, tetapi Anda bisa mengubahnya ke apa pun yang Anda suka).

  • Untuk menggulir mundur melalui panel, Anda dapat menggunakan di bawah ini:

bind-key Cp swap-pane -s: +. bottom \; rotate-window -Dt: +
Chris Johnsen
sumber
Terima kasih! Penjelasan yang bagus dan penjilidan yang disarankan Anda tampaknya setidaknya meniru fungsi yang saya cari.
FooBar
Maaf, bagaimana mungkin satu panel ukuran penuh dan kemudian bertukar kembali ke pengaturan sebelumnya
MageProspero
1
@JamesAndino: tmux 1.8 telah resize-pane -Z(secara default, terikat ke Awalan + z) yang sementara "memperbesar" panel menjadi ukuran penuh jendela. Untuk versi sebelum 1.8, tidak ada cara bawaan untuk melakukannya; yang lain telah membuat solusi skrip dari perintah bawaan lainnya (misalnya beberapa jawaban untuk pertanyaan SU "Memaksimalkan" panel di tmux ).
Chris Johnsen
ty, dikompilasi dan dimuat
MageProspero
3
Saya percaya C-b osiklus siklus.
Sam Selikoff
39

Saya percaya apa yang Anda cari adalah Ctrlb+ ( , , , ). Itu akan memungkinkan Anda untuk bergerak di antara panel.

sparticvs
sumber
2
Maaf, tapi saya tidak begitu jelas. Saya telah mencari cara untuk berpindah dari panel ke panel. Di tmux Ctrl b + o fungsinya hampir sama dengan Ctrl a + Tab di layar. Yang saya cari adalah fungsi yang setara dengan Ctrl + + layar.
FooBar
@ FooBar bagaimana Ctrl-b+{atau Ctrl-b+}? Itu sedekat yang saya bisa temukan dengan fungsi itu. Pane tidak dilakukan dengan cara yang sama dalam tmux karena mereka ditangani di layar.
sparticvs
Saya sering mengalami kesulitan memfokuskan panel yang disorot, katakan saya memiliki dua panel, saya sering menekan ^b↑. Bagaimana cara memfokuskan panel yang disorot sedemikian rupa sehingga orang lain akan ditangkap oleh shell, bukan tmux?
ThorSummoner
6

gunakan bind -r, sehingga Anda dapat menekan satu prefixkali, lalu tombol lainnya secara berurutan untuk menemukan panel Anda. Batas waktu dapat disesuaikan dengan repeat-time. Memeriksaman tmux

bind -r Tab select-pane -t :.+

Jika Anda lebih suka hjkl,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
zhazha
sumber
2

Berikut adalah conf kecil yang memungkinkan Anda untuk pindah ke panel atau jendela anohter dengan menggunakan pintasan ALT atau panah SHIFT +. Tidak perlu menggunakan awalan kunci yang nyaman.

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

Jika Anda lebih malas dari saya, Anda juga bisa tertarik dengan kode berikut yang memungkinkan navigasi panel dengan mouse. (penggunaan: awalan kunci + m untuk menghidupkan, M untuk mematikannya)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

konfigurasi ini seharusnya berfungsi untuk tmux 1.6 hingga 1.9.

xaa
sumber
2

Jawaban ini memberi Anda dua panel, di mana kedua panel memegang set jendela yang sama, tetapi setiap panel dapat beralih di antara jendela secara independen.

Pendekatan tmux adalah menggunakan tiga sesi:

  • sesi luar untuk panel ,
  • sesi batin untuk windows (Anda dapat melampirkan ini dari satu panel),
  • sekunder pandangan ke sesi batin (untuk panel lainnya).

Ya, ini adalah filosofi UNIX yang menjadi gila. Mari kita mulai:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

Sekarang Anda dapat beralih ke panel atas dan membuka Vim seperti biasa. Untuk menggilir jendela di sesi dalam (panel bawah), Anda harus menggunakan Ctrl-b Ctrl-b ndan p.

Selain: Itu agak sulit tetapi Anda selalu bisa mengubah awalan sesi luar, misalnya menjadi Ctrl-a, seperti ini:

<Ctrl-b> :set-option prefix C-a

Maka itu akan menjadi Ctrl-b ndan puntuk siklus jendela bagian dalam, dan Ctrl-a ountuk siklus panel luar.

OK sekarang, alih-alih membuka Vim di panel atas, mari kita terhubung lagi ke sesi batin Anda. Keluar dari vim, dan kali ini gunakan new-sessionperintah (terutama dengan -ttidak -s):

$ tmux new-session -t inner

Voila! Sekarang Anda dapat menggilir jendela di panel atas dan bawah.

Alasan kita harus menggunakan new-session -tkedua kalinya adalah bahwa jika kita hanya melakukan attach -tlagi, maka panel atas dan bawah akan disinkronkan, selalu menampilkan jendela yang sama, yang bukan yang Anda inginkan. Untuk membiarkan panel ini bergerak melalui jendela secara independen dari panel lainnya, kami membuat sesi "tampilan" baru tetapi menghubungkan ujung belakangnya langsung ke sesi yang ada yang memegang jendela. Ini juga dikenal sebagai " sesi dikelompokkan ". (Omong-omong, tautan itu juga menyarankan penggunaan [un]link-windowuntuk memindahkan windows di antara sesi.)

Tentu saja untuk simetri, Anda bisa menjalankan tmux new-session -t innerdi panel bawah juga, bukan attach. Dalam hal ini Anda akan menjalankan 4 instance tmux (plus satu lagi proses tmux untuk server)!

joeytwiddle
sumber
0

Masukkan kode berikut ke dalam .tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

Reload config, lalu Anda dapat menekan (langsung tanpa kunci awalan) Shift+ untuk menggilir panel ke arah searah jarum jam, dan Shift+ untuk menggilir ke arah yang terbalik.

Diuji dalam Tmux 2.8.


Jika Anda tidak ingin mengedit konfigurasi, prefix+ oadalah kunci default yang mengikat untuk siklus searah jarum jam. Saya kadang-kadang menemukan kunci ini mengikat, kemudian saya mendapatkan perintah dari tmux list-keysdan menggunakannya untuk binding kunci saya sendiri:

bind-key    -T prefix       o                 select-pane -t :.+
Reorx
sumber