ではscreen
、入力C-a :number 0
してウィンドウをウィンドウリストの一番上に移動し、他のすべてのウィンドウを1つ下に押します。同等のコマンドシーケンスはtmux
何ですか?私はマニュアルページを見ましたが、この点で混乱していることがわかりました。
ではscreen
、入力C-a :number 0
してウィンドウをウィンドウリストの一番上に移動し、他のすべてのウィンドウを1つ下に押します。同等のコマンドシーケンスはtmux
何ですか?私はマニュアルページを見ましたが、この点で混乱していることがわかりました。
回答:
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
move-window
ますが、指定されたインデックスに別のウィンドウがない場合にのみ機能します。そのため、ほとんどの場合、move-window -t 0
通常はその位置に別のウィンドウがすでにあるため、機能しません。
movew
。
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)を使用する必要はありません。
-1
と+1
構文は、占有インデックスの問題の解決に役立ちます。tmuxは他のウィンドウをシフトし、自動的に最後/最初までイベントをラップアラウンドします。これが最良の答えです。
bind-key S-Left swap-window -t -1
プログラムのキーバインドを台無しにするのは好きではないので、素晴らしいヒント、好むので、<prefix> shift + arrowを実行できます。
bind-key -n C-H swap-window -t -1
bind-key -n C-S-Left swap-window -t -1
ありますが、@ MatthewMitchell
と同等のtmux :number 42
は:move-window -t 42
です。
:move-window
はscreenと同等ではありません:number
。:number
宛先が存在する場合はスワップ:move-window
し、その場合は失敗します。あなたはの間で選択する必要があり:move-window
と:swap-window
あなたはに相当実装することができます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
-F
て、tmuxバージョンで受け入れられないオプションを削除しました。
スワップウィンドウを使用して任意の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に変更する]
私が使用するアプローチでは、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)であることがわかります。これを回避する方法はないようです。
tmuxの痛み制御を提供ctrl-b >
してctrl-b <
折り返し、左右のフォーカスされたウィンドウを移動すること。
両方で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、及び相対的、例えば、-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
tmuxウィンドウから、次を試してウィンドウ0を1に交換します。
$ tmux swap-window -d -s 0 -t 1
これは私が使用する方法です。ウィンドウを使用中のインデックスに移動することはできませんが、ウィンドウをより高い(未使用のインデックス)に移動し、前のインデックスがあったギャップに再配置できます。
3つのウィンドウがあり、4つ目を追加したいが、以前は3つだった場所に追加するとします。
新しいウィンドウを追加する前に:Tmux prefix then。移動コマンドを開きます。4と入力すると、インデックス3は4になり、別のウィンドウを追加するだけで、インデックス3になり、古いウィンドウはインデックス4のままになります。
まず、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
おそらく、特に多くの点で改善できます。
注:コマンドを実行すると、別のウィンドウに移動する場合があります。
ここでの答えはどれも私を満足させませんでしたので、私はの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
ウィンドウスワッピングの動作を完全に模倣するには、ウィンドウを既存のウィンドウ番号に移動すると、そのウィンドウの場所が必要になり、他のすべてのウィンドウが右側に移動します。このスクリプトを変更するのは非常に簡単です。
C-b
、.
ウィンドウの番号を変更できます。