Перейти к содержимому

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

376

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

136 824 просмотра
dan спросил 15 лет назад
D 2 402

19 ответов

421
Принятый ответ

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

Спасибо за редактирование, но move-window работает только в том случае, если по данному индексу нет другого окна. Поэтому в большинстве случаев move-window -t 0 не будет работать, так как обычно в этой позиции уже будет другое окно.

matlehmann · 13 лет назад · 4

Это верно, я улучшу это.

zakkak · 12 лет назад · 0

Возможно, вы захотите взглянуть на movew.

Marcello Romani · 11 лет назад · 2

Также, bind-key L swap-window -t -1, чтобы сделать его последним окном.

w17t · 9 лет назад · 2

Чтобы узнать разницу между swapw -s number и swapw -t number для замены текущего окна, см. Мой ответ здесь.

qeatzy · 8 лет назад · 0
matlehmann ответил 15 лет назад
M 4 326
227

Adding to Gareth's answer, you can use the following key bindings

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

Pressing Ctrl+Shift+Left (will move the current window to the left. Similarly right. No need to use the modifier (C-b).

Этот синтаксис -1 и + 1 помогает решить проблему занятых индексов. tmux сдвинет другие окна для вас и автоматически завершит событие до конца / начала. Это лучший ответ.

brianpeiris · 12 лет назад · 5

Я пришел сюда в поисках самого быстрого способа написать эти точные привязки. Спасибо!

Keith Smiley · 12 лет назад · 0

Это благочестиво! Благодарю.

Bruno Buccolo · 12 лет назад · 4

Моя неспособность легко перемещать окна tmux беспокоила меня в течение нескольких недель. Это значительно облегчает работу с окнами! Большое спасибо от этого недавнего преобразования Tmux.

calvinf · 12 лет назад · 1

Это, действительно, самый полезный ярлык в моем репертуаре, спасибо, что поделились этим.

glitch · 12 лет назад · 0
Отличный совет, предпочитаю `bind-key S-Left swap-window -t -1`, чтобы я мог сделать Shift + стрелка, так как я не люблю портить привязки клавиш для программ.
demure · 12 лет назад · 8

Это не работает в tmux 1.9a. Может кто-нибудь еще подтвердить, на какой версии будет работать эта привязка клавиш?

rothgar · 12 лет назад · 0

Если вы используете буквы, вам нужно использовать заглавную букву, а не CS, например: bind-key -n CH swap-window -t -1

Matthew Mitchell · 11 лет назад · 4

У меня также есть проблема на 1.9a при использовании Ashish Ariga bind-key -n CS-Left swap-window -t -1, однако он работает нормально при использовании префикса, предложенного @MatthewMitchell

Rho Phi · 10 лет назад · 1

Мне нравится идея привязки клавиш CS-Left / Right. Однако, когда я пробовал это на моем Mac (10.12.4 Sierra) с tmux 2.3, он не работал. Я не уверен, захвачен ли он Terminal.app или другими настройками системы. Любая помощь будет оценена!

Dreamer · 9 лет назад · 1

превосходная работа! наконец-то разобрались со своими окнами! Я выключил номера на окнах

wuxmedia · 8 лет назад · 0
Ashish Ariga ответил 13 лет назад
A 2 271
60

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

Это связано с Cb.

vedang · 15 лет назад · 9

Спасибо! Это намного лучше, чем принятый ответ IMO.

Ashe · 14 лет назад · 1

@ArlenCuss На самом деле оба ответа хороши и полезны. Вы видите, используя screen: number, который вы можете поменять местами, используя tmux: move-window, вы можете перемещать окно, только если целевой индекс не используется. Итак, imo, и: swap-window, и: move-window необходимы для контроля над расположением окон :)

Victor Farazdagi · 14 лет назад · 5

+1 за получение ответа от гуру программирования (также за правильность). Это единственный способ заставить его работать в активном окне

engineerDave · 14 лет назад · 1

: move-window tmux * не * эквивалентно: number экрана. : number меняет местами, если место назначения существует, в этом случае происходит сбой: move-window. Вы должны выбрать между : move-window и: swap-window

piec · 13 лет назад · 4

Мне было интересно, если число 42 является ссылкой на Руководство автостопом по Галактике?

omar · 11 лет назад · 0

Омар - конечно! Это один из моих любимых номеров для использования в примерах.

Randal Schwartz · 8 лет назад · 0
Randal Schwartz ответил 15 лет назад
R 701
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 

Очень хорошее решение, отлично работает! Я только что сделал незначительные правки для очистки и удалил опцию -F, которая не принимается моей версией tmux.

haridsv · 13 лет назад · 2
piec ответил 14 лет назад
P 510
10

I renumber windows like this:

Ctrl+b, ., 222

would make the current tmux window (all panes) number 222.


Relatedly: When I'm shuffling things around I tend to want to do

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

and from there I can also use Ctrl+b, ., reading to move the current window (all panes at once) over to the reading session. You can browse among sessions with Ctrl+b, s the way you would browse within session using Ctrl+b, w.

HTH

isomorphismes ответил 13 лет назад
I 844
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]

Это уже хорошо, но еще лучше: сделайте swap-window и, если это не получится, вернитесь к move-window

nisc · 14 лет назад · 1
Karthik Gurusamy ответил 14 лет назад
K 181
5

Since Ashish Ariga's answer doesn't work on version 1.9a and below. I use < and > to swap window to left and right, respectively, by adding the line below to .tmux.conf.

# swap window to left or right bind-key -r < swap-window -t -1 bind-key -r > swap-window -t +1 
qun ответил 10 лет назад
Q 291
3

For those of you who use byobu as your wrapper for tmux, you can swap the current window with the previous or next window with:

Ctrl-Shift-F3 Ctrl-Shift-F4 

The key binding defined by byobu for these keys may be of interest:

bind-key -n C-S-F3 swap-window -t :-1 bind-key -n C-S-F4 swap-window -t :+1 

Было бы здорово, если бы вы могли перемещаться по сплитам * в * определенном окне.

Pablo Bianchi · 9 лет назад · 0
Dave Kuhlman ответил 10 лет назад
D 31
2

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

{ Swap the current pane with the previous pane. } Swap the current pane with the next pane. 

Tmux окна и панели разные.

Marcello Romani · 11 лет назад · 6

Это все еще помогло мне получить то, что я хотел

lkraav · 11 лет назад · 3

Этот вопрос касается окон, а не окон

mbigras · 8 лет назад · 0
jhvaras ответил 11 лет назад
J 129
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. Кажется, нет никакого способа обойти это.

Alaska ответил 13 лет назад
A 158
Загрузка ответов…