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

tmux

screenでは、C-a :number 0と入力するだけでウィンドウをウィンドウリストの一番上に移動させ、他のすべてのウィンドウを一つ下に押し下げることができますが、tmuxでは、ウィンドウリストの一番上に移動させることができません。tmuxに相当するコマンド列は何ですか?マニュアルを見てみましたが、この点で混乱しています

  493  dan  2011-02-02


ベストアンサー

swap-windowコマンドが一番欲しいものに近いです

“Prefix :” (デフォルトでは Ctrl+B, :) で tmux-command のプロンプトが表示されます。そこで以下のように入力します

swap-window -s 3 -t 1

を使用して、ウィンドウ番号3とウィンドウ番号1の位置を入れ替えます

現在のウィンドウを上のウィンドウと入れ替えるには、次のようにします

swap-window -t 0

万が一、インデックス0にウィンドウがない場合は、このようにします

move-window -t 0

(base-indexが0の場合、デフォルトでは0になっています)

~/.tmux.confに次のように追加することで、そのコマンドをキー(例えば “top “のT)にバインドすることができます

bind-key T swap-window -t 0

553  matlehmann  2011-03-01


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 のバージョンでは、以下のキーバインドを使用する必要があります

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

310  Ashish Ariga  2013-02-15


:number 42に相当するtmuxは:move-window -t 42です

75  Randal Schwartz  2011-04-05


こんな感じで窓の番号を変えています

Ctrl+b, ., 222

とすると、現在のtmuxウィンドウ(すべてのペイン)の番号が222になります


関連して。物をゴチャゴチャしているとやりたくなってしまいます

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

また、そこからCtrl+b, ., readingを使って、現在のウィンドウ(すべてのペインを一度に)を読み込み中のセッションに移動させることもできます。Ctrl+b, sを使ってセッション間をブラウズすることができますが、Ctrl+b, wを使ってセッション内をブラウズするのと同じです

HTH

20  isomorphismes  2013-07-09


screennumberコマンドと同等のものを、swap-windowmove-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

13  piec  2012-04-16


swap-windowを使って任意のIDに移動します。画面の :number に最も近いもの)に移動する

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

m は move –> prefix-m を叩いて 3 と入力すると、ウィンドウの番号を 3 に変更することができます

9  Karthik Gurusamy  2011-12-12


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

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

7  jhvaras  2015-02-09


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

7  qun  2016-03-18


tmux-pain-control は、フォーカスされたウィンドウを左右に移動させるためのctrl-b >ctrl-b <を提供しています

5  pepper_chico  2016-12-29


私が使用しているアプローチは、Ashishさんの回答とpiecさんの回答を少し組み合わせたものです。左矢印と右矢印は、最初か最後のウィンドウでない限り、敬意を払って、ウィンドウを左か右に移動させるシェルコールアウトにバインドされています。これをしたのは、最後のウィンドウで swap +1 (または最初のウィンドウで swap -1) を発行しても、あなたが期待しているようにループして戻ってくるのではなく、スワップされたままになるからです

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

Becomes

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

Instead of

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'

これは、最後のウィンドウを一時的に使われていない index-0 に移動させ、その後 move-window -r を呼び出して再び 1 から番号を付け直すことで動作します。これは、最初のウィンドウを最後に移動させるときにも同様の動作をします。refresh-client -Sについて疑問に思っているのであれば、これは必要な機能です。ステータスバーだけを強制的に更新する(-S)ことで、これを回避することができます

この方法で見つけられる唯一の問題は、swap-window は最後に使っていたウィンドウを暗黙のうちにスワップしたウィンドウに変更してしまうことです。したがって、もしあなたがウィンドウ #1 を使っていて、ウィンドウ 4 に切り替えてウィンドウを 1 つ戻した場合、最後に使っていたウィンドウは #1 ではなく新しい #4 (以前は #3) になっていることに気づくでしょう。これを回避する方法はないようです

