web-dev-qa-db-ja.com

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

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

396
dan

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

"Prefix:"(デフォルトでは "Ctrl-B:")は、tmux-command Promptを表示します。そこに入ります:

swap-window -s 3 -t 1

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

現在のウィンドウをトップウィンドウと交換するには、次のようにします。

swap-window -t 0

めったにありませんがインデックス0にウィンドウがない場合は、次のようにします。

move-window -t 0

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

あなたの~/.tmux.confに以下を追加することで、そのコマンドをキー(例えば "top"のためのT)に結び付けることができます:

bind-key T swap-window -t 0
444
matlehmann

Garethの答えに加えて、あなたは以下のキー割り当てを使うことができます

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

Ctrl + Shift +左(現在のウィンドウを左に移動します。同様に右に移動します。修飾子(C-b)を使用する必要はありません。

250
Ashish Ariga

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

63
Randal Schwartz

swap-windowmove-windowから選択する外部シェルスクリプトを使用して、screennumberコマンドと同等のものを実装できます。そのようにキーにバインドすることができます。

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
12
piec

私はこのようにウィンドウの番号を付け直す:

Ctrl+b.222

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


関連したこと:私が周りのものをシャッフルしているとき、私はやりたい傾向がある

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

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

HTH

12
isomorphismes

Swap-windowを使って任意のidに移動する:[screen's:numberに最も近い]

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

[移動のためのm - >プレフィックス-mを押して、say 3と入力してください。 。ウィンドウの番号を3に変更する]

8

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
5
qun

manからの最も簡単な解決策は、デフォルトの束縛を使うことです:

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

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
3
Dave Kuhlman

あなたはあなたのウィンドウの開始番号を変更するためにbase-indexを使うことができます。 base-index1に設定した場合、move-window -r1で始まるすべてのウィンドウの番号を変更し、ウィンドウをそのスロットに移動するために0を解放します。

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

完了したら、後でbase-indexにウィンドウを移動せずに0を使用したい場合は、move-window -r0にリセットできます。

2
eMBee

私が使うアプローチは、Ashishの答えとpiecの答えを少し組み合わせたものです。最初と最後のウィンドウである場合を除き、左と右の矢印を使って、ウィンドウを左または右に1つずつ移動させます。これは、最後のウィンドウでスワップ+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'

これは最後のウィンドウを一時的に未使用のindex-0に移動してからmove-window -rを呼び出して1から始まる番号を付け直すことによって機能します。最初のウィンドウを最後まで移動したときも同様に機能します。あなたが決して使わないであろう大きな数を選ぶことによって、それはmove-window -rが再び起動するとき、あなたが期待するようにすべてが番号付けされることを確実にします。あなたがrefresh-client -Sについて疑問に思っているなら、からの並べ替えが移動している間に時々、それは必要です - ウィンドウは正常に動作しますが、ステータスバーはさらなる変更が行われるまで更新されません。ステータスバー(-S)だけを強制的に更新することで、これを回避できます。

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

2
Alaska

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

2
pepper_chico

Tmuxウィンドウから、ウィンドウ0を1と交換するために次のことを試してください。

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

1
Hamdi Al-Haj

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

swap-window -s 5

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

swap-window -t 5

  • 現在のプログラムは番号5で有効になります。
  • 現在のウィンドウ番号への最近の上書き。

swap-window -s number-t numbernumberは、両方とも絶対値、たとえば5、および相対値、たとえば-1、+ 2です。

P.S以下のは、swap-window -s 5の効果を示すtmux statuslineの抜粋です。

最近:
[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

1
qeatzy

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

宛先ウィンドウ番号がsmallで最小のウィンドウ番号かより大きいが最大のウィンドウ番号より大きいかどうかを検出します。右または左(それぞれ)に移動し、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'"

Notescreenウィンドウ交換の振る舞いを完全に模倣するには、ウィンドウをexistingウィンドウ番号に移動すると、そのウィンドウの場所とすべてのウィンドウに移動するはずです。他のウィンドウはrightに移動します。このスクリプトを修正するのはかなり簡単です。

0
Luke Davis

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

私はあなたがmanページをすでに読んだと言ったことを知っています、しかしあなたはそれを再び参照するべきです。 bind-keyコマンドを追加するために〜/ .tmux.confファイルを修正する必要があります。

詳しくは、下記の4ページをご覧ください。

tmuxのmanページ

0
syllogism

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

3つのウィンドウがあり、4つ目を追加したいが3つ前のウィンドウに追加したいとします。

新しいウィンドウを追加する前に、Tmuxプレフィックスを入力してください。移動コマンドを開きます。 4と入力すると、3のインデックスは4になります。次に別のウィンドウを追加すると、インデックス3にあり、古いウィンドウはまだインデックス4にあります。

0
mattLummus

まず、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:コマンド実行後、別のウィンドウに移動することがあります。

動作中のgif(github)

0
steinar