Как мне переключаться между панелями внутри окна в tmux, как на экране?

41

Я думал, что перемещение панели tmux в окно - это тот же вопрос, но это не так.

Исходя из регулярного использования экрана GNU, я ищу tmux для того же. Одна из вещей, которые я делаю регулярно, - это открыть несколько разных окон, одно с некоторым кодом, открытым в vim, и несколько окон терминалов, открытых для тестирования кода, и иногда одно или два окна для различных других вещей. Я разделил экран по вертикали, и у меня часто будет окно vim на верхней панели, а затем одно из других окон на нижней панели.

Основные команды Затем я использую являюсь Ctrla, Tabчтобы вращать между стеклами и Ctrla, nчтобы вращать между окнами внутри панели. Например, с vim на верхней панели я переключаюсь на нижнюю панель, а затем поворачиваюсь через другие терминалы, делая все, что мне нужно. Экран остается разделенным все время.

Проблема в том, что я не могу найти возможности, сравнимые с возможностями экрана Ctrla, nв tmux. Переключение окон, кажется, не работает внутри панели, но полностью переключается. Если экран разделен, кажется, что только два варианта - перейти к какому-либо не разделенному окну, а затем разделить его или выполнить подразделение панели. Не то, что я искал.

Предложения (кроме просто придерживаться экрана)?

FooBar
источник
Ваша терминология немного сбивает с толку. В tmuxокне можно разбить на несколько панелей. Вы пытаетесь переключаться между панелями в окне с помощью клавиш?
Джейсонвриан
Я пытался следовать номенклатуре инструментов, но я признаю, что это сбивает с толку. Я знаю, как изменить фокус с одной панели на другую. То, что я пытаюсь выяснить, - это как циклически отображать то, что отображается в конкретной панели, без изменения макета.
FooBar
Итак, чтобы переместить контент с одной панели на другую? Вы ищете swap-pane? Если вы хотите эмулировать экран Ctrl-a n, то эквивалент tmux есть Ctrl-b n.
Джейсонвриан

Ответы:

28

Tmux и экран имеют разные модели, поэтому точного эквивалента нет.

В терминах экрана , разделение позволяет отображать несколько окон одновременно. next(C-a n ) вращает окна через активную часть разбиения; это позволяет вращать «скрытые» окна через активную область разделения.

В терминах Tmux разделение делит окно на одну или несколько панелей. Каждая часть разделенного окна является отдельной панелью, панели никогда не скрываются (если окно выбрано (видно), все его панели тоже), и панель может использоваться только в одном разделении одного окна (панель может не может быть в нескольких окнах и не может быть в нескольких разделениях одного и того же окна). Есть команды для перемещения панелей вокруг в (или между) окнами, но не идентичным образом , чтобы nextв экране .


Вы можете использовать привязку, подобную следующей, чтобы организовать похожий эффект:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

Возможно, вы захотите поместить это в свой ~/.tmux.confфайл, но вы можете просто напечатать / вставить его, Prefix :чтобы связать его с текущим экземпляром сервера.

Чтобы использовать привязку, выберите ваше «главное окно», разделите его, создайте окно «Контейнер панели» сразу после «главного окна», затем используйте привязку для поворота любой панели в «главном окне» среди группы в « окно контейнера ».

Вот как вы можете создать настройки:

  • Выберите окно для использования в качестве «основного окна». Начать (например) Vim в нем.

  • Разделите ваше «главное окно» на две панели.

    Например Prefix "( :split-window)

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

  • Создайте новое окно («контейнер панели») сразу после основного окна.

    Например Prefix c( :new-window)

    Важно, чтобы никакое другое окно не попадало между индексами «главного окна» и окна «контейнера панели» ( +в спецификаторах окна, используемых в связанных командах, имеется в виду «следующее окно с более высоким номером»).

  • Разбейте это окно на несколько панелей. Чтобы повернуть через три панели, разделите это окно на две панели (третья панель - это та, которая находится в «главном окне»).

    Может быть, вам нужна оболочка для git и оболочка для запуска интерфейса базы данных. Поместите каждую в отдельную панель в этом окне «Контейнер панели».

  • Вернитесь к своему «главному окну». Выберите панель, которую вы хотите «повернуть».

    Вы можете использовать Prefix Up/ Down/ Left/ Rightдля перемещения по панелям.

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

    Prefix Control- n(в привязке используется Cn, но вы можете изменить это на что угодно).

  • Для прокрутки назад по панелям вы можете использовать ниже:

