30

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

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

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

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

6 ответов6

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 вместо plain tmux . Команды из вашего .tmux.conf будут выполняться, создавая сессию 0, а затем ваш клиент присоединится к этому сеансу вместо создания нового.

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, чтобы запустить консоль.

5

Предположим, вы хотите запустить 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
5

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

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

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

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

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

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 (для восстановления). Волшебным образом все ваши окна, панели и сеансы восстанавливаются с одинаковой геометрией и расположением. Надеюсь, что это поможет.

4

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .