tmuxウィンドウを並べ替えるにはどうすればよいですか?


413

ではscreen、入力C-a :number 0してウィンドウをウィンドウリストの一番上に移動し、他のすべてのウィンドウを1つ下に押します。同等のコマンドシーケンスはtmux何ですか?私はマニュアルページを見ましたが、この点で混乱していることがわかりました。


95
C-b.ウィンドウの番号を変更できます。
同型14

7
多くの答えを読んでも、OPの質問に対する簡単な解決策はまだありません。特定のウィンドウを位置0に移動し、残りをすべて右に移動する方法です。これを行うには、実際に手動でシフトする必要がありますか?誤って行った移動を元に戻したいだけで(それが何なのかわかりません)、ウィンドウ0をウィンドウ8に移動し、他のすべてを左に移動したと思います。
nealmcb 14

1
:私が思い付くことができ、最も簡単な@nealmcb空の0スロットにあなたのウィンドウを移動し、その後、1ベースのインデックスを設定付け直すことですsuperuser.com/a/1155999/674549
eMBee

現在のウィンドウの違いswap-window -s numberswap-window -t numberスワップについては、こちらの回答をご覧ください
-qeatzy

[0-5]ウィンドウの[2-5]など、tmuxウィンドウの範囲をシフトするbash関数については、この回答を参照してください。
qeatzy

回答:


467

swap-windowコマンドは、あなたが望むものに近いです。

「プレフィックス:」(つまりCtrl+ B:デフォルトでは)tmuxは、コマンドプロンプトにもたらします。そこに入力します:

swap-window -s 3 -t 1

ウィンドウ番号3とウィンドウ番号1の位置を入れ替えます。

現在のウィンドウを一番上のウィンドウと交換するには、次のようにします。

swap-window -t 0

インデックス0にウィンドウがないというまれなケースでは、次のようにします。

move-window -t 0

(デフォルトでbase-indexが0の場合)。

次のコードをyourに追加することにより、そのコマンドをキー(たとえば、「top」のT)にバインドできます~/.tmux.conf

bind-key T swap-window -t 0

6
編集していただきありがとうございmove-windowますが、指定されたインデックスに別のウィンドウがない場合にのみ機能します。そのため、ほとんどの場合、move-window -t 0通常はその位置に別のウィンドウがすでにあるため、機能しません。
マトレマン

そうです、改善します。
ザッカク14年

2
あなたが見てみたいかもしれませんmovew
マルチェロロマーニ

3
また、bind-key L swap-window -t -1それを最後のウィンドウにします。

現在のウィンドウの違いswapw -s numberswapw -t numberスワップについては、こちらの回答をご覧ください
qeatzy

257

Garethの答えに加えて、次のキーバインディングを使用できます。

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

Ctrl + Shift + Leftを押すと(現在のウィンドウが左に移動します。同様に右。モディファイア(Cb)を使用する必要はありません。


9
これ-1+1構文は、占有インデックスの問題の解決に役立ちます。tmuxは他のウィンドウをシフトし、自動的に最後/最初までイベントをラップアラウンドします。これが最良の答えです。
ブライアンペイリス

1
tmuxウィンドウを簡単に移動できないことは、数週間私を悩ませてきました。これにより、ウィンドウの処理が非常に簡単になります!この最近のtmux変換に感謝します。
calvinf 14年

8
bind-key S-Left swap-window -t -1プログラムのキーバインドを台無しにするのは好きではないので、素晴らしいヒント、好むので、<prefix> shift + arrowを実行できます。
2014年

4
:文字を使用している場合、あなたはこのように、大文字とないCSを使用する必要があるbind-key -n C-H swap-window -t -1
マシュー・ミッチェル

1
Ashish Arigaを使用する場合、1.9aでも問題がbind-key -n C-S-Left swap-window -t -1ありますが、@ MatthewMitchell
Rho Phi

63

と同等のtmux :number 42:move-window -t 42です。


9
これはCbにバインドされています。
vedang

1
ありがとう!これは、受け入れられている回答imoよりもはるかに優れています。
アッシュ

5
@ArlenCuss実際、両方の答えは有用で有用です。screen:numberを使用すると、ウィンドウをスワップできます。tmuxの:move-windowを使用すると、ターゲットインデックスが使用されていない場合にのみウィンドウを再配置できます。したがって、イモ、:swap-windowと:move-windowの両方が、ウィンドウの位置の制御を把握するために必要です:)
Victor Farazdagi

1
プログラミングの第一人者から答えを得るために+1(正しいことでも)。これは、私はそれがアクティブウィンドウ上で動作するように得ることができる唯一の方法である
engineerDave

4
tmux :move-windowはscreenと同等ではありません:number:number宛先が存在する場合はスワップ:move-windowし、その場合は失敗します。あなたはの間で選択する必要があり:move-window:swap-window
PIEC

15

次のようにウィンドウの番号を変更します。

Ctrl+ b.222

現在のtmuxウィンドウ(すべてのペイン)の番号を222にします。


関連:物事をシャッフルしているとき、私はやりたいと思う傾向があります

Ctrl+b :new-session -d -s "reading"

そこから、Ctrl+ b、を使用して、現在のウィンドウ(一度にすべてのペイン)を読み取りセッションに移動することもできます。あなたはとのセッションの中で閲覧することができます+ 、あなたが使用してセッション内で閲覧するような方法を+ 、。.readingCtrlbsCtrlbw

HTH


12

あなたはに相当実装することができますscreennumber間で選択した外部シェルスクリプトを使用してコマンドswap-windowとをmove-window。その方法でキーにバインドできます:

bind < command-prompt -p index "run-shell '~/.tmux.number.sh %%'"

~/.tmux.number.sh

#!/bin/bash
if [ $# -ne 1 -o -z "$1" ]; then
    exit 1
fi
if tmux list-windows | grep -q "^$1:"; then
    tmux swap-window -t $1
else
    tmux move-window -t $1
fi

2
非常に素晴らしいソリューション、素晴らしい仕事!クリーンアップを少し編集し-Fて、tmuxバージョンで受け入れられないオプションを削除しました。
haridsv

8

スワップウィンドウを使用して任意のIDに移動する:[画面の:numberに最も近い]

# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:"  "swap-window -t '%%'"

[mで移動-> prefix-mを押してsay 3と入力します。。ウィンドウの番号を3に変更する]


1
これは、すでに素敵ですが、さらに良くは次のようになります。スワップ・ウィンドウを行い、それが失敗した場合、移動ウィンドウをするためにフォールバック
NISC

5

Ashish Arigaの回答はバージョン1.9a以前では機能しません。とを使用して<>ウィンドウを左と右にそれぞれ交換し、以下の行をに追加し.tmux.confます。

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1

4

からの最も簡単な解決策はman、デフォルトのバインディングを使用することです。

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.

6
tmuxウィンドウとペインは異なります。
マルチェロロマーニ

4
これはまだ私が欲しかったものを手に入れる助け
lkraav

この質問は、ウィンドウではなくウィンドウについてです
-mbigras

3

byobutmuxのラッパーとして使用する場合は、現在のウィンドウを前のウィンドウまたは次のウィンドウと交換できます。

Ctrl-Shift-F3
Ctrl-Shift-F4

byobuこれらのキーのために定義されたキーバインディングは興味深いかもしれません:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1

分割の周りに移動するためのショートカット素晴らしいことだあるウィンドウ。
パブロA

2

私が使用するアプローチでは、Ashishの回答とpiecの回答を少し組み合わせています。最初または最後のウィンドウでない限り、ウィンドウを左または右に移動する小さな小さなシェルコールアウトにバインドされたalt-leftおよびright矢印があります。これは、最後のウィンドウでスワップ+1を発行する(または最初のウィンドウで-1をスワップする)ときに、期待どおりにループバックするのではなく、スワップするためです。

0:one 1:two 2:three 3:zero*

になる

0:zero* 1:two 2:three 3:one

の代わりに

0:zero* 1:one 2:two 3:three

したがって、ウィンドウがリストの端に達すると、使用するコマンドが機能しなくなります。

bind-key -n M-Left run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -t +1'

これは、base-indexおよびrenumber-windowsと簡単に組み合わせて、任意の番号から始まり、隙間がないウィンドウのリストを作成できます。

私のようにbase-index 1を使用していて、999ウィンドウを超えるとは思わない場合は、少しトリックを使用して適切にロールすることができますが、コマンドは少し膨張します:

set -g base-index 1
set -g renumber-windows on
bind-key -n M-Left run-shell 'if tmux list-windows | head -n 1 | grep -q active ; then tmux move-window -t 999 \; move-window -r \; refresh-client -S ; else tmux swap-window -t -1 ; fi'
bind-key -n M-Right run-shell 'if tmux list-windows | tail -n 1 | grep -q active ; then tmux move-window -t 0 \; move-window -r \; refresh-client -S ; else tmux swap-window -t +1 ; fi'

これは、最後のウィンドウを未使用のインデックス0に一時的に移動し、move-window -rを呼び出して1から再び番号を付け直すことで機能します。最初のウィンドウを最後に移動する場合も同様に機能します。決して使用しない巨大な数字を選択することにより、move-window -rが再び起動したときに、すべてが期待どおりに番号付けされるようになります。refresh-client -Sについて疑問がある場合は、move-windowからの並べ替えが適切に機能する一方で、さらに変更が行われるまでステータスバーが更新されないことがあるため、これが必要です。ステータスバー(-S)のみを強制的に更新することにより、これを回避できます。

私がこのアプローチで見つけられる唯一の問題は、swap-windowが最後に使用したウィンドウをあなたが交換したウィンドウに暗黙的に変更することです。したがって、ウィンドウ#1にいる場合、ウィンドウ4に切り替えて、ウィンドウ1に戻すと、最後に使用したウィンドウが#1ではなく新しい#4(以前の#3)であることがわかります。これを回避する方法はないようです。


2

を使用base-indexして、ウィンドウの開始番号を変更できます。に設定base-indexすると1move-window -rから始まるすべてのウィンドウの番号が変更され、ウィンドウがスロットに移動1できるよう0になります。

set base-index 1
move-window -r
move-window -t 0

完了base-index0たら、move-window -r後でウィンドウを移動せずに使用する場合にリセットできます0


2

tmuxの痛み制御を提供ctrl-b >してctrl-b <折り返し、左右のフォーカスされたウィンドウを移動すること。


tmuxの2.5に私のために動作しません
ドミトリーフランク・

1
@DmitryFrank ops、そうだね。これはgithub.com/tmux-plugins/tmux-pain-control
pepper_chico

ありがとう!これら2つを手動で設定することはできましたが、プラグインは他の点でも見栄えが良いです。
ドミトリーフランク

1

両方でswap-window -s 5swap-window -t 5現在のウィンドウをウィンドウ5 と交換しますが、セマンティクスが異なります。

swap-window -s 5

  • 現在の勝利番号で有効なウィンドウ5プログラム。
  • 最近のウィンドウ番号は変更されません。
  • 同じコマンドを繰り返すと、以前の状態にロールバックします。

swap-window -t 5

  • 番号5で有効な現在のプログラム。
  • 現在のウィンドウ番号への最近のオーバーライド。

numberswap-window -s number-t numberの両方であり得る絶対、例えば、5、及び相対的、例えば、-1、+ 2。

以下の PS は、tmuxのステータスラインの抜粋であり、swap-window -s 5

最近:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

今、後last-window
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

swapw -s 5
[0] 0:mc* 1:mpl 2:py2- 3:numpy 4:plot 5:vim

別のswapw -s 5
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

別のlast-window
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc


[0-5]ウィンドウの[2-5]など、tmuxウィンドウの範囲をシフトするbash関数については、この回答を参照してください。
-qeatzy


0

新しいキーの組み合わせを「choose-window」コマンドにバインドすると思います。

すでにmanページを読んでいると言っていましたが、もう一度参照してください。〜/ .tmux.confファイルを変更してbind-keyコマンドを追加する必要があります。

具体的には、次の4ページをご覧ください。

tmux manページ


choose-window現在のウィンドウを新しい位置に移動しないようです。
ダン

また、choose-windowはに既にバインドされていC-B wます。
キナン

0

これは私が使用する方法です。ウィンドウを使用中のインデックスに移動することはできませんが、ウィンドウをより高い(未使用のインデックス)に移動し、前のインデックスがあったギャップに再配置できます。

3つのウィンドウがあり、4つ目を追加したいが、以前は3つだった場所に追加するとします。

新しいウィンドウを追加する前に:Tmux prefix then。移動コマンドを開きます。4と入力すると、インデックス3は4になり、別のウィンドウを追加するだけで、インデックス3になり、古いウィンドウはインデックス4のままになります。


役に立つヒントですが、これは質問に答えているわけではありません。
Jan Doggen 14年

0

まず、tmuxコマンドを押して放します。

Ctrl + b 

そして、実際のウィンドウを右のウィンドウに(循環順に)変更するには、次のようにします

}

