Bagaimana cara memesan ulang windows tmux?

413

Dalam screen, saya bisa mengetik C-a :number 0untuk memindahkan jendela ke bagian atas daftar jendela dan mendorong semua jendela lainnya ke bawah. Untuk apa urutan perintah yang setara tmux? Saya melihat halaman manual, tetapi saya merasa bingung tentang hal ini.

dan
sumber
95
C-b, .memungkinkan Anda memberi nomor baru pada jendela.
isomorfisma
7
Membaca semua jawaban, saya masih melihat tidak ada solusi mudah untuk pertanyaan OP: bagaimana cara memindahkan jendela yang diberikan ke posisi 0 dan menggeser semua sisanya ke kanan. Apakah saya benar-benar harus secara manual menggeser masing-masing untuk melakukan ini? Saya hanya ingin membatalkan langkah yang saya lakukan secara tidak sengaja (dan saya tidak yakin apa) yang saya pikir pindah jendela 0 ke jendela 8 dan menggeser semua yang lain ke kiri.
nealmcb
1
@nealmcb yang paling mudah saya dapat lakukan adalah dengan menetapkan basis-indeks ke 1, nomor baru, lalu pindahkan jendela Anda ke slot 0 kosong: superuser.com/a/1155999/674549
eMBee
Untuk perbedaan swap-window -s numberdan swap-window -t numberuntuk menukar jendela saat ini, lihat jawaban saya di sini .
qeatzy
Lihat jawaban ini untuk fungsi bash untuk menggeser rentang jendela tmux, misalnya, [2-5] dari [0-6] windows.
qeatzy

Jawaban:

467

The swap-windowperintah paling dekat dengan apa yang Anda inginkan.

"Awalan:" (yaitu Ctrl+ B, :secara default) membawa Anda ke prompt tmux-command. Di sana Anda masuk:

swap-window -s 3 -t 1

untuk membiarkan jendela nomor 3 dan nomor jendela 1 menukar posisi mereka.

Untuk menukar jendela saat ini dengan jendela atas, lakukan:

swap-window -t 0

Jika tidak memiliki jendela di indeks 0, lakukan:

move-window -t 0

(jika indeks-dasar adalah 0, sebagaimana standarnya).

Anda dapat mengikat perintah itu ke kunci (T untuk "atas" misalnya) dengan menambahkan berikut ini ke Anda ~/.tmux.conf:

bind-key T swap-window -t 0
matlehmann
sumber
6
Terima kasih atas hasil edit Anda, tetapi move-windowhanya berfungsi, jika tidak ada jendela lain di indeks yang diberikan. Jadi dalam kebanyakan kasus, move-window -t 0tidak akan berfungsi, karena biasanya sudah ada jendela lain di posisi itu.
matlehmann
Itu benar, saya akan memperbaikinya.
zakkak
2
Anda mungkin ingin melihatnya movew.
Marcello Romani
3
Juga, bind-key L swap-window -t -1untuk menjadikannya jendela terakhir.
Untuk perbedaan swapw -s numberdan swapw -t numberuntuk menukar jendela saat ini, lihat jawaban saya di sini .
qeatzy
257

Menambahkan ke jawaban Gareth, Anda dapat menggunakan binding kunci berikut

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

