tmux 창을 어떻게 재정렬합니까?


413

에서 창을 창 목록의 맨 위로 이동하고 다른 모든 창을 아래로 밀어 screen입력 할 수 있습니다 C-a :number 0. 에 해당하는 명령 순서는 tmux무엇입니까? 맨 페이지를 보았지만이 시점에서 혼란 스럽습니다.


95
C-b, .당신이 윈도우 번호를 다시 할 수 있습니다.
isomorphismes

7
많은 답변을 모두 읽은 후에도 여전히 OP의 질문에 대한 쉬운 해결책이 없습니다. 주어진 창을 위치 0으로 이동하고 나머지는 오른쪽으로 이동하는 방법입니다. 이 작업을 수행하려면 각 항목을 수동으로 이동해야합니까? 창 0을 창 8로 옮기고 다른 모든 것을 왼쪽으로 옮겼습니다.
nealmcb

1
@nealmcb 내가 얻을 수있는 가장 쉬운 방법은 기본 색인을 1로 설정하고 번호를 변경 한 다음 창을 빈 0 슬롯으로 옮기는 것입니다. superuser.com/a/1155999/674549
eMBee

의 차이 swap-window -s numberswap-window -t number현재 창을 교환하는 참조 여기에 내 대답 .
qeatzy

tmux 창의 범위를 이동하는 bash 기능 (예 : [0-6] 창의 [2-5])에 대해서는 이 답변 을 참조하십시오 .
qeatzy

답변:


467

swap-window명령은 당신이 원하는에 가장 가까운.

"접두사는"(즉 Ctrl+ B, :기본적으로)을 TMUX - 명령 프롬프트로 제공합니다. 거기에 입력하십시오 :

swap-window -s 3 -t 1

창 번호 3과 창 번호 1이 위치를 바꾸도록합니다.

현재 창을 상단 창으로 바꾸려면 다음을 수행하십시오.

swap-window -t 0

인덱스 0에 창이없는 경우는 다음과 같이하십시오.

move-window -t 0

(기본 색인이 0 인 경우 기본 색인이 0 인 경우).

다음에 다음을 추가하여 해당 명령을 키 (예 : "top"의 경우 T)에 바인딩 할 수 있습니다 ~/.tmux.conf.

bind-key T swap-window -t 0

6
편집 해 주셔서 감사하지만 move-window지정된 색인에 다른 창이없는 경우에만 작동합니다. 따라서 move-window -t 0대개 해당 위치에 다른 창이 이미 있기 때문에 대부분의 경우 작동하지 않습니다.
matlehmann

그렇습니다, 나는 그것을 향상시킬 것입니다.
zakkak

2
를보고 싶을 수도 있습니다 movew.
Marcello Romani 2019

3
또한 bind-key L swap-window -t -1마지막 창으로 만듭니다.

의 차이 swapw -s numberswapw -t number현재 창을 교환하는 참조 여기에 내 대답 .
qeatzy

257

Gareth의 답변에 다음과 같은 키 바인딩을 사용할 수 있습니다.

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

Ctrl + Shift + 왼쪽을 누르면 (현재 창을 왼쪽으로 이동합니다. 마찬가지로 오른쪽입니다. 수정 자 (Cb)를 사용할 필요가 없습니다.


9
이 구문 -1+1구문은 점유 된 인덱스 문제를 해결하는 데 도움 이 됩니다. tmux는 다른 창을 자동으로 전환하고 이벤트가 자동으로 종료 / 시작됩니다. 이것이 가장 좋은 대답입니다.
brianpeiris

1
tmux 창을 쉽게 이동할 수 없어 몇 주 동안 버그가 발생했습니다. 이것은 창을 다루기가 훨씬 쉬워집니다! 이 최신 TMUX 변환 덕분에 많은 감사를드립니다.
캘빈 프

8
좋은 힌트는 선호합니다 bind-key S-Left swap-window -t -1. 그래서 프로그램의 키 바인딩을 엉망으로 만드는 것을 좋아하지 않기 때문에 <prefix> shift + arrow를 수행 할 수 있습니다.
몸매

4
문자를 사용하는 경우 다음과 같이 CS가 아닌 대문자를 사용해야합니다.bind-key -n C-H swap-window -t -1
Matthew Mitchell

1
Ashish Ariga를 사용할 때 1.9a에서도 문제가 bind-key -n C-S-Left swap-window -t -1있지만 @MatthewMitchell이 ​​제안한 접두사를 사용할 때 정상적으로 작동합니다.
Rho Phi

63

에 해당하는 tmux :number 42:move-window -t 42입니다.


9
이것은 Cb에 바인딩됩니다.
vedang 2016 년

1
감사! 이것은 허용되는 답변 imo보다 훨씬 낫습니다.
애쉬

5
@ArlenCuss 실제로 두 가지 대답 모두 좋고 유용합니다. screen : number를 사용하면 창을 바꿀 수 있고 tmux의 : move-window를 사용하면 대상 인덱스를 사용하지 않는 경우에만 창을 재배치 할 수 있습니다. 따라서, imo, : swap-window 및 : move-window는 창 위치를 제어하는 ​​데 필요합니다. :)
Victor Farazdagi

