381

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

19 ответов19

427

Команда 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
235

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

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

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

62

Tmux, эквивалентный :number 42 :move-window -t 42 .

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
10

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

Ctrl+. 222

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


В связи с этим: когда я шаркаю вещи вокруг, я склонен делать

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

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

НТН

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]

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
3

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

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
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

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

1

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

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

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.

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

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

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

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

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

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

Страница man tmux

0

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

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

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

0

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

Ctrl + b 

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

}

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

{
  • Не забудьте использовать SHIFT при нажатии } или { .
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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .