จัดลำดับหน้าต่าง tmux ใหม่


21

ฉันจะสั่งซื้อ windows ใน tmux ได้อย่างมีประสิทธิภาพได้อย่างไร ตัวอย่างเช่นการมีชุดหน้าต่างนี้:

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

ฉันต้องทำอะไรเพื่อย้ายrssไปมาระหว่างelinksและmuttจบลงด้วย:

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

ฉันรู้วิธีใช้move-windowเพื่อย้ายหน้าต่างไปยังดัชนีที่ไม่ได้ใช้และฉันสามารถใช้ชุดข้อมูลเหล่านี้เพื่อบรรลุเป้าหมาย - แต่เห็นได้ชัดว่านี่น่าเบื่อมาก


1
คำถาม & คำตอบ SU นี้แสดงถึงสิ่งที่คุณต้องการ: superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

คำตอบ:


38

swap-window สามารถช่วยคุณได้:

swap-window -t -1

มันย้ายหน้าต่างปัจจุบันไปทางซ้ายทีละตำแหน่ง

จากผู้ชาย 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.

คุณสามารถผูกมันไว้กับกุญแจได้:

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

จากนั้นคุณสามารถใช้Shift+LeftและShift+Rightเพื่อเปลี่ยนตำแหน่งหน้าต่างปัจจุบัน


แต่ฉันจะต้องทำชุดswap-windowคำสั่ง (สามตัวสำหรับกรณีตัวอย่าง) - แก้ไขไหม?
igor

@igor: ใช่ swap-window -s 2 -t 5อีกวิธีหนึ่งที่คุณสามารถทำได้ หน้าต่างสว็อปหมายเลข 2 พร้อมหมายเลขหน้าต่าง 5
cuonglm

ใช่ แต่ฉันต้องการรักษาความเป็นระเบียบของหน้าต่างอื่น ๆ ทั้งหมดไว้ดังนั้นการสลับหน้าต่าง "# 2" แบบง่ายและ # 5 ไม่ได้ทำเพื่อฉัน ฉันรู้แล้วเกี่ยวกับswap-windowคำสั่ง แต่ไม่รู้เกี่ยวกับ-/ +คำนำหน้าเพื่อกำหนดเป้าหมายหน้าต่างก่อนหน้า / ถัดไป
igor

ดูunix.stackexchange.com/a/525770/12497เพื่อจัดการกับพฤติกรรมที่เปลี่ยนแปลงของswap-windowในรุ่น tmux ที่ใหม่กว่า
Steven Lu

2

คำตอบที่ได้รับการยอมรับและได้รับการโหวตสูงนั้นถูกต้องแม้ว่าพฤติกรรมในเวอร์ชัน tmux ล่าสุดจะเห็นคำสั่ง swap-window ที่ไม่ทำให้คุณอยู่ในหน้าต่างเดียวกัน ดังนั้นจึงใช้งานได้ค่อนข้างไม่เหมาะสมหน้าต่างที่ใช้งานของคุณจะเปลี่ยนไปในทิศทางนั้น แต่คุณจะยังคงอยู่ในช่องเดียวกัน!

หากต้องการแก้ไขปัญหานั้นเพียงเพิ่มการผูกเพื่อติดตาม ตัวอย่างจากการกำหนดค่า tmux ของฉัน:

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

1

นี่คือวิธีการแก้ปัญหาการทำงานห่อในฟังก์ชั่นทุบตี

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

โบนัส: อยู่ในหน้าต่างเดิมหากไม่มีหน้าต่างที่ใช้งานอยู่ในปัจจุบัน


ยอดเยี่ยม! ขอขอบคุณ.
Alexander Bird

-1

ถ้าtmuxเป็นรุ่น 1.7 ขึ้นไป

move-window -r

หรือ

set-option -g renumber-windows on

ใน.tmux.confการทำโดยอัตโนมัติในอนาคต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.