tmuxウィンドウを並べ替える


21

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 Q&Aは、あなたが何を求めているかを示しています:superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

回答:


38

swap-window あなたを助けることができます:

swap-window -t -1

現在のウィンドウを1つ左に移動します。

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.

キーにバインドできます:

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

その後、とを使用してShift+LeftShift+Right現在のウィンドウの位置を変更できます。


しかし、一連のswap-windowコマンド(この例では3つ)を実行する必要がありますが、正しいですか?
イゴール14

@igor:はい。別の方法で、できますswap-window -s 2 -t 5。これは、ウィンドウ番号2とウィンドウ番号5を入れ替えます。
cuonglm14年

正しいですが、他のすべてのウィンドウの順序はそのままにしておきたいので、ウィンドウ#2と#5の「単純な」スワッピングはそれを行いません。私はすでにswap-windowコマンドを知っていましたが、前/次のウィンドウを対象とする-/ +プレフィックスについては知りませんでした。
イゴール14

新しいtmuxバージョンの動作の変更に対処するには、unix.stackexchange.com / a / 525770/12497を参照してくださいswap-window
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

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

ボーナス:現在アクティブなウィンドウが影響を受けない場合、同じウィンドウにとどまります。


ブリリアント!ありがとうございました。
アレクサンダーバード

-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.