Как изменить порядок окон tmux?
В screen
, я могу просто набрать C-a :number 0
, чтобы переместить окно в верхнюю часть списка окон и нажать все остальные окна вниз. Какова эквивалентная последовательность команд для tmux
? Я посмотрел на страницу руководства, но я нахожу это запутанным в этом вопросе.
19 ответов
Команда 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
Добавив к ответу Гарета, вы можете использовать следующие привязки клавиш
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, эквивалентное :number 42
, это :move-window -t 42
.
Вы можете реализовать эквивалент команды 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
Я нумерую окна следующим образом:
Ctrl + b , .
, 222
создаст текущее окно tmux
(все окна) номер 222.
Связано: Когда я перетасовываю вещи, я, как правило, хочу делать
Ctrl + b :new-session -d -s "reading"
, и оттуда я также могу использовать Ctrl + b , .
, reading
для перемещения текущего окна (все панели одновременно) до сеанса чтения. Вы можете просматривать среди сеансов с помощью Ctrl + b , s
путь, который вы просматривали бы в сеансе, используя Ctrl + b , w
.
НТН
Использование 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]
Так как ответ Ашиша Ариги не работает на версии 1.9a и ниже. Я использую <
и >
для замены окна слева и справа, соответственно, добавив строку ниже к .tmux.conf
.
# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
Для тех из вас, кто использует 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
Подход, который я использую, сочетает в себе немного ответа Ашиша с 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. Похоже, что это не так.
Самое простое решение от man
- использовать привязки по умолчанию:
{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
вы можете использовать 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
Оба 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
tmux-pain-control предоставляет ctrl-b >
и ctrl-b <
для перемещения сфокусированного окна вправо и влево, обертывание вокруг.
В окне tmux попробуйте следующее, чтобы изменить окно 0 с помощью 1:
$ tmux swap-window -d -s 0 -t 1
Я думаю, вы хотите связать новую комбинацию клавиш с командой «выбрать-окно».
Я знаю, что вы сказали, что уже прочитали справочную страницу, но вы должны вернуться к ней. вам нужно изменить файл ~ /.tmux.conf, чтобы добавить команду bind-key.
В частности, посмотрите на стр. 4 ниже.
Это метод, который я использую. Вы по-прежнему не можете переместить окно в занятый индекс, но вы можете перенести его на более высокий (неиспользованный индекс) и перестроить в промежутке, где был предыдущий индекс.
Скажем, у вас есть 3 окна и вы хотите добавить четвертый, но в том месте, где раньше было 3.
Перед добавлением нового окна: Затем будет префикс Tmux. откроет команду перемещения. Введите 4, а индекс 3 теперь станет 4, затем просто добавьте другое окно, и оно будет в индексе 3, а ваше старое окно будет по-прежнему находиться в индексе 4.
Сначала откройте команду tmux и отпустите:
Ctrl + b
И чтобы изменить фактическое окно в правом окне (в круговом порядке), просто выполните:
}
Чтобы изменить фактическое окно слева:
{
- Не забудьте использовать
SHIFT
, когда нажмите}
или{
.
Для чего это стоит:
Я взломал этот сценарий вместе, чтобы иметь возможность заказывать все окна в «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
Вероятно, он может быть значительно улучшен, в частности:
ПРИМЕЧАНИЕ . После выполнения команды вы можете перейти в другое окно.
Ни один из ответов здесь не удовлетворил меня, поэтому я написал сценарий, который (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
, я верю, что когда вы перемещаете окно в число существующего , оно должно возьмите это окно, и все остальные окна подталкиваются к справа . Для этого было бы довольно просто изменить этот скрипт.