Menekan Ctrl + Shift + Kiri (akan memindahkan jendela saat ini ke kiri. Demikian pula ke kanan. Tidak perlu menggunakan pengubah (Cb).

Ashish Ariga
sumber
9
Ini -1dan +1sintaks membantu memecahkan masalah indeks yang diduduki. tmux akan menggeser jendela lain untuk Anda dan akan membungkus acara sampai akhir / mulai secara otomatis. Ini jawaban terbaik.
brianpeiris
1
Ketidakmampuan saya untuk memindahkan windows tmux dengan mudah telah mengganggu saya selama beberapa minggu. Ini membuatnya jauh lebih mudah untuk berurusan dengan windows! Terima kasih banyak dari tmux convert baru-baru ini.
calvinf
8
Petunjuk bagus, lebih disukai bind-key S-Left swap-window -t -1, jadi saya bisa melakukan <prefix> shift + panah, karena saya tidak suka mengacaukan ikatan kunci untuk program.
demure
4
Jika menggunakan huruf, Anda harus menggunakan huruf kapital dan bukan CS, seperti ini:bind-key -n C-H swap-window -t -1
Matthew Mitchell
1
Saya punya beberapa masalah pada 1.9a juga ketika menggunakan Ashish Ariga bind-key -n C-S-Left swap-window -t -1namun ia bekerja ok ketika menggunakan awalan seperti yang disarankan oleh @MatthewMitchell
Rho Phi
63

The tmux setara dengan :number 42adalah :move-window -t 42.

Randal Schwartz
sumber
9
Ini terikat ke Cb.
vedang
1
Terima kasih! Ini jauh lebih baik daripada jawaban imo yang diterima.
Ashe
5
@ ArlenCuss Sebenarnya kedua jawaban itu baik dan bermanfaat. Anda lihat, menggunakan layar: nomor Anda dapat menukar jendela, menggunakan tmux's: move-window Anda hanya dapat memindahkan jendela jika indeks target tidak digunakan. Jadi, imo, keduanya: swap-window dan: move-window diperlukan untuk memegang kendali atas lokasi jendela :)
Victor Farazdagi
1
+1 untuk mendapat jawaban dari guru pemrograman (juga karena benar). Ini adalah satu-satunya cara saya bisa membuatnya bekerja pada jendela yang aktif
engineerDave
4
tmux ini :move-windowadalah tidak setara dengan layar ini :number. :numberswap jika tujuan ada, :move-windowgagal dalam kasus itu. Anda harus memilih antara :move-windowdan:swap-window
piec
15

Saya menomori ulang windows seperti ini:

Ctrl+ b, .,222

akan membuat tmuxjendela saat ini (semua panel) nomor 222.


Terkait: Ketika saya mengacak-acak hal-hal di sekitar saya cenderung ingin melakukan

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

dan dari sana saya juga bisa menggunakan Ctrl+ b, ., readinguntuk memindahkan jendela saat (semua panel sekaligus) ke sesi membaca. Anda dapat menelusuri di antara sesi dengan Ctrl+ b, scara Anda akan isi dalam sesi menggunakan Ctrl+ b, w.

HTH

isomorfisma
sumber
12

Anda dapat menerapkan setara dengan screen's numberperintah menggunakan shell script eksternal yang memilih antara swap-windowdan move-window. Anda dapat mengikatnya dengan kunci seperti itu:

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
piec
sumber
2
Solusi yang sangat bagus, bekerja dengan sangat baik! Saya baru saja melakukan pengeditan kecil untuk membersihkan dan menghapus -Fopsi yang tidak diterima oleh versi tmux saya.
haridsv
8

Menggunakan jendela swap untuk berpindah ke id apa pun: [paling dekat dengan layar: nomor]

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

[m untuk pindah -> tekan awalan-m dan masukkan say 3. .untuk memberi nomor baru jendela ke 3]

Karthik Gurusamy
sumber
1
Ini sudah bagus, tetapi bahkan lebih baik: melakukan swap-window dan jika gagal, kembali ke move-window
nisc
5

Karena jawaban Ashish Ariga tidak berfungsi pada versi 1.9a dan di bawah. Saya menggunakan <dan >untuk menukar jendela ke kiri dan kanan, masing-masing, dengan menambahkan baris di bawah ini ke .tmux.conf.

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

Solusi paling sederhana dari man, adalah dengan menggunakan binding standar:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
jhvaras
sumber
6
Jendela dan panel tmux berbeda.
Marcello Romani
4
Ini masih membantu saya mendapatkan apa yang saya inginkan
lkraav
Pertanyaan ini adalah tentang windows not pane
mbigras
3

Bagi Anda yang menggunakan byobusebagai pembungkus untuk tmux, Anda dapat menukar jendela saat ini dengan jendela sebelumnya atau berikutnya dengan:

Ctrl-Shift-F3
Ctrl-Shift-F4

Pengikatan kunci yang ditentukan oleh byobuuntuk kunci-kunci ini mungkin menarik:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1
Dave Kuhlman
sumber
Akan menjadi jalan pintas yang bagus untuk berpindah-pindah di jendela tertentu.
Pablo A
2

Pendekatan yang saya gunakan menggabungkan sedikit jawaban Ashish dengan piec; Saya memiliki panah alt-kiri dan kanan yang terikat ke callout shell kecil cepat yang memindahkan jendela ke kiri atau kanan, kecuali itu jendela pertama atau terakhir, dengan hormat. Saya melakukan ini karena, ketika Anda mengeluarkan swap +1 di jendela terakhir (atau swap -1 di jendela pertama), itu masih akan swap, alih-alih kembali lagi seperti yang mungkin Anda harapkan:

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

Menjadi

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

Dari pada

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

Jadi, perintah yang saya gunakan berhenti bekerja ketika jendela telah mencapai tepi daftar:

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'

Ini dapat dengan mudah digabungkan dengan indeks-dasar dan nomor-jendela untuk memiliki daftar jendela yang dimulai dari angka acak dan tidak pernah memiliki celah.

Jika Anda menggunakan basis-indeks 1 seperti saya dan Anda tidak berpikir Anda akan pernah pergi di atas 999 windows, Anda dapat menggunakan sedikit trik untuk membuatnya menggulung dengan benar, meskipun perintahnya sedikit menggembung:

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'

Ini berfungsi dengan memindahkan sementara jendela terakhir ke indeks-0 yang tidak digunakan dan kemudian memanggil pindah-jendela -r untuk memberi nomor baru mulai dari 1 lagi. Ini bekerja sama ketika memindahkan jendela pertama ke ujung; dengan memilih sejumlah besar yang tidak akan pernah Anda gunakan, itu memastikan bahwa ketika pindah-jendela -r menyala lagi semuanya akan bernomor seperti yang Anda harapkan. Jika Anda bertanya-tanya tentang refresh-client -S , itu perlu karena kadang-kadang, sementara pemesanan ulang dari jendela-pindah akan berfungsi dengan baik, bilah status tidak akan memperbarui hingga perubahan lebih lanjut dibuat. Dengan memaksa penyegaran hanya bilah status (-S), Anda menghindari ini.

Satu-satunya masalah yang saya dapat temukan dengan pendekatan ini adalah bahwa swap-window secara implisit akan mengubah jendela yang terakhir digunakan ke yang Anda bertukar. Dengan demikian, jika Anda berada di jendela # 1, beralih ke jendela empat dan memindahkannya kembali, Anda akan menemukan bahwa jendela yang terakhir Anda gunakan adalah yang baru # 4 (sebelumnya # 3) alih-alih # 1. Sepertinya tidak ada cara untuk mengatasi ini.

Alaska
sumber
2

Anda dapat menggunakan base-indexuntuk mengubah nomor awal untuk windows Anda. jika Anda mengatur base-indexke 1, maka move-window -rakan menomori ulang semua jendela mulai 1, sehingga membebaskan 0untuk memindahkan jendela ke dalam slotnya:

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

setelah selesai, Anda dapat mengatur ulang base-indexke 0jika Anda ingin menggunakan move-window -rnanti tanpa memindahkan jendela Anda di0

eMBee
sumber
2

tmux-pain-control menyediakan ctrl-b >dan ctrl-b <memindahkan jendela fokus ke kanan dan kiri, membungkus.

pepper_chico
sumber
Tidak bekerja untuk saya di tmux 2.5
Dmitry Frank
1
@DmitryFrank ops, benar, salahku. Itu karena github.com/tmux-plugins/tmux-pain-control
pepper_chico
Terima kasih! Berhasil mengatur kedua secara manual, tetapi plugin terlihat bagus dengan cara lain juga.
Dmitry Frank
1

Keduanya swap-window -s 5dan swap-window -t 5menukar jendela saat ini dengan jendela 5, tetapi dengan semantik yang berbeda.

swap-window -s 5

  • Program Window 5 berlaku dengan nomor menang saat ini.
  • nomor jendela terbaru tetap tidak berubah.
  • ulangi perintah yang sama akan kembali ke keadaan sebelumnya.

swap-window -t 5

  • program saat ini berlaku dengan nomor 5.
  • penggantian terbaru ke nomor jendela saat ini.

yang numberdi swap-window -s numberdan -t numberbisa menjadi keduanya mutlak , misalnya, 5, dan relatif , misalnya, -1, 2.

PS di bawah ini adalah kutipan dari tmux statusline yang menggambarkan efek dariswap-window -s 5

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

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

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

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

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

qeatzy
sumber
Lihat jawaban ini untuk fungsi bash untuk menggeser rentang jendela tmux, misalnya, [2-5] dari [0-6] windows.
qeatzy
1

Dari jendela tmux, coba yang berikut ini untuk menukar jendela 0 dengan 1:

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

Hamdi Al-Haj
sumber
0

Saya pikir Anda ingin mengikat kombinasi tombol baru ke perintah 'pilih-jendela'.

Saya tahu Anda mengatakan Anda sudah membaca halaman manual, tetapi Anda harus merujuk kembali ke halaman itu. Anda perlu memodifikasi file ~ / .tmux.conf Anda untuk menambahkan perintah bind-key.

Secara khusus, lihat halaman 4 berikut ini.

halaman manual tmux


sumber
choose-windowsepertinya tidak memindahkan jendela saat ini ke posisi baru.
dan
Juga, choose-windowsudah terikat C-B w.
kynan
0

Ini adalah metode yang saya gunakan. Anda masih tidak dapat memindahkan jendela ke indeks yang diduduki, tetapi Anda dapat memindahkan satu ke yang lebih tinggi (indeks yang tidak digunakan) dan mengatur ulang di celah di mana indeks sebelumnya.

Katakanlah Anda memiliki 3 jendela dan ingin menambahkan keempat tetapi di tempat 3 sebelumnya.

Sebelum Anda menambahkan jendela baru: Awalan Tmux lalu. akan membuka perintah pindah. Ketik 4 dan indeks 3 sekarang akan menjadi 4, maka cukup tambahkan jendela lain dan itu akan berada di indeks 3 dan jendela lama Anda masih akan di indeks 4.

mattLummus
sumber
Meskipun tip yang bermanfaat, ini tidak menjawab pertanyaan.
Jan Doggen
0

Pertama, buka perintah tmux, tekan dan lepaskan:

Ctrl + b 

Dan untuk mengubah jendela aktual ke jendela kanan (dalam urutan melingkar), lakukan saja:

}

Untuk mengubah jendela aktual ke kiri:

{
  • Jangan lupa gunakan SHIFTsaat menekan }atau {.
Jonatas Eduardo Salgado
sumber
2
Pasti membantu dalam beberapa skenario, tetapi ini mengatur ulang panel di dalam jendela (daripada menata ulang jendela).
Mengejar garis miring
0

Untuk apa nilainya:

Saya meretas skrip ini bersama-sama untuk dapat memesan semua jendela dalam "TUI". Ini mencantumkan semua jendela Anda dalam file sementara, membukanya dengan editor default Anda (mengasumsikan bahwa Anda telah menetapkan $ EDITOR). Setelah ini, Anda dapat menyusun ulang baris dan setelah Anda menyimpan dan menutup file, jendela disusun ulang sesuai. (Ini mirip dengan pemesanan yang dilakukan saat melakukan 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

Ini mungkin dapat ditingkatkan banyak, khususnya:

CATATAN : Anda mungkin dipindahkan ke jendela lain setelah menjalankan perintah.

Gif dalam aksi (github)

steinar
sumber
0

Tidak ada jawaban di sini yang memuaskan saya, jadi saya menulis sebuah skrip yang (semacam) meniru screenperilaku menggerakkan jendela tmux.

Ini mendeteksi apakah nomor jendela tujuan lebih kecil dari jumlah jendela terkecil atau lebih besar dari nomor jendela terbesar, dan jika demikian, mendorong semua jendela lain ke kanan atau ke kiri (masing-masing) dan menomori ulang nomor tersebut dari 1-N secara bertahap . Ini dilakukan dengan move-windowperintah.

Jika nomor jendela di antara angka terkecil / terbesar (yaitu, mungkin, cocok dengan nomor jendela yang ada), itu hanya menukar mereka dengan swap-windowperintah.

Ini skripnya:

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

Kemudian, tambahkan saja pengikat kunci sederhana ini ke .tmux.conf:

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

Catatan : Untuk sepenuhnya menirukan screenperilaku bertukar jendela, saya percaya ketika Anda memindahkan jendela ke nomor jendela yang ada , itu harus mengambil tempat jendela itu dan semua jendela lainnya didorong ke kanan . Akan cukup sederhana untuk memodifikasi skrip ini untuk melakukannya.

Luke Davis
sumber
0

Tidak perlu untuk commandline (yaitu Ctrl+ bdan kemudian :)

Cukup gerakkan jendela Anda

Ctrl+ b+:

kemudian masukkan nomor jendela baru (gratis) dan tekan Enter

Jika sekarang ada nomor jendela gratis, gunakan Ctrl+ b+ .untuk memberi nomor baru pada jendela.

(Kiat: beri nama windows Anda dengan Ctrl+ b+ ,jika Anda kehilangan jalur yang mana)

rubo77
sumber