Как мне изменить порядок окон tmux?

414

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

Дан
источник
95
C-b, .Позволяет пронумеровать окно.
изоморфизм
7
Читая все многочисленные ответы, я все еще не вижу простого решения вопроса ОП: как переместить данное окно в положение 0 и сдвинуть все остальное вправо. Мне действительно нужно вручную сдвигать каждую из них, чтобы сделать это? Я просто хочу отменить шаг, который я сделал по ошибке (и я не уверен, что именно), который, я думаю, переместил окно 0 в окно 8 и сдвинул все остальные влево.
nealmcb
1
@nealmcb самое простое, что я могу придумать, это установить base-index в 1, перенумеровать, а затем переместить окно в пустой слот 0: superuser.com/a/1155999/674549
eMBee
Чтобы узнать разницу swap-window -s numberи swap-window -t numberпоменять текущее окно, смотрите мой ответ здесь .
Qeatzy
Посмотрите этот ответ для функции bash для сдвига диапазона окон tmux, например, [2-5] из [0-6] окон.
Qeatzy

Ответы:

467

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

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

swap-window -s 3 -t 1

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

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

swap-window -t 0

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

move-window -t 0

(если base-index равен 0, как по умолчанию).

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

bind-key T swap-window -t 0
matlehmann
источник
6
Спасибо за ваше редактирование, но оно move-windowработает, только если в данном индексе нет другого окна. Так что в большинстве случаев move-window -t 0это не сработает, так как обычно в этой позиции уже будет другое окно.
matlehmann
Это верно, я улучшу это.
Заккак
2
Возможно, вы захотите взглянуть на movew.
Марчелло Романи
3
Также bind-key L swap-window -t -1сделать это последним окном.
Чтобы узнать разницу swapw -s numberи swapw -t numberпоменять текущее окно, смотрите мой ответ здесь .
Qeatzy
257

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

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

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

Ашиш Арига
источник
9
Это -1и +1синтаксис помогает решить проблему занятых индексов. tmux сместит другие окна для вас и автоматически завершит событие до конца / начала. Это лучший ответ.
brianpeiris
1
Моя неспособность легко перемещать окна tmux беспокоила меня в течение нескольких недель. Это значительно облегчает работу с окнами! Большое спасибо от этого недавнего преобразования Tmux.
Calvinf
8
Отличный совет, предпочитаю bind-key S-Left swap-window -t -1, поэтому я могу сделать <prefix> shift + arrow, так как я не люблю портить привязки клавиш для программ.
скромно
4
Если вы используете буквы, вам нужно использовать заглавную букву, а не CS, например:bind-key -n C-H swap-window -t -1
Мэтью Митчелл
1
У меня есть проблема на 1.9a при использовании Ashish Ariga, bind-key -n C-S-Left swap-window -t -1однако она работает нормально при использовании префикса, как предложено @MatthewMitchell
Rho Phi
63

Tmux эквивалентно :number 42is :move-window -t 42.

Рэндал Шварц
источник
9
Это связано с Cb.
Веданг
1
Спасибо! Это намного лучше, чем принятый ответ IMO.
Эш
5
@ArlenCuss На самом деле оба ответа хороши и полезны. Вы видите, используя screen: number, вы можете поменять местами окна, используя tmux: move-window, вы можете перемещать окно, только если целевой индекс не используется. Итак, imo, оба: swap-window и: move-window необходимы для контроля над расположением окон :)
Виктор Фараздаги,
1
+1 за получение ответа от гуру программирования (также за правильность). Это единственный способ заставить его работать с активным окном
engineerDave,
4
tmux - х :move-windowэто не эквивалентно экрана :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.

НТН

isomorphismes
источник
12

Вы можете реализовать эквивалент команды 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
Piec
источник
2
Очень хорошее решение, работает отлично! Я только что сделал незначительные правки для очистки и удалил -Fопцию, которая не поддерживается моей версией tmux.
Харидсв
8

Использование swap-окна для перехода к любому идентификатору: [ближе к экрану: номер]

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

[m для перемещения -> нажмите префикс -m и введите, скажем, 3. . перенумеровать окно на 3]

Картик Гурусамы
источник
1
Это уже хорошо, но еще лучше: сделайте swap-window и, если это не удастся, вернитесь к move-window
nisc
5

Поскольку ответ Ашиша Ариги не работает в версии 1.9a и ниже. Я использую <и, >чтобы поменять местами окно влево и вправо, добавив строку ниже к .tmux.conf.

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
Qun
источник
4

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

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
jhvaras
источник
6
Tmux окна и панели разные.
Марчелло Романи
4
Это все еще помогло мне получить то, что я хотел
lkraav
Этот вопрос касается окон, а не окон
mbigras
3

Для тех из вас, кто использует в 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

Подход, который я использую, сочетает в себе немного ответа Ашиша и Пика; У меня есть стрелка alt-left и right, привязанная к быстрой маленькой выноске оболочки, которая перемещает окно влево или вправо, если только это не первое или последнее окно, соответственно. Я сделал это потому, что, когда вы запускаете своп +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'

Это можно легко комбинировать с base-index и renumber-windows, чтобы получить список окон, которые начинаются с произвольного числа и никогда не имеют пробелов.

Если вы используете базовый индекс 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 , это необходимо, потому что иногда, хотя переупорядочение из окна перемещения будет работать правильно, строка состояния не будет обновляться до тех пор, пока не будут внесены дополнительные изменения. Принудительно обновляя только строку состояния (-S), вы избегаете этого.

Единственная проблема, которую я могу найти с этим подходом, заключается в том, что swap-window неявно изменит последнее использованное окно на то, с которым вы менялись. Таким образом, если вы находитесь в окне № 1, переключитесь на окно четвертое и переместите его обратно на одно, вы обнаружите, что вашим последним использованным окном является новый № 4 (ранее № 3) вместо № 1. Кажется, нет никакого способа обойти это.

Аляска
источник
2

Вы можете использовать, 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

eMBee
источник
2

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

pepper_chico
источник
У меня не работает в tmux 2.5
Дмитрий Франк
1
@DmitryFrank ops, верно, мой плохой. Это было из-за github.com/tmux-plugins/tmux-pain-control
pepper_chico
Спасибо! Удалось настроить эти два вручную, но плагин выглядит хорошо и в других отношениях.
Дмитрий Франк
1

И то swap-window -s 5и другое swap-window -t 5поменять местами окно с окном 5, но с другой семантикой.

swap-window -s 5

  • действует программа окна 5 с текущим номером выигрыша.
  • последние номера окон остаются без изменений.
  • Повторите ту же команду, чтобы вернуться к предыдущему состоянию.

swap-window -t 5

  • Действующая программа действует с номером 5.
  • недавнее переопределение текущего номера окна.

значения numberin swap-window -s numberи -t numberмогут быть как абсолютными , например, 5, так и относительными , например, -1, +2.

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

qeatzy
источник
Посмотрите этот ответ для функции bash для сдвига диапазона окон tmux, например, [2-5] из [0-6] окон.
Qeatzy
1

Из окна tmux попробуйте следующее, чтобы поменять окно 0 на 1:

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

Хамди Аль-Хадж
источник
0

Я думаю, что вы хотите связать новую комбинацию клавиш с командой «выбрать окно».

Я знаю, что вы сказали, что уже читали справочную страницу, но вам следует вернуться к ней. вам нужно изменить файл ~ / .tmux.conf, чтобы добавить команду bind-key.

В частности, посмотрите на страницу 4 следующего.

Страница man tmux


источник
choose-windowне похоже, чтобы переместить текущее окно в новую позицию.
дан
Кроме того, choose-windowуже связан с C-B w.
Кинан
0

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

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

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

mattLummus
источник
Хотя это полезный совет, это не ответ на вопрос.
Ян Догген
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

Возможно, это можно было бы улучшить, в частности:

ПРИМЕЧАНИЕ. После выполнения команды вы можете перейти в другое окно.

Подарок в действии (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+, ,если вы потеряли трек, который есть какой)

rubo77
источник