Как заставить tmux открывать набор панелей, не вводя их вручную?

30

Итак, я хочу сделать специфичный для проекта tmuxсеанс, который автоматически выдает определенные команды в определенных областях. После онлайн-руководства и tmuxсправочной страницы вот что я придумала для файла конфигурации:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

Результат ... ничего. tmuxзапускается с одним окном и одной панелью в этом окне без выполнения команд.

Как мне создать конфигурационный файл, который на самом деле позволяет мне создавать набор окон и панелей с предварительно выполненными определенными командами?

ПРОСТО МОЕ правильное мнение
источник

Ответы:

36

Ваш конфигурационный файл работает, но есть несколько сложностей.

Краткосрочные Команды

Во-первых, команды, которые вы запускаете (экземпляры ls ), заканчиваются очень быстро. Окна и панели для команд созданы, но они исчезают при выходе из каждой команды.

Если ваша цель состоит в том, чтобы реально использовать такие команды «один выстрел» в вашей окончательной конфигурации, то вы , вероятно , следует использовать опцию окна remain-on-exit(и , возможно, параметр сеанса , set-remain-on-exitчтобы обеспечить по умолчанию для всех окон , созданных в сессии). Когда remain-on-exitзадано окно, оно не исчезнет при выходе из команды. Вы, вероятно, захотите сопоставить respawn-windowклавишу с ключом (примечание: respawn-windowвозродит исходную команду; respawn-paneтакже доступно в tmux 1.5 для перезапуска отдельных панелей).

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

Или, если вы не возражаете против того, чтобы ваше первоначальное окно было номером 1 вместо номера 0, тогда мы можем избежать изменения глобального значения:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

Если вы использовали только lsв качестве упрощенной команды-заполнителя и на самом деле намереваетесь создавать интерактивные команды какого-либо типа в своих окнах / панелях, то вам, вероятно, следует просто создать команду, которую вы намеревались выполнить. Если ваша намеченная команда слишком долго запускается, чтобы использовать ее во время тестирования tmux , замените оболочку или другую простую интерактивную команду (например top, sqlite3и т. Д.).

new-session Команда по умолчанию

Во-вторых, запуск tmux без аргумента команды (например tmux) эквивалентен использованию new-sessionкоманды (то tmuxесть так же, как tmux new-session). Вы .tmux.confсоздаете сеанс для своих окон / панелей ( newэто псевдоним new-session), и создается другой сеанс для неявной new-sessionкоманды, указанной при запуске tmux без аргумента команды. Если вы используете строку состояния по умолчанию, вы увидите [1]в левой части строки состояния, когда вы находитесь в «дополнительном» сеансе (начальный сеанс, созданный в .tmux.confэто номер 0).

Если вы хотите избежать создания дополнительного сеанса, используйте tmux attachвместо обычного tmux. Ваши команды .tmux.confбудут выполняться, создавая сессию 0, а затем ваш клиент будет присоединяться к этому сеансу вместо создания нового.

Крис Джонсен
источник
2
Ладно, я, может быть, такой же толстый, как китовый сэндвич, но сейчас у меня есть файл конфигурации, в котором есть только splitwон - больше ничего - и я все еще не получаю разделенный экран, потому что он говорит это не могу установить текущий сеанс. Если я добавлю newперед этим, я получу ... одно окно, одну панель. Я не могу себе представить, чтобы за всю жизнь получить две панели при запуске.
Просто мое правильное мнение
1
Файл конфигурации с new, затем splitwработает для меня, когда я запускаю tmux через tmux attach. Следует помнить, что .tmux.conf(или файл, указанный с помощью -fпараметра) используется только в том случае, если сервер еще не запущен. Проверьте, работает ли сервер через tmux ls. Если вы хотите запускать команды из файла, когда сервер уже запущен, сделайте это следующим образом: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(если вы запускаете это, когда нет сервера, ваш .tmux.conf(или -fфайл) будет запускаться первым, а затем ваш source-fileфайл).
Крис Джонсен
Файл конфигурации указывается с -f - так что я иду tmux new -f myconfig. Содержимое этого файла конфигурации содержит только new после splitw. Я убиваю все процессы tmux перед тем, как попробовать командную строку tmux -f myconfig. Я не получаю две панели. Я действительно в недоумении, что делать после этого (кроме того, чтобы просто отказаться от tmux).
Просто мое правильное мнение
4
@Just: Независимо от того, используете вы -fили нет, tmuxаргумент команды без аргумента совпадает с tmux new-session(что для новых серверов создаст новый сеанс поверх того, что делает ваш файл конфигурации). Ваше предварительно разделенное окно создается в сеансе 0, но неявная new-sessionкоманда создает (и присоединяется) дополнительный сеанс (сеанс 1; ищите [1]в строке состояния). Используйте, tmux -f myconfig attachчтобы избежать создания нового сеанса, который скрывает ваше предварительно разделенное окно.
Крис Джонсен
1
Хорошо, я думаю, что обучение чтению в конечном итоге окупится за меня. :) Спасибо за усилия и ответ. Теперь все работает нормально. Хотелось бы, чтобы здесь была репутация «опрокидывающейся банки», чтобы я мог дать вам больше, чем просто принятый ответ.
Просто мое правильное мнение
9

