Як змусити tmux відкрити набір панелей, не вводячи їх вручну?


30

Отже, я хочу зробити конкретний для tmuxсеансу проект, який автоматично спливає певні команди на певних панелях. Після онлайн-підручника та tmuxсторінки man, ось що я придумав для файлу конфігурації:

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в якості спрощеної команди заповнення місця, і ви насправді маєте намір породити якийсь тип інтерактивної команди у ваших windows / панелях, то, ймовірно, вам слід просто породити команду, яку ви планували врешті запустити. Якщо ваша цільова команда займає надто багато часу для запуску , щоб використовувати його під час tmux тестування, а потім замінити оболонку або інші просту інтерактивну команду (наприклад top, sqlite3і т.д.).

new-session Чи є командою за замовчуванням

По-друге, запуск tmux без аргументу команди (наприклад tmux) еквівалентно використанню new-sessionкоманди (тобто tmuxте саме, що tmux new-session). Ви .tmux.confстворюєте сеанс для своїх windows / панелей ( newце псевдонім для new-session), а інший сеанс створюється для неявної new-sessionкоманди, визначеної запускаючи tmux без аргументу команди. Якщо ви використовуєте рядок стану за замовчуванням, ви побачите a [1]в лівій частині рядка стану, коли ви перебуваєте на "додатковому" сеансі (початковий сеанс, створений у .tmux.confномері 0).

Якщо ви хочете уникнути створення зайвого сеансу, тоді використовуйте tmux attachзамість простого tmux. Команди з вашого .tmux.confзапускаються, створюючи сеанс 0, а потім ваш клієнт приєднається до цього сеансу замість створення нового.


2
Гаразд, я, можливо, тут товстий, як бутерброд з китами, але зараз у мене є файл конфігурації, який має лише splitwв ньому - нічого іншого - і я все одно не отримую розділений екран, тому що це говорить не вдається встановити поточний сеанс. Якщо додати newдо цього, я отримаю ... одне вікно, одну панель. Я не можу здатися, що за життя я отримаю дві панелі при запуску.
ДАЙТЕ МОЕ правильне ДУМКА

1
Конфігураційний файл з new, потім splitwпрацює для мене, коли я запускаю tmux via 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.
Джон Шмітт

1
Просто невеликий коментар, ви можете замінити "! -z 'з' -n 'у ваших тестах;)
lilorox

6

припустимо, ви хочете запустити 3 завдання моніторингу сервера (тут пінг 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

Дякую за простоту - саме той приклад, який я шукав!
dsz

5

Я знайшов teamocil дуже корисним для автоматизації tmux windows / сесій.

Його написано в Ruby, тому вам потрібно це встановити.

Ось приклад конфігурації:

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

Можна облаштувати вікна та розбивки.


4

Ще одна альтернатива, схожа на teamcoil, - tmuxinator , вона активно працює і працює досить добре. Також рекомендується (і вид рецензування) на дивовижному tmux: Продуктивний розвиток без миші з Прагматичної книжкової полиці .


Виявив, що це трохи більше, ніж teamocil (але дуже схоже), і я зараз його використовую. Я дуже задоволений тим, як це працює!
Актау

4

**

  • Краще збережіть свою сесію!

** Я виявив, що для ледачого адміністратора, як я, я скоріше заощаджую сеанс tmux, а не витрачаючи години на те, щоб його ідеально скласти. Я адмініструю понад 30 серверів, і мої сеанси tmux є динамічними, конфігурація постійно змінюється. Це був біль у шиї, доки я нещодавно не виявив tmux-resurrect цей плагін просто чудовий. Спробувати. В даний час у сховищах 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 (для відновлення) Магічно всі ваші вікна, панелі та сеанси відновлюються з однаковою геометрією та розташуванням. Сподіваюся, що це допоможе.

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