1
프로그래밍 전문가로부터 답변을 얻은 경우 +1 (정확한 답변) 이것은 내가 그것을 활성 창에서 작업을 얻을 수있는 유일한 방법입니다
engineerDave

4
tmux :move-window는 screen과 동일 하지 않습니다:number . :number대상이 있으면 스왑하고이 경우 :move-window실패합니다. 당신은 사이에서 선택을해야 :move-window하고:swap-window
PIEC

15

다음과 같이 창 번호를 다시 매 깁니다.

Ctrl+ b, .,222

현재 tmux창 (모든 창)을 222로 만듭니다.


관련 : 내가 물건을 뒤섞을 때 나는하고 싶은 경향이있다.

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

거기에서 나는 또한 사용할 수 있습니다 Ctrl+ b, ., reading독서 세션을 통해 현재 창 (모든 창 번) 이동합니다. 당신과 세션 사이에서 찾아 볼 수 있습니다 Ctrl+ b, s사용 세션 내에서 검색 할 방법을 Ctrl+ b, w.

HTH


12

당신은에 상응를 구현할 수 screennumber사이에서 선택 외부 쉘 스크립트를 사용하여 명령 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
아주 좋은 해결책, 잘 작동합니다! 방금 정리를 약간 수정 -F하고 내 tmux 버전에서 허용하지 않는 옵션을 제거했습니다 .
haridsv

8

swap 창을 사용하여 임의의 id로 이동

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

[m for move-> prefix-m을 누르고 say 3을 입력하십시오. 창을 3으로 다시 번호 매기기]


1
스왑 창을 수행하고 실패하면 이동 창으로 돌아가십시오.
nisc

5

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

4

의 가장 간단한 해결책 man은 기본 바인딩을 사용하는 것입니다.

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

6
tmux 창과 창이 다릅니다.
Marcello Romani 2019

4
이것은 여전히 ​​내가 원하는 것을 얻도록 도와주었습니다
lkraav

이 질문은 창이 아닌 창에 관한 것입니다
mbigras

3

byobutmux의 래퍼 로 사용 하는 사용자 의 경우 다음을 사용 하여 현재 창을 이전 또는 다음 창으로 바꿀 수 있습니다.

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

특정 창 에서 분할을 이동하기위한 지름길이 될 것 입니다.
Pablo A

2

내가 사용하는 접근 방식은 약간의 Ashish의 답변과 piec의 답변을 결합합니다. 첫 번째 또는 마지막 창이 아닌 한 창을 왼쪽 또는 오른쪽으로 이동하는 빠른 작은 쉘 콜 아웃에 왼쪽 및 오른쪽 화살표가 바인딩되어 있습니다. 마지막 창에서 스왑 +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'

이것은 기본 색인번호 재 지정 창과 쉽게 결합되어 임의의 수로 시작하고 간격이없는 창 목록을 가질 수 있습니다.

나처럼 기본 인덱스 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) 만 새로 고치면이를 피할 수 있습니다.

이 방법으로 찾을 수있는 유일한 문제는 스왑 창이 마지막으로 사용한 창을 스왑 창으로 암시 적으로 변경한다는 것입니다. 따라서 1 번 창에있는 경우 4 번 창으로 전환하여 1 번 다시 이동하면 마지막으로 사용한 창이 1 번 대신 새 4 번 (이전 3 번)임을 알 수 있습니다. 이 문제를 해결할 방법이없는 것 같습니다.


2

base-index창의 시작 번호를 변경하는 데 사용할 수 있습니다 . 로 설정 base-index하면 1에서 move-window -r시작하는 모든 창의 번호가 다시 매겨 1지므로 0창을 슬롯으로 자유롭게 이동할 수 있습니다.

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