Я не уверен, что понимаю, что вы подразумеваете под «ручным вводом», но я так и делаю. Я написал скрипт автозапуска, который запускает мой оконный менеджер. Это содержит:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

где каждый файл .session выглядит примерно так:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

Подождите, это еще не все! У меня постоянно растет число файлов .session, которые я загружаю с помощью konsole:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

где work_console.tabs выглядит примерно так:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

Затем я нажимаю F12, чтобы запустить консоль.

Джон Шмитт
источник
Консоль, кажется, сломана, поэтому я переключился на Терминал , который работает хорошо. У меня есть более подробный пост в списке рассылки tmux-users.
Джон Шмитт
1
Просто небольшой комментарий, вы можете заменить '! -z 'с' -n 'в ваших тестах;)
lilorox
6

Предположим, вы хотите запустить 3 задачи мониторинга сервера (здесь ping localhost), не нужно связываться с файлами конфигурации и сохраненными сеансами. Все это можно сделать из командной строки.

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Jasen
источник
Спасибо за простоту - именно тот пример, который я искал!
DSZ
5

Я считаю, что teamocil очень полезен для автоматизации окон / сессий tmux.

Он написан на Ruby, поэтому вам нужно установить его.

Вот пример конфигурации:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

Вы можете иметь расположение окон и расколов.

Kris
источник
4

Еще одна альтернатива, похожая на teamcoil, - это tmuxinator , она находится в активной разработке и работает довольно хорошо. Также рекомендуется (и отчасти рецензируется) на удивительной tmux: продуктивной разработке без мыши от The Pragmatic Bookshelf .

Пабло Олмос де Агилера С.
источник
Нашел это немного чище, чем teamocil (но, тем не менее, очень похоже), и я использую его прямо сейчас. Я очень доволен тем, как это работает!
Актау
4

**

  • Лучше сохраните свою сессию!

** Я обнаружил, что для такого ленивого администратора, как я, я бы предпочел сохранить сеанс tmux, а не тратить часы на его идеальную сборку. Я администрирую более 30 серверов, и мои сеансы tmux являются динамическими, с постоянно меняющейся конфигурацией. Это была боль в шее, пока я недавно не обнаружил tmux-воскресить, этот плагин просто великолепен. Попробуйте. В настоящее время в репозиториях Ubuntu есть tmux 1.8, этому плагину требуется 1.9, поэтому вам нужно будет обновить его вручную

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

После чего вы можете установить его по

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

Затем добавьте эту строку в конец ~ / .tmux.conf (если ~ / .tmux.conf недоступен, создайте пустой файл)

run-shell ~/clone/path/resurrect.tmux

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

set -g @resurrect-processes ':all:'

Затем перезагрузите среду tmux.

tmux source-file ~/.tmux.conf

Это оно! Вы сделали. Теперь запустите tmux как обычно, измените размеры панелей, создайте новые панели, создайте новые сессии ... и т. Д. Если вы довольны достигнутой конфигурацией (в нескольких окнах и нескольких сеансах), просто нажмите Ctrl + B, затем Ctrl + S, чтобы сохранить сеанс. Чтобы проверить результаты, просто убейте все tmux

killall tmux

Затем снова запустите tmux

tmux

Затем из tmux нажмите Ctrl + B, затем Ctrl + R (для восстановления). Волшебным образом все ваши окна, панели и сеансы восстанавливаются с одинаковой геометрией и расположением. Надеюсь, что это поможет.

user1757247
источник