связывающая клавиша Cp swap-pane -s: +. bottom \; поворотное окно -Dt: +
Крис Джонсен
источник
Спасибо! Отличное объяснение, и предложенная вами привязка, по крайней мере, повторяет ту функциональность, которую я искал.
FooBar
Извините, как может один полноразмерный размер панели и затем вернуться к предыдущему расположению
MageProspero
1
@JamesAndino: tmux 1.8 имеет resize-pane -Z(по умолчанию привязанный к Prefix + z), который временно «увеличивает» панель до полного размера окна. Для версии до 1.8 не было встроенного способа сделать это; другие создавали скриптовые решения из других встроенных команд (например, некоторые ответы на вопрос SU «Максимизация» панели в tmux ).
Крис Джонсен
ты, скомпилированный и загруженный
MageProspero
3
Я считаю C-b oциклы стеклопакетов.
Сэм Селикофф
39

Я считаю , что вы ищете Ctrlb+ ( , , , ). Это позволит вам перемещаться между панелями.

sparticvs
источник
2
Извините, но мне было не очень ясно. Я понял, как перейти от панели к панели. В tmux Ctrl b + o работает примерно так же, как Ctrl + Tab на экране. То, что я ищу, это эквивалентная функциональность, как Ctrl + + экрана.
FooBar
@FooBar как насчет Ctrl-b+{или Ctrl-b+}? Это примерно так близко, как я могу найти к этой функциональности. В tmux панели не выполняются так же, как на экране.
sparticvs
У меня часто возникают проблемы с фокусировкой на выделенной панели, скажем, у меня две панели, я часто нажимаю ^b↑. Как мне тогда на самом деле сфокусировать подсвеченную панель так, чтобы оболочка захватила другую , а не tmux?
ThorSummoner
6

используйте bind -r, чтобы вы могли нажать prefixодин раз, затем другие клавиши в последовательности, чтобы найти вашу панель. Время ожидания может быть скорректировано repeat-time. Проверьтеman tmux

bind -r Tab select-pane -t :.+

Если вы предпочитаете hjkl,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
Жажа
источник
2

Вот небольшая конф, которая позволяет вам перейти к другим панелям или окнам с помощью сочетания клавиш ALT или SHIFT + стрелка. Не нужно использовать префикс ключа удобно.

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

Если вы более ленивый, чем я, вас может заинтересовать следующий код, который позволяет перемещаться по панелям с помощью мыши. (использование: префикс ключа + m для включения, M для его выключения)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

этот конфиг должен работать работает наверняка для tmux 1.6 до 1.9.

хаа
источник
2

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

Подход tmux заключается в использовании трех сессий:

  • внешний сеанс для стекол ,
  • внутренний сеанс для окон (вы можете прикрепить к нему из одной панели),
  • вторичный вид на внутреннюю сессию (для другой панели).

Да, это философия UNIX сошла с ума. Давайте начнем:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

Теперь вы можете переключиться на верхнюю панель и открыть Vim как обычно. Для циклического перемещения по окнам во внутренней сессии (нижняя панель) вам нужно использовать Ctrl-b Ctrl-b nи p.

В сторону: это немного громоздко, но вы всегда можете изменить префикс внешнего сеанса, например Ctrl-a, так:

<Ctrl-b> :set-option prefix C-a

Тогда было бы просто Ctrl-b nи pциклически переключать внутренние окна, и Ctrl-a oциклически обрабатывать внешние панели.

Хорошо, теперь вместо того, чтобы открывать Vim на верхней панели, давайте снова подключимся к вашему внутреннему сеансу. Выйдите из vim, и на этот раз используйте new-sessionкоманду (особенно с -tnot -s):

$ tmux new-session -t inner

Вуаля! Теперь вы можете переключаться между окнами на верхней и нижней панелях.

Причина, по которой мы должны использовать new-session -tвторой раз, заключается в том, что если бы мы просто делали это attach -tснова, то верхняя и нижняя панели были бы синхронизированы, всегда показывая одно и то же окно, а это не то, что вам нужно. Чтобы позволить этой панели перемещаться по окнам независимо от другой панели, мы создаем новый сеанс «просмотра», но подключаем его бэкэнд непосредственно к существующему сеансу, который содержит окна. Это также известно как « сгруппированные сессии ». (Кстати, эта ссылка также предлагает использовать[un]link-window для перемещения окон между сессиями.)

Конечно, для симметрии, вы могли бы также работать tmux new-session -t innerв нижней панели attach. В этом случае вы будете запускать 4 экземпляра tmux (плюс еще один процесс tmux для сервера)!

joeytwiddle
источник
0

Вставьте следующий код в ваш .tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

Перезагрузите конфигурацию, затем вы можете нажать (непосредственно без клавиши префикса) Shift+ для циклического перемещения панелей по часовой стрелке и Shift+ для циклического изменения в обратном направлении.

Протестировано в Tmux 2.8.


Если вы не хотите редактировать конфигурацию, prefix+ o- это привязка клавиш по умолчанию для цикла по часовой стрелке. Иногда я находил эту привязку клавиш, затем получал команду tmux list-keysи использовал ее для своих собственных привязок клавиш:

bind-key    -T prefix       o                 select-pane -t :.+
Реоркс
источник