2011-02-02 19:53:22 +0000 2011-02-02 19:53:22 +0000
436
436

Как перезаказать окна tmux?

В screen я могу просто набрать C-a :number 0, чтобы переместить окно в верхнюю часть списка окон и нажать на все остальные окна вниз. Какова эквивалентная последовательность команд для tmux? Я посмотрел на страницу man, но нахожу это запутанным.

Ответы (19)

491
491
491
2011-03-01 09:39:45 +0000

Команда swap-window наиболее близка к тому, что вы хотите.

“Префикс :” (то есть Ctrl+B, : по умолчанию) выводит вас в командную строку tmux-command. Там вы вводите:

swap-window -s 3 -t 1

, чтобы окно номер 3 и окно номер 1 поменяли местами.

Чтобы поменять текущее окно на верхнее, сделайте это:

swap-window -t 0

В маловероятном случае отсутствия окна с индексом 0, сделайте:

move-window -t 0

(если базовый индекс равен 0, как по умолчанию).

Вы можете привязать эту команду к ключу (например, T для “top”), добавив к вашему ~/.tmux.conf следующее:

bind-key T swap-window -t 0
279
279
279
2013-02-15 11:18:09 +0000

Добавив к ответу Гарета, вы можете использовать следующие привязки клавиш

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

Нажав Ctrl+Shift+Left (переместит текущее окно влево). Аналогично направо. Нет необходимости использовать модификатор (C-b).

Для версии tmux 3.0 вы должны использовать следующие привязки клавиш

bind-key -n C-S-Left swap-window -t -1\; select-window -t -1
bind-key -n C-S-Right swap-window -t +1\; select-window -t +1
67
67
67
2011-04-05 22:12:22 +0000

Эквивалент tmux :number 42 равен :move-window -t 42.

17
17
17
2013-07-09 22:16:07 +0000

Я перенумеровываю окна вот так:

Ctrl+b, ., 222

сделает текущее окно tmux (все панели) номером 222.


Похоже: Когда я перетасовываю вещи вокруг, я обычно хочу сделать

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

и оттуда я также могу использовать Ctrl+b, ., reading, чтобы переместить текущее окно (все панели сразу) на сеанс чтения. Вы можете просматривать между сессиями с помощью Ctrl+b, s так же, как вы бы просматривали внутри сессии с помощью Ctrl+b, w.

HTH

12
12
12
2012-04-16 15:42:48 +0000

Вы можете реализовать эквивалент команды screen‘s 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
8
8
8
2011-12-12 03:13:19 +0000

Используя своп-окно, чтобы перейти к любому ID: [ближайший к экрану :номер]

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

[m for move –> нажмите префикс-m и введите, скажем, 3 …чтобы перенумеровать окно на 3].

5
5
5
2016-03-18 17:08:47 +0000

Поскольку ответ Ашиша Ариги не работает на версии 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
4
4
2015-02-09 12:34:24 +0000

Самым простым решением от man, является использование привязок по умолчанию:

{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
3
3
3
2016-01-26 00:48:42 +0000

Для тех из вас, кто использует byobu в качестве обертки для tmux, вы можете поменять текущее окно на предыдущее или следующее:

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
2
2
2
2016-12-13 06:50:32 +0000

вы можете использовать base-index для изменения стартового номера для ваших окон. если вы установите base-index на 1, то move-window -r перенумеруют все окна, начиная с 1, тем самым освобождая 0 для перемещения окна в его слот:

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

, когда это будет сделано, вы можете сбросить base-index на 0, если вы хотите использовать move-window -r позже, не перемещая окно на 0.

2
2
2
2016-12-29 18:30:54 +0000

tmux-pain controll обеспечивает ctrl-b > и ctrl-b < для перемещения сфокусированного окна вправо и влево, обертывания.

2
2
2
2013-06-24 20:29:13 +0000

Подход, который я использую, сочетает в себе немного ответа Ашиша с пипсовкой; у меня есть левая и правая стрелки, привязанные к быстрому маленькому вызову оболочки, который перемещает окно одно влево или вправо, если только это не первое или последнее окно, при всем уважении. Я сделал это потому, что когда вы выпускаете swap +1 в последнем окне (или swap -1 в первом окне), он все равно будет swap, вместо того, чтобы снова перекручиваться назад, как вы могли ожидать:

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 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 и переместите его обратно на одно, вы обнаружите, что ваше последнее используемое окно - это новое #4 (ранее #3), а не #1. Похоже, что способа обойти это нет.

1
1
1
2017-10-07 08:44:19 +0000

И 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, и отношение, например, -1, +2.

P.S. ниже приведен выдержку из 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

1
1
1
2018-07-04 22:36:52 +0000

В окне tmux попробуйте поменять окно 0 на 1:

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

0
0
0
2016-05-15 14:31:11 +0000

Сначала откройте команду tmux press and release:

Ctrl + b

И чтобы изменить фактическое окно на правое (в круговом порядке), просто сделайте:

}

Чтобы изменить фактическое окно на левое:

{
  • Не забудьте использовать SHIFT, когда нажимаете } или {.
0
0
0
2017-09-14 10:58:56 +0000

Как бы то ни было:

я взломал этот скрипт вместе, чтобы иметь возможность заказать все окна в “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

Вероятно, это можно значительно улучшить, в частности:

NOTE : Вы можете быть перемещены в другое окно после выполнения команды. Дар в действии (github)

0
0
0
2018-05-22 20:05:43 +0000

Ни один из ответов здесь меня не удовлетворил, поэтому я написал скрипт, который (sort-of) имитирует поведение screen при перемещении окон для tmux. 0x2 и Он определяет, является ли номер окна назначения маленький, что наименьший номер окна или больше, чем самый большой номер окна, и если это так, подталкивает все остальные окна вправо или влево (соответственно) и повторно нумерует их от 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
0
0
2014-10-31 15:53:04 +0000

Этот метод я использую. Вы все еще не можете переместить окно в занятый индекс, но вы можете переместить окно в более высокий (неиспользованный индекс) и переместить в промежуток, где был предыдущий индекс.

Скажем, что у вас есть 3 окна и вы хотите добавить четвертое, но в том месте, где раньше было 3.

Перед добавлением нового окна: Tmux префикс затем . откроет команду перемещения. Введите 4, и индекс 3 теперь станет 4, затем просто добавьте еще одно окно, и оно будет в индексе 3, а ваше старое окно все еще будет в индексе 4.

0
0
0
2019-09-16 23:39:34 +0000

Нет необходимости в командной строке (которая является Ctrl + b и затем :)

Просто перемещайте свои окна с

Ctrl + b + :

затем введите номер нового (свободного) окна и нажмите Enter

Если теперь есть свободный номер окна, используйте Ctrl + b + . для перенумерации окна.

(Совет: назовите свои окна с помощью Ctrl + b + , если вы потеряли номер окна).