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

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

353 голоса | спросил dan 2 FebruaryEurope/MoscowbWed, 02 Feb 2011 22:53:22 +0300000000pmWed, 02 Feb 2011 22:53:22 +030011 2011, 22:53:22

19 ответов


393

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

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

swap-window -s 3 -t 1

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

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

swap-window -t 0

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

move-window -t 0

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

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

bind-key T swap-window -t 0
ответил matlehmann 1 MarpmTue, 01 Mar 2011 12:39:45 +03002011-03-01T12:39:45+03:0012 2011, 12:39:45
205

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

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).

ответил Ashish Ariga 15 FebruaryEurope/MoscowbFri, 15 Feb 2013 15:18:09 +0400000000pmFri, 15 Feb 2013 15:18:09 +040013 2013, 15:18:09
60

Значение tmux, эквивалентное :number 42, это :move-window -t 42.

ответил Randal Schwartz 6 AMpWed, 06 Apr 2011 02:12:22 +040012Wednesday 2011, 02:12:22
12

Вы можете реализовать эквивалент команды screen 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 16 PMpMon, 16 Apr 2012 19:42:48 +040042Monday 2012, 19:42:48
10

Я нумерую окна следующим образом:

Ctrl + b , ., 222

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


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

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

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

НТН

ответил isomorphismes 10 J000000Wednesday13 2013, 02:16:07
8

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

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

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

ответил Karthik Gurusamy 12 MonEurope/Moscow2011-12-12T07:13:19+04:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2011 07:13:19 +0400 2011, 07:13:19
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 18 MarpmFri, 18 Mar 2016 20:08:47 +03002016-03-18T20:08:47+03:0008 2016, 20:08:47
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
ответил Dave Kuhlman 26 Jam1000000amTue, 26 Jan 2016 03:48:42 +030016 2016, 03:48:42
2

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

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

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

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

ответил Alaska 25 J0000006Europe/Moscow 2013, 00:29:13
2

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

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
ответил jhvaras 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 15:34:24 +0300000000pmMon, 09 Feb 2015 15:34:24 +030015 2015, 15:34:24
1

вы можете использовать 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 13 TueEurope/Moscow2016-12-13T09:50:32+03:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2016 09:50:32 +0300 2016, 09:50:32
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 и относительный , например -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

ответил qeatzy 7 +03002017-10-07T11:44:19+03:00312017bEurope/MoscowSat, 07 Oct 2017 11:44:19 +0300 2017, 11:44:19
1

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

ответил pepper_chico 29 ThuEurope/Moscow2016-12-29T21:30:54+03:00Europe/Moscow12bEurope/MoscowThu, 29 Dec 2016 21:30:54 +0300 2016, 21:30:54
1

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

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

ответил Hamdi Al-Haj 5 J000000Thursday18 2018, 01:36:52
0

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

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

В частности, посмотрите на стр. 4 ниже.

справочная страница tmux

ответил 2 FebruaryEurope/MoscowbWed, 02 Feb 2011 23:11:39 +0300000000pmWed, 02 Feb 2011 23:11:39 +030011 2011, 23:11:39
0

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

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

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

ответил mattLummus 31 +03002014-10-31T18:53:04+03:00312014bEurope/MoscowFri, 31 Oct 2014 18:53:04 +0300 2014, 18:53:04
0

Сначала откройте команду tmux и отпустите:

Ctrl + b 

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

}

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

{
  • Не забудьте использовать SHIFT, когда нажмите } или {.
ответил Jonatas Eduardo Salgado 15 Maypm16 2016, 17:31:11
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)

ответил steinar 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 14 Sep 2017 13:58:56 +0300 2017, 13:58:56
0

Ни один из ответов здесь не удовлетворил меня, поэтому я написал сценарий, который (sort-of) имитирует поведение окна 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, я верю, что когда вы перемещаете окно в число существующего , оно должно возьмите это окно, и все остальные окна подталкиваются к справа . Для этого было бы довольно просто изменить этот скрипт.

ответил Luke Davis 22 Maypm18 2018, 23:05:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132