완료되면 창을 이동하지 않고 나중에 사용하려는 경우로 재설정 base-index0수 있습니다move-window -r0



1

모두 swap-window -s 5와는 swap-window -t 5의미는 다른, 창 5 현재 창을 교환합니다.

swap-window -s 5

  • 현재 승리 번호에 유효한 창 5 프로그램.
  • 최근 창 번호는 변경되지 않습니다.
  • 동일한 명령을 반복하면 이전 상태로 롤백됩니다.

swap-window -t 5

  • 번호 5에 유효한 현재 프로그램.
  • 현재 창 번호에 최근 재정의.

number에서은 swap-window -s number-t number모두 일 수 절대 5 예 및 상대 +2, -1, 예.

아래 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 창의 범위를 이동하는 bash 기능 (예 : [0-6] 창의 [2-5])에 대해서는 이 답변 을 참조하십시오 .
qeatzy

1

tmux 창에서 다음을 시도하여 창 0을 1로 바꾸십시오.

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


0

새로운 키 조합을 '창 선택'명령에 바인딩하고 싶다고 생각합니다.

맨 페이지를 이미 읽었다 고 말했지만 다시 참조해야합니다. 바인드 키 명령을 추가하려면 ~ / .tmux.conf 파일을 수정해야합니다.

구체적으로는 다음 4 페이지를보십시오.

tmux 매뉴얼 페이지


choose-window현재 창을 새로운 위치로 옮기지 않는 것 같습니다.
dan

또한 choose-window이미 바인딩되어 C-B w있습니다.
kynan

0

이것이 내가 사용하는 방법입니다. 여전히 창을 점유 된 인덱스로 이동할 수는 없지만 한 인덱스를 더 높은 (미사용 인덱스)로 옮기고 이전 인덱스가 있던 간격으로 다시 정렬 할 수 있습니다.

3 개의 창이 있고 이전에 3이 있던 곳에 4 번째를 추가하고 싶다고 가정 해 봅시다.

새 창을 추가하기 전에 : Tmux prefix then. 이동 명령을 엽니 다. 4를 입력하면 색인 3이 4가되고 다른 창을 추가하기 만하면 색인 3이되고 이전 창은 여전히 ​​색인 4가됩니다.


유용한 팁이지만 질문에 대답하지 않습니다.
Jan Doggen 2009 년

0

먼저 tmux 명령을 눌렀다 놓습니다.

Ctrl + b 

실제 창을 오른쪽 창으로 (원형 순서로) 변경하려면 다음을 수행하십시오.

}

실제 창을 왼쪽으로 변경하려면

{
  • 또는을 SHIFT누를 때 사용하는 것을 잊지 마십시오 .}{

2
일부 시나리오에서는 확실히 도움이되지만 창 순서를 바꾸지 않고 창 내에서 창을 재정렬합니다.
후행 슬래시

0

가치있는 것 :

"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

특히 다음과 같이 많이 향상 될 수 있습니다.

참고 : 명령을 실행 한 후 다른 창으로 이동할 수 있습니다.

작동중인 GIF (github)


0

여기에 대한 답변 중 어느 것도 나를 만족시키지 못했기 때문에에 대한 screen창 이동 동작을 모방 한 스크립트를 작성했습니다 tmux.

그것은 대상 창 번호인지 여부를 감지 작은 또는 작은 창 수 있다는 가장 큰 창 수보다, 그래서 경우는, 오른쪽으로 다른 모든 창을 유도합니다 또는 점진적 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'"

참고 : screen창 스와핑 동작 을 완벽하게 모방하기 위해 창을 기존 창 번호 로 이동하면 해당 창을 가져 와야하고 다른 모든 창은 오른쪽으로 이동 합니다. 이 스크립트를 수정하여 수정하는 것은 매우 간단합니다.


0

명령 줄이 필요하지 않습니다 ( Ctrl+ b:)

그냥 창문을 움직여

Ctrl+ b+:

그런 다음 새로운 (무료) 창 번호를 입력하고 누르십시오 Enter

빈 창 번호가 있으면 Ctrl+ b+ .를 사용 하여 창 번호를 다시 매 깁니다.

(도움말 : 느슨한 트랙이 어느 것이라면 Ctrl+ b+로 창 이름을 지정하십시오 ,)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.