Susun ulang jendela tmux


21

Bagaimana saya bisa mengatur ulang windows di tmux secara efisien? Misalnya, memiliki rangkaian windows ini:

0:zsh  1:elinks  2:mutt  3:irssi  4:emacs  5:rss  6:htop

Apa yang harus saya lakukan untuk pindah rsske antara elinksdan mutt, berakhir dengan:

0:zsh  1:elinks  2:rss  3:mutt  4:irssi  5:emacs  6:htop

Saya tahu cara menggunakan move-windowuntuk memindahkan jendela ke indeks yang belum digunakan, dan saya bisa menggunakan serangkaian untuk mencapai ini — tetapi, jelas, ini sangat membosankan.


1
T&J SU ini menunjukkan apa yang Anda minta: superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

Jawaban:


38

swap-window bisa membantumu:

swap-window -t -1

Ini memindahkan jendela saat ini ke kiri dengan satu posisi.

Dari man tmux :

swap-window [-d] [-s src-window] [-t dst-window]
             (alias: swapw)
This is similar to link-window, except the source and destination windows are swapped. 
It is an error if no window exists at src-window.

Anda dapat mengikatnya ke kunci:

bind-key -n S-Left swap-window -t -1
bind-key -n S-Right swap-window -t +1

Kemudian Anda dapat menggunakan Shift+Leftdan Shift+Rightuntuk mengubah posisi jendela saat ini.


Tetapi saya masih harus melakukan serangkaian swap-windowperintah (tiga untuk contoh kasus) - benar?
igor

@ Goror: Ya. Cara lain, bisa Anda lakukan swap-window -s 2 -t 5. Jendela swap nomor 2 ini dengan nomor jendela 5.
cuonglm

Benar — tapi saya ingin menjaga agar semua jendela lain tetap utuh, jadi pertukaran 'sederhana' dari jendela # 2 dan # 5 tidak melakukannya untuk saya. Saya sudah mengetahui swap-windowperintah, tetapi tidak tahu tentang -/ +awalan untuk menargetkan jendela sebelumnya / berikutnya.
igor

lihat unix.stackexchange.com/a/525770/12497 untuk mengatasi perilaku yang berubah swap-windowdi versi tmux yang lebih baru
Steven Lu

2

Jawaban yang diterima dan sangat tinggi benar, meskipun perilaku dalam versi tmux baru-baru ini melihat perintah swap-window tidak membuat Anda tetap di jendela yang sama. Jadi itu bekerja agak tidak sengaja, jendela aktif Anda akan ditukar ke arah itu tetapi Anda akan tetap berada di slot yang sama!

Untuk memperbaiki masalah itu, cukup tambahkan bind untuk mengikutinya. Sebagai contoh dari konfigurasi tmux saya:

bind -n C-S-Left { swap-window -t -1; previous-window }
bind -n C-S-Right { swap-window -t +1; next-window }

1

Berikut ini adalah solusi kerja yang dibungkus dengan fungsi bash.

list=$(tmux lsw -F '#I');                           # for shift left, could be moved inside function
list=$(tmux lsw -F '#I'); list=$(echo $list|rev);   # for shift right, list reversed
shift_tmux_window_range() {  # depend on `list`
    local started=0 beg=$1 end=$2
    for i in $list; do
        if (($i == $beg)); then
            started=1; h=$beg; tmux linkw -s $beg && tmux unlinkw -t $beg;
        elif (($i == $end)); then
            tmux movew -d -s $i -t $h; tmux movew -d -t $end; break;
        elif [ $started = 1 ]; then
            tmux movew -d -s $i -t $h; h=$i;
        fi;
    done
}

shift_tmux_window_range 5 2

Bonus: tetap di jendela yang sama jika jendela aktif saat ini tidak terpengaruh.


Cemerlang! Terima kasih.
Alexander Bird

-1

Jika tmuxversi 1.7 atau lebih tinggi

move-window -r

atau

set-option -g renumber-windows on

dalam .tmux.confuntuk melakukan secara otomatis, di masa depan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.