Як переупорядкувати вікна tmux?


411

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


94
C-b, .дозволяє перенумерувати вікно.
ізоморфізми

7
Читаючи всі безліч відповідей, я все ще не бачу простого вирішення питання ОП: як перемістити задане вікно в положення 0 і перенести всі інші вправо. Чи справді мені вручну потрібно перекладати кожного, щоб це зробити? Я просто хочу скасувати хід, який я зробив помилково (і я не впевнений, що саме), який, на мою думку, перемістив вікно 0 до вікна 8 і перемістив усіх інших вліво.
nealmcb

1
@nealmcb, найпростіше, що я міг би придумати, - це встановити базовий індекс на 1, перенумерувати, а потім перемістити вікно в порожній слот 0: superuser.com/a/1155999/674549
eMBee

Для різниці swap-window -s numberта swap-window -t numberпереключення поточного вікна дивіться мою відповідь тут .
qeatzy

Дивіться цю відповідь на функцію bash для зміщення діапазону tmux вікон, наприклад, [2-5] вікон [0-6].
qeatzy

Відповіді:


464

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

6
Дякуємо за вашу редагування, але move-windowпрацює лише, якщо в даному індексі немає іншого вікна. Тож у більшості випадків move-window -t 0це не спрацює, оскільки зазвичай в цьому місці вже буде інше вікно.
matlehmann

Правильно, я це вдосконалю.
заккак

2
Ви можете поглянути на movew.
Marcello Romani

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 + вліво (перемістить поточне вікно вліво. Аналогічно праворуч. Не потрібно використовувати модифікатор (Cb).


9
Це -1і +1синтаксис допомагає вирішити проблему зайнятих індексів. tmux змістить інші вікна для вас і автоматично завершиться до кінця / початку. Це найкраща відповідь.
brianpeiris

1
Моя нездатність легко переміщати tmux windows клопоче мене вже кілька тижнів. Завдяки цьому набагато простіше працювати з вікнами! Велике спасибі за це нещодавнє перетворення tmux.
calvinf

8
Прекрасний натяк, віддайте перевагу bind-key S-Left swap-window -t -1, тому я можу робити <prefix> shift + стрілку, так як мені не подобається плутати ключові прив’язки для програм.
демо

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 42є :move-window -t 42.


9
Це пов'язане з Cb.
віданг

1
Дякую! Це набагато краще, ніж прийнята відповідь imo.
Еш

5
@ArlenCuss Насправді обидва відповіді є корисними та корисними. Розумієте, використовуючи screen: number, на який можна було поміняти вікна, використовуючи tmux's: move-window, ви можете пересунути вікно лише у тому випадку, якщо цільовий індекс не використовується. Отже, imo, і те: swap-window і: move-window необхідні, щоб зрозуміти контроль над розташуванням вікон :)
Victor Farazdagi

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.

HTH


12

Ви можете реалізувати еквівалент команді screens, 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

2
Дуже приємне рішення, чудово працює! Щойно я зробив невеликі зміни для очищення та видалив -Fпараметр, який не прийнятий моєю версією tmux.
haridsv

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
Це вже приємно, але ще краще було б: зробіть своп-вікно, і якщо воно не вдасться,
відкиньтесь

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

4

Найбільш просте рішення з man, це використовувати прив'язки за замовчуванням:

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

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

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

Це може легко поєднуватися з базовим індексом і перенумеруванням вікон, щоб мати список вікон, які починаються з довільної кількості і ніколи не мають прогалин.

Якщо ви використовуєте базовий індекс 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. Це працює аналогічно при переміщенні першого вікна до кінця; вибираючи величезну кількість, яку ви ніколи не будете використовувати, це гарантує, що при переміщенні віконця -r знову все буде пронумеровано так, як ви очікували. Якщо вам цікаво refresh-client -S , це необхідно, тому що іноді, хоча переупорядкування з вікна переміщення буде працювати належним чином, рядок стану не оновлюватиметься, поки не будуть внесені подальші зміни. Примушуючи оновити лише рядок стану (-S), ви цього уникаєте.

Єдине питання, яке я можу знайти при такому підході, це те, що swap-вікно неявно змінить останнє використане вікно на те, з чим ви обмінялися. Таким чином, якщо ви перебуваєте у вікні №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


2

tmux-біль-контроль забезпечує ctrl-b >і ctrl-b <переміщення зосередженого вікна вправо і вліво, обертаючись навколо.


Не працює для мене в 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 вікна 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


Дивіться цю відповідь на функцію bash для зміщення діапазону tmux вікон, наприклад, [2-5] вікон [0-6].
qeatzy


0

Я думаю, ви хочете прив’язати нову комбінацію клавіш до команди 'select-window'.

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

Зокрема, подивіться на сторінку 4 наступного.

tmux сторінка man


choose-windowне здається перемістити поточне вікно на нове місце.
дан

Також choose-windowвже зобов’язаний C-B w.
кинан

0

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

Скажімо, у вас є 3 вікна і ви хочете додати четверте, але там, де раніше було 3.

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


Хоча корисна порада, це не дає відповіді на питання.
Ян Догген

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+, ,якщо ви вільно відстежуєте, що саме є)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.