実際のウィンドウを左に変更するには:

{
  • またはをSHIFT押したときに使用することを忘れないでください。}{

2
いくつかのシナリオで間違いなく役立ちますが、これはウィンドウ内のペインを再配置します(ウィンドウを並べ替えるのではなく)。
末尾のスラッシュ

0

価値があるもの:

「TUI」ですべてのウィンドウを注文できるように、このスクリプトを一緒にハックしました。すべてのウィンドウを一時ファイルにリストし、デフォルトのエディターで開きます($ EDITORを設定したと仮定します)。この後、行を並べ替えることができ、ファイルを保存して閉じると、それに応じてウィンドウが並べ替えられます。(これは、実行するときにコミットを順序付けることに似ていますgit rebase -i

#!/bin/bash

# Usage: tmux-mv    
#   Move your tmux windows around in an editor

tmpfile=$(mktemp)
tmux list-windows > $tmpfile
$EDITOR $tmpfile

# Move all windows to 50..x in the order you just specified
# Assumes you don't have 50 windows already(!)
cat $tmpfile | awk -F ":" '{ print " -s " $1 " -t 5" NR-1 }' |\
  xargs -I {} sh -c 'tmux move-window -d {}'

# Move them back down, retaining the order
tmux move-window -d -r
rm $tmpfile

おそらく、特に多くの点で改善できます。

:コマンドを実行すると、別のウィンドウに移動する場合があります。

動作中のgif(github)


0

ここでの答えはどれも私を満足させませんでしたので、私はのscreenウィンドウ移動動作を(ある種の)模倣するスクリプトを書きましたtmux

これは、先のウィンドウ番号があるかどうかを検出小さい最小のウィンドウ番号またはその大きなインクリメンタル1-Nからそれらを最大のウィンドウ番号よりも、そうであれば、(それぞれ)右または左に他のすべてのウィンドウをnudges、再番号。これは、move-windowコマンドを使用して行われます。

ウィンドウ番号が最小/最大番号の間にある(つまり、おそらく既存のウィンドウ番号と一致する)場合、それらは単にswap-windowコマンドと交換されます。

スクリプトは次のとおりです。

#!/usr/bin/env bash
# Filename: ~/tmux-windowswap
# Function that provides improved window-swapping functionality for tmux
maxwin="$(tmux list-windows | cut -d: -f1 | sort -nr | head -n1)"
minwin="$(tmux list-windows | cut -d: -f1 | sort -n | head -n1)"
# Error checking
if [[ -z $2 ]]; then
  echo "Error: No window specified."
elif [[ ! $2 =~ ^-?[0-9]+$ ]]; then
  echo "Error: Bad window number specified."
# Bigger than everything; slide it to the far right, then renumber
elif [[ $2 -gt $maxwin ]]; then
  i=0 # intialize
  tmux move-window -t:$(($maxwin+1))
  winlist="$(tmux list-windows | cut -d: -f1 | xargs)"
  for n in $winlist; do
    i=$(($i+1)) # increment
    tmux move-window -s:$n -t:$i
  done
# Smaller than everything; slide it to the far left, then renumber
elif [[ $2 -lt $minwin ]]; then
  tmux move-window -t:0
  winlist=($(tmux list-windows | cut -d: -f1 | xargs | rev))
  i=${#winlist[@]} # initialize; start at highest indexed window
  for n in ${winlist[@]}; do
    tmux move-window -s:$n -t:$i
    i=$(($i-1)) # decrement
  done
# In-between; just a simple swap
else
  tmux swap-window -t:$2
fi

次に、この単純なキーバインディングをに追加します.tmux.conf

bind m command -p "Send window to:"  "run -b '~/tmux-windowswap #I %1'"

screenウィンドウスワッピングの動作を完全に模倣するには、ウィンドウを既存のウィンドウ番号に移動すると、そのウィンドウの場所が必要になり、他のすべてのウィンドウが右側に移動します。このスクリプトを変更するのは非常に簡単です。


0

コマンドラインは必要ありません(Ctrl+ b:

窓を動かすだけで

Ctrl+ b+:

次に、新しい(無料の)ウィンドウ番号を入力して、 Enter

空きウィンドウ番号がある場合は、Ctrl+ b+ .を使用してウィンドウの番号を付け直します。

(ヒント:どちらがどれであるかわからない場合は、Ctrl+ b+でウィンドウに名前を付けてください,

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.