tmuxのウィンドウを並べ替えるにはどうすればいいですか?
screen
では、C-a :number 0
と入力するだけでウィンドウをウィンドウリストの一番上に移動させ、他のウィンドウを一つ下に押し下げることができます。tmux
に相当するコマンドシーケンスは何ですか?マニュアルページを見てみましたが、この点で混乱しています。
screen
では、C-a :number 0
と入力するだけでウィンドウをウィンドウリストの一番上に移動させ、他のウィンドウを一つ下に押し下げることができます。tmux
に相当するコマンドシーケンスは何ですか?マニュアルページを見てみましたが、この点で混乱しています。
swap-window
コマンドは、あなたが望むものに最も近いものです。
“Prefix :” (デフォルトでは Ctrl+B, : です) を押すと、tmux-command プロンプトが表示されます。そこで以下のように入力する。
swap-window -s 3 -t 1
と入力して、ウィンドウ番号 3 とウィンドウ番号 1 の位置を入れ替える。
swap-window -t 0
と入力して、ウィンドウ番号3とウィンドウ番号1の位置を入れ替えます。
move-window -t 0
万が一、インデックス0にウィンドウがない場合は、次のようにします。
bind-key T swap-window -t 0
(base-indexが0の場合、デフォルトでは0になっています)。
0x1&
2x2& (base-indexがデフォルトで0の場合) とします。
0x1&
Garethさんの回答に加えて、以下のキーバインド
bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1
Ctrl+Shift+Leftを押すと(現在のウィンドウを左に移動します。同様に右に移動します。修飾子(C-b)を使用する必要はありません。
tmux 3.0 バージョンでは、以下のキーバインドを使用する必要があります。
:number 42
に相当するtmuxは:move-window -t 42
です。
私はこのようにウィンドウの番号を変更します。
Ctrl+b, .
, 222
とすると、現在の tmux
のウィンドウ(全ペイン)の番号は 222 になります。
関連して。また、そこから Ctrl+b, :new-session -d -s "reading"
, .
, reading
を使って、現在のウィンドウ(すべてのペインを一度に)を読み込みセッションに移動させることもできます。Ctrl+b, s
を使ってセッション内をブラウズするのと同じように、Ctrl+b, w
を使ってセッション間をブラウズすることができます。
HTH
screen
と number
のどちらかを選択する外部シェルスクリプトを使用して、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
``` 0x1&
Using swap-window to move to any id. “most to screen’s :number”
# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:" "swap-window -t '%%'"
[m for move –> hit prefix-m and enter say 3 .to renumber window to 3] [m for move –> hit prefix-m and enter say 3 .]
byobu
を tmux のラッパーとして使用している方は、byobu
を使用することで、現在のウィンドウを前のウィンドウや次のウィンドウと入れ替えることができます。
Ctrl-Shift-F3
Ctrl-Shift-F4
0x6& で定義されているキーバインディングは興味深いものです。
bind-key -n C-S-F3 swap-window -t :-1
bind-key -n C-S-F4 swap-window -t :+1
tmux-pain-control は、フォーカスされたウィンドウを左右に移動させるためのctrl-b >
とctrl-b <
を提供しています。
私が使用しているアプローチは、Ashish氏の回答とpiec氏の回答を少し組み合わせたものです。左矢印と右矢印を、最初か最後のウィンドウでない限り、敬意を払って、ウィンドウを左右に1つずつ移動させるシェルコールアウトにバインドしています。これを行ったのは、最後のウィンドウで swap +1 (または最初のウィンドウで swap -1) を発行しても、期待されるようなループを繰り返すのではなく、スワップを実行してくれるからです。
0:one 1:two 2:three 3:zero*
これを base-index と renumber-windows と組み合わせれば、任意の番号から始まり、隙間のないウィンドウのリストを簡単に作成することができます。
私のように base-index 1 を使っていて、999個以上のウィンドウが出てこないと思っている場合は、ちょっとしたトリックを使って適切に転がすことができますが、コマンドは少し肥大化します。
0:zero* 1:two 2:three 3:one
0:zero* 1:one 2:two 3:three
これは、最後のウィンドウを一時的に使用されていないインデックス 0 に移動させ、move-window -r を呼び出して、それらのウィンドウの番号を再び 1 から始めることで動作します。これは、最初のウィンドウを最後に移動させるときにも同様の動作をします。これは refresh-client -S が気になる場合、-move-window からの並び替えが正常に動作している間に、さらに変更が加えられるまでステータスバーが更新されないことがあるために必要です。ステータスバーだけを強制的に更新する (-S) ことで、これを回避することができます。
この方法で見つけられる唯一の問題は、swap-window が最後に使用していたウィンドウを暗黙のうちにスワップしたウィンドウに変更してしまうことです。したがって、もしあなたがウィンドウ#1を使っていて、ウィンドウ4に切り替えて1つ戻した場合、最後に使っていたウィンドウは#1ではなく、新しい#4(以前は#3)になっていることに気づくでしょう。これを回避する方法はないようです。
swap-window -s 5
と swap-window -t 5
はどちらも現在のウィンドウをウィンドウ 5 と入れ替えますが、意味合いは異なります。
swap-window -s 5
swap-window -t 5
number
と swap-window -s number
の -t number
は、5 などの absolute と -1, +2 などの relative の両方の可能性があります。
P.S. 下記は、swap-window -s 5
の影響を示す tmux のステータスラインの抜粋です。
[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
tmux ウィンドウから、以下のようにしてウィンドウ 0 と 1 を入れ替えてみてください:
$ tmux swap-window -d -s 0 -t 1
まず、tmuxコマンドのプレスとリリースを開きます。
Ctrl + b
そして、実際のウィンドウを右のウィンドウに変更するには(順番に)
}
実際のウィンドウを左に変更するには:
{
SHIFT
または}
を押すときには{
を使うことを忘れないでください。参考までに。
私はこのスクリプトをハックして、"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
これはおそらく、特にかなり改善されていると思われます。
NOTE .
NOTE : コマンド実行後に別のウィンドウに移動される可能性があります。 動作中の gif (github)
ここでの答えはどれも納得できなかったので、screen
のウィンドウ移動動作をtmux
のために真似したスクリプトを書いてみました。
移動先のウィンドウ番号が最小のウィンドウ番号より小さいか、最大のウィンドウ番号より大きいかを検出し、検出した場合、他のすべてのウィンドウを右または左に(それぞれ)移動させて、1からNまでの番号を漸増的に付け直す。これは 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
のウィンドウスワッピング動作を完全に真似るために、既存のウィンドウ番号にウィンドウを移動すると、そのウィンドウがその場所に移動し、他のすべてのウィンドウが右に移動すると思います。このスクリプトを修正するのはかなり簡単です。
これが私が使っている方法です。使われているインデックスにウィンドウを移動することはできませんが、1つ上のインデックス(使われていないインデックス)にウィンドウを移動して、前のインデックスがあった隙間に再配置することができます。
3つのウィンドウがあり、4つ目のウィンドウを追加したいとしますが、以前3つのウィンドウがあった場所に配置します。
新しいウィンドウを追加する前に。Tmux prefix then .を押すと、moveコマンドが開きます。4 と入力すると、3 のインデックスが 4 になりますので、別のウィンドウを追加するだけでインデックス 3 になり、古いウィンドウはインデックス 4 になります。