Làm cách nào để sắp xếp lại các cửa sổ tmux?


413

Trong screen, tôi chỉ có thể gõ C-a :number 0để di chuyển một cửa sổ lên đầu danh sách cửa sổ và đẩy tất cả các cửa sổ khác xuống một cửa sổ. Trình tự lệnh tương đương để làm tmuxgì? Tôi đã xem trang người đàn ông, nhưng tôi thấy nó khó hiểu về điểm này.


95
C-b, .cho phép bạn đánh số lại một cửa sổ.
đẳng cấu

7
Đọc tất cả nhiều câu trả lời, tôi vẫn không thấy giải pháp dễ dàng nào cho câu hỏi của OP: làm thế nào để di chuyển một cửa sổ nhất định sang vị trí 0 và chuyển tất cả phần còn lại sang bên phải. Tôi có thực sự phải thay đổi thủ công từng người để làm điều này? Tôi chỉ muốn hoàn tác một động tác mà tôi đã làm do nhầm lẫn (và tôi không chắc chỉ là cái gì) mà tôi nghĩ đã chuyển cửa sổ 0 sang cửa sổ 8 và chuyển tất cả những cái khác sang trái.
nealmcb

1
@nealmcb cách dễ nhất tôi có thể đưa ra là đặt chỉ số cơ bản thành 1, đánh số lại, sau đó di chuyển cửa sổ của bạn vào vị trí 0 trống: superuser.com/a/1155999/674549
eMBee

Để biết sự khác biệt swap-window -s numberswap-window -t numberđể hoán đổi cửa sổ hiện tại, xem câu trả lời của tôi ở đây .
qeatzy

Xem câu trả lời này cho hàm bash để thay đổi phạm vi của các cửa sổ tmux, ví dụ: [2-5] của [0-6] cửa sổ.
qeatzy

Câu trả lời:


467

Các swap-windowlệnh gần nhất với những gì bạn muốn.

"Tiền tố:" (có nghĩa là Ctrl+ B, :theo mặc định) sẽ đưa bạn đến dấu nhắc tmux-lệnh. Có bạn nhập:

swap-window -s 3 -t 1

để cho cửa sổ số 3 và cửa sổ số 1 hoán đổi vị trí của chúng.

Để hoán đổi cửa sổ hiện tại với cửa sổ trên cùng, hãy làm:

swap-window -t 0

Trong trường hợp không có khả năng không có cửa sổ ở chỉ số 0, hãy làm:

move-window -t 0

(nếu chỉ số cơ sở là 0, theo mặc định).

Bạn có thể liên kết lệnh đó với một khóa (ví dụ T cho "top") bằng cách thêm dòng sau vào ~/.tmux.conf:

bind-key T swap-window -t 0

6
Cảm ơn bạn đã chỉnh sửa, nhưng move-windowchỉ hoạt động, nếu không có cửa sổ khác tại chỉ mục đã cho. Vì vậy, trong hầu hết các trường hợp, move-window -t 0sẽ không hoạt động, vì thông thường sẽ có một cửa sổ khác ở vị trí đó.
matlehmann

Điều đó đúng, tôi sẽ cải thiện nó.
zakkak

2
Bạn có thể muốn có một cái nhìn vào movew.
Marcello Romani

3
Ngoài ra, bind-key L swap-window -t -1để làm cho nó cửa sổ cuối cùng.

Để biết sự khác biệt swapw -s numberswapw -t numberđể hoán đổi cửa sổ hiện tại, xem câu trả lời của tôi ở đây .
qeatzy

257

Thêm vào câu trả lời của Gareth, bạn có thể sử dụng các ràng buộc chính sau đây

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

Nhấn Ctrl + Shift + Trái (sẽ di chuyển cửa sổ hiện tại sang trái. Tương tự bên phải. Không cần sử dụng công cụ sửa đổi (Cb).


9
Điều này -1+1cú pháp giúp giải quyết vấn đề của các chỉ số chiếm đóng. tmux sẽ chuyển các cửa sổ khác cho bạn và sẽ tự động bao quanh đến hết / bắt đầu. Đây là câu trả lời tốt nhất.
brianpeiris

1
Việc tôi không thể dễ dàng di chuyển các cửa sổ tmux đã làm tôi khó chịu trong vài tuần. Điều này làm cho nó dễ dàng hơn nhiều để đối phó với các cửa sổ! Rất cám ơn từ chuyển đổi tmux gần đây.
calvinf

8
Gợi ý tuyệt vời, thích hơn bind-key S-Left swap-window -t -1, vì vậy tôi có thể thực hiện <tiền tố> shift + mũi tên, vì tôi không thích làm rối các liên kết chính cho các chương trình.
hủy bỏ

4
Nếu sử dụng chữ cái, bạn cần sử dụng chữ in hoa chứ không phải chữ CS, như thế này:bind-key -n C-H swap-window -t -1
Matthew Mitchell

1
Tôi cũng gặp một số vấn đề trên 1.9a khi sử dụng Ashish Ariga bind-key -n C-S-Left swap-window -t -1tuy nhiên nó hoạt động tốt khi sử dụng tiền tố theo đề xuất của @MatthewMitchell
Rho Phi

63

Các tmux tương đương với :number 42:move-window -t 42.


9
Điều này bị ràng buộc với Cb.
vedang

1
Cảm ơn! Điều này là tốt hơn nhiều so với câu trả lời imo được chấp nhận.
Ashe

5
@ArlenCuss Thật ra cả hai câu trả lời đều hay và hữu ích. Bạn thấy, bằng cách sử dụng màn hình: số bạn có thể hoán đổi các cửa sổ, sử dụng tmux's: move-window bạn chỉ có thể định vị lại cửa sổ nếu chỉ mục đích không được sử dụng. Vì vậy, imo, cả hai: cửa sổ trao đổi và: cửa sổ di chuyển là cần thiết để nắm quyền kiểm soát các vị trí cửa sổ :)
Victor Farazdagi

1
+1 để nhận câu trả lời từ một chuyên gia lập trình (cũng là chính xác). Đây là cách duy nhất tôi có thể làm cho nó hoạt động trên một cửa sổ đang hoạt động
kỹ

4
tmux của :move-windowkhông tương đương với màn hình :number. :numberhoán đổi nếu đích đến tồn tại, :move-windowthất bại trong trường hợp đó. Bạn phải lựa chọn giữa :move-window:swap-window
piec

15

Tôi đánh số lại các cửa sổ như thế này:

Ctrl+ b, .,222

sẽ làm cho tmuxcửa sổ hiện tại (tất cả các ô) số 222.


Liên quan: Khi tôi xáo trộn mọi thứ xung quanh tôi có xu hướng muốn làm

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

và từ đó tôi cũng có thể sử dụng Ctrl+ b, ., readingđể di chuyển cửa sổ hiện hành (tất cả cùng một lúc panes) so với phiên đọc. Bạn có thể duyệt giữa các phiên với Ctrl+ b, scách bạn sẽ duyệt trong phiên bằng Ctrl+ b, w.

HTH


12

Bạn có thể thực hiện tương đương với screen's numberlệnh sử dụng một kịch bản vỏ bên ngoài mà chọn giữa swap-windowmove-window. Bạn có thể liên kết nó với một khóa theo cách đó:

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
Giải pháp rất hay, làm việc tuyệt vời! Tôi chỉ thực hiện các chỉnh sửa nhỏ để dọn dẹp và xóa -Ftùy chọn không được phiên bản tmux của tôi chấp nhận.
haridsv

8

Sử dụng cửa sổ trao đổi để di chuyển đến bất kỳ id nào: [gần nhất với màn hình: số]

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

[m để di chuyển -> nhấn tiền tố-m và nhập nói 3. .to đổi số cửa sổ thành 3]


1
Đây là đã tốt đẹp, nhưng thậm chí tốt hơn sẽ là: làm hoán đổi cửa sổ và nếu nó không thành công, rơi trở lại để di chuyển cửa sổ
NISC

5

Vì câu trả lời của Ashish Ariga không hoạt động trên phiên bản 1.9a trở xuống. Tôi sử dụng <>để hoán đổi cửa sổ sang trái và phải, tương ứng, bằng cách thêm dòng bên dưới vào .tmux.conf.

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

4

Giải pháp đơn giản nhất từ man, là sử dụng các ràng buộc mặc định:

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

6
cửa sổ tmux và panes là khác nhau.
Marcello Romani

4
Điều này vẫn giúp tôi có được những gì tôi muốn
lkraav

Câu hỏi này là về các cửa sổ không panes
mbigras

3

Đối với những người bạn sử dụng byobulàm trình bao bọc cho tmux, bạn có thể trao đổi cửa sổ hiện tại với cửa sổ trước hoặc cửa sổ tiếp theo bằng:

Ctrl-Shift-F3
Ctrl-Shift-F4

Ràng buộc khóa được xác định bởi byobucác khóa này có thể được quan tâm:

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

Sẽ là một lối tắt tuyệt vời để di chuyển xung quanh các phần tách trong một cửa sổ nhất định.
Pablo A

2

Cách tiếp cận tôi sử dụng kết hợp một chút câu trả lời của Ashish với piec; Tôi có mũi tên bên trái và bên phải bị ràng buộc với một chú thích vỏ nhỏ nhanh chóng di chuyển cửa sổ sang bên trái hoặc bên phải, trừ khi đó là cửa sổ đầu tiên hoặc cuối cùng, một cách trân trọng. Tôi đã làm điều này bởi vì, khi bạn phát hành hoán đổi +1 ở cửa sổ cuối cùng (hoặc hoán đổi -1 ở cửa sổ đầu tiên), nó vẫn sẽ trao đổi, thay vì lặp lại một lần nữa như bạn mong đợi:

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

Trở thành

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

Thay vì

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

Vì vậy, các lệnh tôi sử dụng dừng hoạt động khi cửa sổ đã đạt đến cạnh của danh sách:

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'

Điều này có thể dễ dàng được kết hợp với chỉ số cơ sởcửa sổ số lại để có một danh sách các cửa sổ bắt đầu bằng một số tùy ý và không bao giờ có bất kỳ khoảng trống nào.

Nếu bạn đang sử dụng chỉ số cơ sở 1 như tôi và bạn không nghĩ mình sẽ vượt quá 999 cửa sổ, bạn có thể sử dụng một mẹo nhỏ để làm cho nó cuộn đúng cách, mặc dù các lệnh hơi phình ra:

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'

Điều này hoạt động bằng cách tạm thời di chuyển cửa sổ cuối cùng sang chỉ mục không sử dụng-0 và sau đó gọi move-window -r để đánh số lại chúng bắt đầu từ 1 lần nữa. Nó hoạt động tương tự khi di chuyển cửa sổ đầu tiên đến cuối; bằng cách chọn một số lượng lớn bạn sẽ không bao giờ sử dụng, nó đảm bảo rằng khi cửa sổ di chuyển -r kích hoạt lại, mọi thứ sẽ được đánh số như bạn mong đợi. Nếu bạn đang tự hỏi về refresh-client -S , điều đó là cần thiết bởi vì đôi khi, trong khi sắp xếp lại từ cửa sổ di chuyển sẽ hoạt động bình thường, thanh trạng thái sẽ không cập nhật cho đến khi có những thay đổi tiếp theo. Bằng cách buộc làm mới chỉ thanh trạng thái (-S), bạn tránh được điều này.

Vấn đề duy nhất tôi có thể tìm thấy với cách tiếp cận này là cửa sổ trao đổi sẽ hoàn toàn thay đổi cửa sổ được sử dụng lần cuối thành cửa sổ bạn đã tráo đổi. Do đó, nếu bạn ở cửa sổ số 1, hãy chuyển sang cửa sổ bốn và di chuyển nó trở lại cửa sổ số một, bạn sẽ thấy rằng cửa sổ được sử dụng cuối cùng của bạn là số 4 mới (trước đây là số 3) thay vì số 1. Dường như không có cách nào khác.


2

bạn có thể sử dụng base-indexđể thay đổi số bắt đầu cho các cửa sổ của bạn. nếu bạn đặt base-indexthành 1, sau đó move-window -rsẽ đánh số lại tất cả các cửa sổ bắt đầu 1, do đó giải phóng 0để di chuyển một cửa sổ vào khe của nó:

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

khi hoàn tất, bạn có thể đặt lại base-indexthành 0nếu bạn muốn sử dụng move-window -rsau mà không cần di chuyển cửa sổ của mình tại0



1

Cả hai swap-window -s 5swap-window -t 5trao đổi cửa sổ hiện tại với cửa sổ 5, nhưng với ngữ nghĩa khác nhau.

swap-window -s 5

  • cửa sổ 5 chương trình có hiệu lực với số trúng hiện tại.
  • số cửa sổ gần đây vẫn không thay đổi.
  • lặp lại cùng một lệnh sẽ quay trở lại trạng thái trước đó.

swap-window -t 5

  • chương trình hiện tại có hiệu lực với số 5.
  • ghi đè gần đây vào số cửa sổ hiện tại.

các numbertrong swap-window -s number-t numbercó thể là cả hai tuyệt đối , ví dụ, 5, và tương đối , ví dụ, -1, +2.

PS dưới đây là trích đoạn của hiệu ứng minh họa trạng thái tmux củaswap-window -s 5

gần đây:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

bây giờ, sau last-window:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

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

cái khác swapw -s 5:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

cái khác last-window:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc


Xem câu trả lời này cho hàm bash để thay đổi phạm vi của các cửa sổ tmux, ví dụ: [2-5] của [0-6] cửa sổ.
qeatzy

1

Từ cửa sổ tmux, hãy thử cách sau để hoán đổi cửa sổ 0 bằng 1:

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


0

Tôi nghĩ rằng bạn muốn liên kết một tổ hợp phím mới với lệnh 'select-window'.

Tôi biết bạn đã nói rằng bạn đã đọc trang người đàn ông, nhưng bạn nên tham khảo lại. bạn cần sửa đổi tệp ~ / .tmux.conf của mình để thêm lệnh liên kết khóa.

Cụ thể, hãy nhìn vào trang 4 sau đây.

trang người đàn ông tmux


choose-windowdường như không di chuyển cửa sổ hiện tại đến một vị trí mới.
dan

Ngoài ra, choose-windowđã bị ràng buộc với C-B w.
kynan

0

Đây là phương pháp tôi sử dụng. Bạn vẫn không thể di chuyển một cửa sổ đến một chỉ mục bị chiếm đóng, nhưng bạn có thể di chuyển một cửa sổ đến một chỉ số cao hơn (chỉ mục không sử dụng) và sắp xếp lại trong khoảng trống nơi chỉ mục trước đó.

Giả sử bạn có 3 cửa sổ và muốn thêm cửa sổ thứ tư nhưng ở nơi trước đây có 3 cửa sổ.

Trước khi bạn thêm một cửa sổ mới: tiền tố Tmux rồi. sẽ mở lệnh di chuyển. Nhập vào 4 và chỉ mục 3 bây giờ sẽ trở thành 4, sau đó chỉ cần thêm một cửa sổ khác và nó sẽ ở chỉ số 3 và cửa sổ cũ của bạn sẽ vẫn ở chỉ số 4.


Mặc dù một mẹo hữu ích, đây không phải là trả lời câu hỏi.
Jan Doggen

0

Đầu tiên, mở lệnh tmux nhấn và thả:

Ctrl + b 

Và để thay đổi cửa sổ thực tế sang cửa sổ bên phải (theo thứ tự vòng tròn), chỉ cần làm:

}

