Tmux pencerelerini nasıl yeniden sıralarım?


413

İçinde bir pencereyi pencere listesinin en üstüne taşımak için screenyazabilir C-a :number 0ve diğer tüm pencereleri bir aşağı itebilirim. Eşdeğer komut sırası ne için tmux? Adam sayfasına baktım ama bu noktada kafa karıştırıcı buluyorum.


95
C-b, .bir pencereyi yeniden numaralandırmanıza izin verir.
isomorphismes

7
Pek çok cevabı okuyarak hala OP'nin sorusuna kolay bir çözüm göremiyorum: verilen bir pencereyi 0 konumuna getirip diğerlerini sağa kaydırmayı. Bunu yapmak için gerçekten her birini elle değiştirmek zorunda mıyım? Yanlışlıkla yaptığım bir hareketi geri almak istiyorum (ve tam olarak ne olduğundan emin değilim) sanırım 0 penceresini 8 penceresine taşıdı ve diğerlerini sola kaydırdı.
nealmcb

1
@nealmcb, bulabildiğim en kolayı taban dizini 1 olarak ayarlamak, yeniden numaralandırmak, sonra pencerenizi boş 0 yuvasına
taşımaktır

Mevcut pencerenin farkı swap-window -s numberve swap-window -t numbertakas için, buradaki cevabımı bakın .
qeatzy

Tmux pencerelerinin aralığını değiştirmek için bir bash işlevi için bu cevaba bakınız , örneğin, [0-6] pencerelerinin [2-5].
qeatzy

Yanıtlar:


467

swap-windowKomut istediğini yakın.

"Önek:" ( varsayılan olarak Ctrl+ B, :) sizi tmux komut istemine getirir. Girdiğiniz yer:

swap-window -s 3 -t 1

3 numaralı pencerenin ve 1 numaralı pencerenin konumlarını değiştirmesine izin vermek için.

Geçerli pencereyi üst pencereyle değiştirmek için şunları yapın:

swap-window -t 0

Olasılıkla 0 dizininde pencere olmaması durumunda, şunları yapın:

move-window -t 0

(temel dizin 0 ise, varsayılan değer olarak).

Aşağıdakileri ekleyerek bu komutu bir tuşa (örneğin "üst" için T) bağlayabilirsiniz ~/.tmux.conf:

bind-key T swap-window -t 0

6
Düzenlemeniz için teşekkürler, ancak move-windowyalnızca verilen dizinde başka bir pencere yoksa çalışır. Bu yüzden çoğu durumda, move-window -t 0işe yaramayacak, çünkü genellikle zaten bu konumda başka bir pencere olacaktır.
matlehmann

Bu doğru, geliştireceğim.
zakkak

2
Bakmak isteyebilirsin movew.
Marcello Romani

3
Ayrıca, bind-key L swap-window -t -1son pencere yapmak için.

Mevcut pencerenin farkı swapw -s numberve swapw -t numbertakas için, buradaki cevabımı bakın .
qeatzy

257

Gareth'in cevabını ekleyerek, aşağıdaki anahtar bağlantıları kullanabilirsiniz

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

Ctrl + ÜstKrkt + Sol tuşlarına basın (geçerli pencereyi sola doğru hareket ettirir. Benzer şekilde sağa. Değiştiriciyi kullanmaya gerek yoktur (Cb).


9
Bu -1ve +1sözdizimi, işgal edilmiş endeks problemini çözmeye yardımcı olur. tmux sizin için diğer pencereleri değiştirecek ve olay otomatik olarak sona / başına dolanacaktır. Bu en iyi cevap.
brianpeiris

1
Tmux pencereleri kolayca hareket ettiremem bir kaç haftadır beni rahatsız ediyor. Bu pencerelerle başa çıkmak çok daha kolay! Bu son tmux dönüştürmek çok teşekkürler.
calvinf

8
Büyük ipucu, tercih bind-key S-Left swap-window -t -1, bu nedenle programlar için anahtar bağları karıştırmayı sevmediğim için <prefix> shift + ok tuşlarını yapabilirim.
demure

4
Harfleri kullanıyorsanız, CS değil büyük harf kullanmanız gerekir, şöyle:bind-key -n C-H swap-window -t -1
Matthew Mitchell

1
Ashish Ariga kullanırken de 1.9A bazı sorun var bind-key -n C-S-Left swap-window -t -1@MatthewMitchell önerdiği gibi önek kullanırken ancak ok çalışır
Rho Phi

63

Tmux eşdeğer :number 42olduğunu :move-window -t 42.


9
Bu Cb'ye bağlıdır.
vedang

1
Teşekkürler! Bu kabul edilen cevap imo daha iyidir.
Ashe

5
@ArlenCuss Aslında her iki cevap da iyi ve kullanışlıdır. Gördüğünüz gibi, ekranı kullanarak: pencereleri değiştirebiliyorsunuz, tmux'u kullanıyorsanız: hareket penceresi yalnızca hedef dizin kullanılmıyorsa pencerenin yerini değiştirebiliyorsunuz. Öyleyse, hem imo, hem: takas penceresi ve:
taşı

1
Bir programlama gurusundan cevap almak için +1 (ayrıca doğru olmak için). Aktif bir pencerede çalışabilmemin tek yolu bu
mühendisDave

4
tmux en :move-windowolduğu değil ekran en eşdeğerdir :number. :numberHedef varsa takas eder, :move-windowbu durumda başarısız olur. Sen arasında seçim yapmak zorunda :move-windowve:swap-window
piec

15

Pencereleri şöyle yeniden numaralandırırım:

Ctrl+ b, .,222

Geçerli tmuxpencereyi (tüm bölmeler) 222 numara yapacaktır .


İlgili: Çevresindeki şeyleri karıştırırken yapmak isteme eğilimindeyim

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

ve oradan ben de kullanabilirsiniz Ctrl+ b, ., readingokuma oturumuna üzerinde Geçerli pencereyi (bütün bölmeleri seferde) taşımak için. Sen ile seans arasında göz atabilir Ctrl+ b, skullandığınız oturum içinde göz atmalarına Ctrl+ b, w.

HTH


12

Ve arasında bir harici kabuk betiği kullanarak screen's numberkomutuna bir eşdeğer uygulayabilirsiniz . Bu şekilde bir anahtara bağlayabilirsiniz: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

2
Çok güzel bir çözüm, harika çalışıyor! Temizlik için küçük düzenlemeler yaptım ve -Ftmux sürümüm tarafından kabul edilmeyen seçeneği kaldırdım .
haridsv

8

Herhangi bir kimliğe geçmek için takas penceresini kullanarak: [ekrana en yakın: sayı]

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

[hareket için m -> önek-m'ye basın ve 3 deyimini girin. . penceresini 3 olarak yeniden numaralandırmak için]


1
Bu zaten güzel, ama daha da iyi olurdu: takas penceresini yapın ve başarısız olursa, pencereye geri dönün
nisc

5

Ashish Ariga'nın cevabı 1.9a ve altındaki sürümlerde çalışmadığından beri. Kullandığım <ve >aşağıda satır ekleyerek, sırasıyla sol ve sağ için pencereyi takas .tmux.conf.

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

4

En basit çözüm man, varsayılan bağlamaları kullanmaktır:

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

6
tmux pencereleri ve camları farklıdır.
Marcello Romani

4
Bu hala istediğimi elde etmeme yardımcı oldu
lkraav

Bu soru, pencere bölmeleri değil pencereler hakkında
mbigras 18

3

byobuTmux için sarmalayıcı olarak kullananlarınız için, şu anki pencereyi önceki veya sonraki pencereyle değiştirebilirsiniz:

Ctrl-Shift-F3
Ctrl-Shift-F4

byobuBu anahtarlar için tanımlanmış anahtar bağlama ilgi çekici olabilir:

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

Bölünme etrafında hareket ettirmek için bir kısayol iyi olurdu içinde belli bir pencerede.
Pablo A,

2

Kullandığım yaklaşım biraz Ashish'ın cevabını piec'lerle birleştiriyor; Pencereyi sola veya sağa hareket ettiren hızlı bir küçük kabuk belirtme çizgisine bağlı alt-sol ve sağ ok, sırasıyla, ilk veya son pencere değilse. Bunu yaptım çünkü, son pencerede bir takas + 1 çıkardığınızda (ya da ilk pencerede -1 takas), tekrar beklediğiniz gibi tekrar tekrar dolaşmak yerine yine takas yapacaktır:

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

Oluyor

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

Onun yerine

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

Böylece, pencere listenin kenarına ulaştığında kullandığım komutlar çalışmayı durduruyor:

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'

Bu, rasgele bir sayıyla başlayan ve hiçbir zaman boşluk bırakmayan bir pencere listesine sahip olmak için kolayca temel dizin ve yeniden numaralandırma pencereleriyle birleştirilebilir .

Benim gibi base index 1 kullanıyorsanız ve 999 pencerenin üstüne çıkacağınızı düşünmüyorsanız, komutlar birazcık şişse de, düzgün bir şekilde yuvarlanmak için küçük bir numara kullanabilirsiniz:

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'

Bu işlem, son pencereyi geçici olarak kullanılmayan indeks-0'a hareket ettirmek ve ardından 1'den başlayarak yeniden numaralandırmak için move-window -r'yi çağırmakla işe yarar. İlk pencereyi sonuna kadar taşırken benzer şekilde çalışır; Asla kullanmayacağınız çok büyük bir sayı seçerek, " window -r" penceresinin tekrar hareket etmesi durumunda her şeyin beklediğiniz gibi numaralandırılmasını sağlar. Yenileme istemcisi -S'yi merak ediyorsanız , bu gereklidir, çünkü bazen hareket penceresinden yeniden sıralama düzgün bir şekilde çalışsa da, değişiklik yapılıncaya kadar durum çubuğu güncellenmez. Sadece durum çubuğunun (-S) yenilenmesini zorlayarak, bundan kaçınırsınız.

Bu yaklaşımla bulabildiğim tek sorun, takas penceresinin en son kullanılan pencereyi takas ettiğiniz pencereye dolaylı olarak değiştirmesidir. Böylece, # 1 penceresindeyseniz, dördüncü pencereye geçin ve onu geri taşıyın, son kullandığınız pencerenin # 1 yerine yeni # 4 (eskiden # 3) olduğunu görürsünüz. Bunun bir yolu yok gibi görünüyor.


2

base-indexpencerelerinizin başlangıç ​​numarasını değiştirmek için kullanabilirsiniz . Eğer ayarlarsanız base-indexiçin 1, daha sonra move-window -rtüm pencereleri başlayan yeniden numaralandırmak 1böylece serbest bırakarak, 0onun yuvaya bir pencere taşımak için:

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

Bittiğinde, sıfırlamak olabilir base-indexiçin 0kullanmak istediğiniz takdirde move-window -radresinden pencereyi taşımadan sonra0



1

Her ikisi de swap-window -s 5ve swap-window -t 5mevcut pencereyi, pencere 5 ile değiştirir, ancak farklı semantikleriyle.

swap-window -s 5

  • Mevcut kazanma numarası ile geçerli olan pencere 5 programı.
  • son pencere numarası değişmeden kalır.
  • Aynı komutu tekrarlamak önceki durumuna geri dönecektir.

swap-window -t 5

  • Geçerli program 5 sayısı ile geçerlidir.
  • Geçerli pencere numarasına son geçersiz kılma.

numberde swap-window -s numberve -t numberher ikisi de olabilir mutlak 5, örneğin, ve göreli + 2, -1, ör.

Aşağıdaki PS , etkisini gösteren, tmux statusline ait.swap-window -s 5

son, yakında olan:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

şimdi, sonra last-window:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

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

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

başka last-window:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc


Tmux pencerelerinin aralığını değiştirmek için bir bash işlevi için bu cevaba bakınız , örneğin, [0-6] pencerelerinin [2-5].
qeatzy

1

Tmux penceresinde, 0 penceresini 1 ile değiştirmek için aşağıdakileri deneyin:

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


0

Bence 'select-window' komutuna yeni bir tuş kombinasyonunu bağlamak istediğinizi düşünüyorum.

Adam sayfasını okuduğunu söylediğini biliyorum, ama tekrar bakmalısın. Ciltleme komutu eklemek için ~ / .tmux.conf dosyanızı değiştirmeniz gerekir.

Özellikle, aşağıdakilerin 4. sayfasına bakın.

tmux erkek sayfası


choose-windowmevcut pencereyi yeni bir konuma taşıyor gibi görünmüyor.
dan

Ayrıca, choose-windowzaten bağlı C-B w.
kynan

0

Kullandığım yöntem bu. Bir pencereyi hala dolu bir dizine taşıyamazsınız, ancak bir tanesini daha yükseğe (kullanılmayan dizine) taşıyabilir ve önceki dizinin olduğu aradaki boşluğu yeniden düzenleyebilirsiniz.

Diyelim ki 3 pencereniz var ve dördüncüsü eklemek istiyorsunuz, fakat daha önce 3'ün bulunduğu yerde.

Yeni bir pencere eklemeden önce: Sonra Tmux öneki. hareket komutunu açacaktır. 4 yazın ve 3 dizini şimdi 4 olacak, sonra basitçe başka bir pencere ekleyin ve 3 dizininde olacak ve eski pencereniz yine de 4. dizinde olacak.


Yararlı bir ipucu olmasına rağmen, bu soruyu cevaplamıyor.
Jan Doggen

0

İlk önce, tmux komutunu açın ve bırakın:

Ctrl + b 

Ve gerçek pencereyi sağ pencereye (dairesel sırayla) değiştirmek için yapmanız gerekenler:

}

Asıl pencereyi sola değiştirmek için:

{
  • Veya SHIFTtuşuna basarken kullanmayı unutmayın .}{

2
Bazı senaryolarda kesinlikle yardımcı olur, ancak bu, pencereleri yeniden düzenlemek yerine pencereleri yeniden düzenler.
son slash

0

Neye mal olursa olsun:

"TUI" deki tüm pencereleri sıralayabilmek için bu senaryoyu hackledim. Tüm pencerelerinizi geçici bir dosyada listeler, varsayılan düzenleyicinizle açar ($ EDITOR belirlediğinizi varsayar). Bundan sonra satırları yeniden sıralayabilirsiniz ve dosyayı kaydettikten ve kapattıktan sonra, pencereler buna göre yeniden sıralanır. (Bu, sipariş verirken sipariş verme işlemine benzer 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

Muhtemelen çokça geliştirilebilirdi, özellikle:

NOT : Komutu çalıştırdıktan sonra başka bir pencereye taşınmış olabilirsiniz.

Hareket halinde bir gif (github)


0

Buradaki cevapların hiçbiri beni tatmin etmedi, bu yüzden screenpencere hareket etme davranışını taklit eden bir yazı yazdım tmux.

Bu hedef pencere sayı olup olmadığını tespit eder küçük veya en küçük pencere numarası o büyük büyük pencere numarası yerine, ve eğer öyleyse, sağa, diğer tüm pencereleri nudges veya aşamalı olarak 1-N dan onları sol (sırasıyla) ve yeniden numaralar . Bu move-windowkomutla yapılır .

Pencere numarası ise aradaki- küçük / büyük sayılar (yani, muhtemelen, varolan pencere numarasını eşleşir), sadece birlikte takas yapar swap-windowkomuta.

İşte senaryo:

#!/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

Ardından, bu basit anahtar bağlayıcıyı aşağıdaki bölüme eklemeniz yeterlidir .tmux.conf:

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

Not : screenPencere değiştirme davranışını mükemmel şekilde taklit etmek için , bir pencereyi varolan bir pencere numarasına taşıdığınızda, o pencerenin yerini alması ve diğer tüm pencerelerin sağa dürtülmesi gerektiğine inanıyorum . Bunu yapmak için bu betiği değiştirmek oldukça basit olurdu.


0

(Edilmektedir komut gerek yok Ctrl+ bsonra ve :)

Sadece pencerelerinizi hareket ettirin

Ctrl+ b+:

sonra yeni (ücretsiz) pencere numarasını girin ve Enter

Şimdi boş pencere numarası varsa, bir pencereyi yeniden numaralandırmak için Ctrl+ b+ tuşlarını .kullanın.

(İpucu: pencerelerinizi Ctrl+ b+ ile isimlendirin ,;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.