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

43539
JUST MY correct OPINION

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

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

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

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

30

6 ответов на вопрос

36
Chris Johnsen

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

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

Во-первых, команды, которые вы запускаете (экземпляры 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, а затем ваш клиент присоединится к этому сеансу вместо создания нового.

Ладно, я, может быть, такой же толстый, как китовый сэндвич, но сейчас у меня есть файл конфигурации, в котором есть только `splitw '- больше ничего - и я до сих пор не получаю разделенный экран, потому что он говорит, что не может установить текущий сеанс. Если я добавлю `new` перед этим, я получу ... одно окно, одну панель. Я не могу себе представить, чтобы за всю жизнь получить две панели при запуске. JUST MY correct OPINION 14 лет назад 2
Файл конфигурации с `new`, затем` splitw` работает для меня, когда я запускаю * tmux * через `tmux attach`. Следует помнить одну вещь: `.tmux.conf` (или файл, указанный с помощью опции` -f`) используется только в том случае, если сервер еще не запущен. Проверьте, работает ли сервер через `tmux ls`. Если вы хотите запускать команды из файла, когда сервер уже запущен, сделайте это следующим образом: `tmux source-file / path / to / conf-file-that-create-a-session-and-windows \; attach` (если вы запускаете его при отсутствии сервера, ваш `.tmux.conf` (или файл` -f`) будет запускаться первым, а затем файл `source-file`). Chris Johnsen 14 лет назад 1
Конфигурационный файл указывается с -f - поэтому я собираюсь `tmux new -f myconfig`. Содержимое этого файла конфигурации содержит ** только ** `new`, за которым следует` splitw`. Я убиваю все процессы tmux до того, как попробую командную строку `tmux -f myconfig`. Я не получаю две панели. Я действительно в недоумении, что делать после этого (кроме того, чтобы просто отказаться от tmux). JUST MY correct OPINION 14 лет назад 0
@Just: используете ли вы `-f` или нет,` tmux` без аргумента команды аналогичен `tmux new-session` (который для новых серверов создаст новый сеанс поверх того, что делает ваш файл конфигурации) ). Ваше предварительно разделенное окно создается в сеансе 0, но неявная команда `new-session` создает (и присоединяется к) дополнительный сеанс (сеанс 1; ищите` [1] `в строке состояния). Используйте `tmux -f myconfig attach`, чтобы избежать создания нового сеанса, который скрывает ваше предварительно разделенное окно. Chris Johnsen 14 лет назад 4
Хорошо, я думаю, что обучение чтению в конечном итоге окупится за меня. :) Спасибо за усилия и ответ. Теперь все работает нормально. Хотелось бы, чтобы здесь была репутация «опрокидывающейся банки», чтобы я мог дать вам больше, чем просто принятый ответ. JUST MY correct OPINION 14 лет назад 1
"Толстый как китовый бутерброд" +1 chiggsy 14 лет назад 0
Боже мой, как за этот ответ не проголосовали? +1 chiggsy 13 лет назад 0
Панель респавна уже присутствует в моем доморощенном tmux 1.5 Wojtek Kruszewski 12 лет назад 0
9
John Schmitt

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

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 "$"; tmux new-session -d -s "$SESSION_NAME" ) tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter ( cd "$"; 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, чтобы запустить консоль.

Кажется, konsole не работает, поэтому я переключился на [Terminal] (http://www.xfce.org/projects/terminal/), который работает хорошо. У меня есть более подробный [post] (http://sourceforge.net/mailarchive/message.php?msg_id=29900965) список рассылки пользователей tmux. John Schmitt 12 лет назад 0
Просто небольшой комментарий, вы можете заменить '! -z 'с' -n 'в ваших тестах;) lilorox 6 лет назад 1
5
Kris

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

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

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

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

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

5
Jasen

Предположим, вы хотите запустить 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 
Спасибо за простоту - именно тот пример, который я искал! dsz 9 лет назад 0
4
Pablo Olmos de Aguilera C.

Another alternative similar to teamcoil is tmuxinator, it's on active development and works quite well. It's also recommended (and kind of reviewed) on the amazing tmux: Productive Mouse-Free Development from The Pragmatic Bookshelf.

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

**

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

** Я обнаружил, что для такого ленивого администратора, как я, я бы предпочел сохранить сеанс 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 

That's it! You are done. Now, run tmux as normal, resize your panes, create new panes, create new sessions...etc. When you are happy with the configuration you reached ( in several windows and several sessions), just click ctrl+b then ctrl+s to save the session. In order to test the results, just kill all tmux

killall tmux 

Then, run again tmux

tmux 

Then, from within tmux click ctrl+b then ctrl+r (for restore) Magically, all your windows, panes, and sessions are restored with the same geometry and arrangement. Hope that this would help.