Để thay đổi cửa sổ thực tế sang trái:

{
  • Đừng quên sử dụng SHIFTkhi nhấn }hoặc {.

2
Chắc chắn hữu ích trong một số trường hợp, nhưng điều này sắp xếp lại các tấm trong một cửa sổ (thay vì sắp xếp lại các cửa sổ).
dấu gạch chéo

0

Cho những gì nó có giá trị:

Tôi đã hack tập lệnh này cùng nhau để có thể đặt tất cả các cửa sổ trong một "TUI". Nó liệt kê tất cả các cửa sổ của bạn trong một tệp tạm thời, mở nó bằng trình chỉnh sửa mặc định của bạn (giả sử rằng bạn đã đặt $ EDITOR). Sau này, bạn có thể sắp xếp lại các dòng và sau khi bạn lưu và đóng tệp, các cửa sổ được sắp xếp lại theo đó. (Điều này tương tự như cam kết đặt hàng khi làm 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

Nó có thể được cải thiện dựa trên rất nhiều, đặc biệt:

LƯU Ý : Bạn có thể được chuyển sang cửa sổ khác sau khi chạy lệnh.

Một gif của nó trong hành động (github)


0

Không có câu trả lời nào ở đây làm tôi hài lòng, vì vậy tôi đã viết một kịch bản (sắp xếp) bắt chước screenhành vi di chuyển cửa sổ cho tmux.

Nó phát hiện xem số cửa sổ đích nhỏ hơn số cửa sổ nhỏ nhất hay lớn hơn số cửa sổ lớn nhất và nếu vậy, hãy đẩy tất cả các cửa sổ khác sang phải hoặc trái (lần lượt) và đánh số lại chúng từ 1-N . Điều này được thực hiện với move-windowlệnh.

Nếu số cửa sổ nằm giữa các số nhỏ nhất / lớn nhất (nghĩa là có lẽ phù hợp với số cửa sổ hiện có), thì nó chỉ hoán đổi chúng bằng swap-windowlệnh.

Đây là kịch bản:

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

Sau đó, chỉ cần thêm ràng buộc khóa đơn giản này vào .tmux.conf:

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

Lưu ý : Để mô phỏng hoàn hảo screenhành vi hoán đổi cửa sổ, tôi tin rằng khi bạn di chuyển một cửa sổ sang số cửa sổ hiện có , nó sẽ đặt vị trí của cửa sổ đó và tất cả các cửa sổ khác bị lệch sang phải . Nó sẽ khá đơn giản để sửa đổi tập lệnh này để làm như vậy.


0

Không cần dòng lệnh (đó là Ctrl+ bvà sau đó :)

Chỉ cần di chuyển cửa sổ của bạn xung quanh với

Ctrl+ b+:

sau đó nhập số cửa sổ mới (miễn phí) và nhấn Enter

Nếu bây giờ có số cửa sổ miễn phí, hãy sử dụng Ctrl+ b+ .để đánh số lại một cửa sổ.

(Mẹo: đặt tên cho các cửa sổ của bạn bằng Ctrl+ b+ ,nếu bạn mất theo dõi đó là cái nào)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.