4  Alaska  2013-06-24


byobuをtmuxのラッパーとして使っている人は、byobuを使うと、現在のウィンドウを前のウィンドウや次のウィンドウと入れ替えることができます

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

4  Dave Kuhlman  2016-01-26


base-index1 に設定した場合、move-window -r1 から始まるすべてのウィンドウの番号を変更し、0 がウィンドウをスロットに移動できるようにします

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

終わったら、base-index0でウィンドウを動かさずにmove-window -rを使いたい場合は、base-index0にリセットすることができます

3  eMBee  2016-12-13


swap-window -s 5swap-window -t 5 はどちらも現在のウィンドウをウィンドウ 5 と入れ替えますが、意味合いは異なります

swap-window -s 5

  • 現在のwin番号で有効なwindow 5プログラム
  • 最近のウィンドウ数は変わらず
  • 同じコマンドを繰り返すと、前の状態にロールバックします

swap-window -t 5

  • 現在のプログラムは、番号5で有効になっています
  • 現在のウィンドウ番号への最近のオーバーライド

swap-window -s number-t numbernumberは、絶対値、例えば5、相対値、例えば-1、+2の両方である可能性があります

追伸 以下は 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[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

2  qeatzy  2017-10-07


tmuxウィンドウから、以下のようにしてウィンドウ0と1を入れ替えてみてください

$ tmux swap-window -d -s 0 -t 1

2  Hamdi Al-Haj  2018-07-04


choose-window’ コマンドに新しいキーの組み合わせをバインドしたいのではないでしょうか

manページを読んだことがあると思いますが、それを参照してみてください

具体的には、以下の4ページを見てください

tmux の man ページ

1  None  2011-02-02


これが私が使っている方法です。占有されているインデックスにウィンドウを移動させることはまだできませんが、より高い(使われていない)インデックスにウィンドウを移動させて、前のインデックスがあった隙間に再配置することはできます

あなたは3つのウィンドウを持っていて、4つ目を追加したいと言いますが、3が以前にあった場所に

新しいウィンドウを追加する前にTmux prefix then .を押すと、move コマンドが起動します。4 と入力すると、3 のインデックスが 4 になり、その後、単に別のウィンドウを追加すると、それはインデックス 3 になり、古いウィンドウはまだインデックス 4 になります

1  mattLummus  2014-10-31


まず、tmuxコマンドプレスを開いてリリースします

Ctrl + b

そして、実際のウィンドウを右のウィンドウに変更するには(順番が回っている)、そうすればいいのです

}

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

{
  • }{を押すときはSHIFTを忘れずに

1  Jonatas Eduardo  2016-05-15


何の価値があるのか

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)

1  steinar  2017-09-14


コマンドラインは不要(これはCtrlbで、その後:になる)

で窓を移動させるだけ

Ctrl + b + :

その後、新しい(無料の)ウィンドウ番号を入力し、Enterを押してください

自由なウィンドウ番号がない場合は、Ctrl + b + .を使ってウィンドウの番号を変更してください

(ヒント: どれがどれなのかわからなくなったら、Ctrl + b + ,でウィンドウの名前を付けてください)

1  rubo77  2019-09-16


ここでの答えはどれも私を満足させてくれなかったので、screentmuxのウィンドウ移動動作を(ある意味では)真似したスクリプトを書きました

移動先のウィンドウ番号が最小のウィンドウ番号より小さいか、最大のウィンドウ番号より大きいかを検出し、小さい場合は他のすべてのウィンドウを右または左に(それぞれ)ナッジして、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
tmux move-window -t:$((maxwin + 1))
winlist=($(tmux list-windows | cut -d: -f1 | xargs))
for n in ${winlist[@]}; do
i=$((i + 1))
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[@]}  # start at highest indexed window
for n in ${winlist[@]}; do
tmux move-window -s:$n -t:$i
i=$((i - 1))
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  Luke Davis  2018-05-22


タイトルとURLをコピーしました