Как настроить tmux так, чтобы он запускался с указанными открытыми окнами?

Как настроить tmux так, чтобы он запускался с указанными открытыми окнами?

25 ответов

Вы можете написать небольшой скрипт оболочки, который запускает tmux с необходимыми программами. У меня есть следующее в сценарии оболочки, который я называю dev-tmux. Среда разработки:

#!/bin/sh 
tmux new-session -d 'vim'
tmux split-window -v 'ipython'
tmux split-window -h
tmux new-window 'mutt'
tmux -2 attach-session -d 

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

$ dev-tmux 

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

tmux new-session \;

Получает, что вы начали с новой сессии. Чтобы разделить это горизонтальное или вертикальное использование split-window -h или же -v впоследствии вот так:

tmux new-session \; split-window -v \; split-window -h \;

Создает 3 панели, вот так:

------------
|          |
|----------|
|    |     |
------------

Чтобы запустить команды в этих панелях, просто добавьте их с помощью send-keys 'my-command' командование и C-m который выполняет это:

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; 

И итоговая сессия должна выглядеть так.

------------
|  tail    |
|----------|
|    | top |
------------

Теперь я попытался снова разделить нижнюю левую панель, поэтому переключаемся обратно, используя last-paneили в более сложных окнах, с select-pane -t 1 где 1 номер панели в порядке, начиная с 0,

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

Делает это. Зная, как разбираться с split-window а также select-pane это все, что тебе нужно. Это также удобно, чтобы пройти с -p 75 размер панели в процентах, созданный split-window иметь больший контроль над размером панелей.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v -p 75 \; \
  split-window -h -p 30 \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

В результате сеанс выглядит так

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------

надеюсь, это поможет tmux энтузиастов в будущем.

Вы можете получить различные сессии из вашего .tmux.conf вот так:

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2

А затем отформатируйте сессии, как вам требуется:

#session1
new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

Это откроет 2 окна, второе из которых будет называться foo/bar и будет разделено вертикально пополам (50%), при этом foo будет работать над баром. Фокус будет в окне 2 (foo/bar), на верхней панели (foo).

Затем вы можете начать предпочитаемый сеанс tmux (в данном случае session1) с помощью PrefixShifts

Используйте tmuxinator - он позволяет вам настроить несколько сессий, и вы можете выбрать, какой из них запускать в любой момент времени. Вы можете запускать команды в определенных окнах или панелях и назначать заголовки окнам. Вот пример использования с разработкой приложений Django.

Пример файла конфигурации:

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

Смотрите README по ссылке выше для полного объяснения.

:~$ tmux new-session "tmux source-file ~/session1"  

сессии1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  

создать псевдоним в.bashrc

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  

Посмотрите @ https://github.com/remiprev/teamocil

Вы можете указать свою структуру, используя YAML

windows:
  - name: sample-window
    splits:
      - cmd: vim
      - cmd:
        - ipython
        width: 50
      - cmd:
        height: 25

Этот сценарий запускает сеанс с именем "e" и тремя окнами.

#!/bin/sh 
tmux new-session -s e   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t e:1 -n home   'cd ~; bash -i'
tmux new-window  -t e:2 -n log   'cd /var/log; bash -i'

tmux select-window -t e:1
tmux -2 attach-session -t e

Из моего скрипта "get.all", который я вызываю каждое утро для запуска нескольких последующих заданий "get.XXX", чтобы обновить программное обеспечение, которое я отслеживаю. Некоторые из них автоматически выходят из игры. Другим требуется больше взаимодействия после завершения get (например, запрос на сборку emacs).

#!/bin/sh
tmux att -t get ||
tmux \
  new -s get -n capp \; \
  send-keys 'get.capp' C-m \; \
  neww -n emacs \; \
  send-keys 'get.emacs' C-m \; \
  neww -n git \; \
  send-keys 'get.git' C-m \; \
  neww -n mini \; \
  send-keys 'get.mini' C-m \; \
  neww -n port \; \
  send-keys 'get.port' C-m \; \
  neww -n rakudo \; \
  send-keys 'get.rakudo' C-m \; \
  neww -n neil \; \
  send-keys 'get.neil && get.neil2 && exit' C-m \; \
  neww -n red \; \
  send-keys 'get.red && exit' C-m \; \
  neww -n cpan \; \
  send-keys 'get.cpan && exit' C-m \; \
  selectw -t emacs

Если вы просто хотите разделить экран на 2 панели (скажем, по горизонтали), вы можете запустить эту команду (не требуются сценарии tmux или shell):

tmux new-session \; split-window -h \;

Ваш экран будет выглядеть так:

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16

Сначала у меня был подход от @jasonwryan, но если у вас более 2 конфигов, это может сбить с толку.

Итак, я создал функцию псевдонима:

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}

В ~/.tmux/ У меня есть несколько сессий для многих целей. Например, я работаю в разных компаниях, в которых есть среда разработки. Так что с функцией псевдонима выше я могу просто вызвать: tmx company1 и загрузите нужный мне конфиг.

Обновление: цель "$2" после tmux команда в том, что вы можете передать дополнительные аргументы tmux.

И вот как я это делаю:

#!/bin/bash

function has-session {
  tmux has-session -t name_of_my_session 2>/dev/null
}

if has-session ; then
  echo "Session already exists"
else
  cd /path/to/my/project
  tmux new-session -d -s name_of_my_session 'vim'
  tmux split-window -h -p 40 start_web_server
  tmux split-window -v
  tmux attach-session -d -t name_of_my_session
fi

У меня есть один файл для каждого моего проекта. Также вы можете сгруппировать их, чтобы иметь некоторые для работы, некоторые для хобби проектов.

Также вы можете переместить его в ~/bin папку, добавьте ее в PATH и дать tmux_my_awesome_project название. Тогда вы сможете запустить его из каждого места.

Вы можете использовать tmux-хуки для выполнения команд при создании нового сеанса. В частности, это достигается с помощьюsession-created крючок.

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

set-hook -g session-created 'split -h ; split -v top'

Преимущество этого метода в том, что вам не нужно запускать tmux каким-либо особым образом (например, сценарием оболочки или псевдонимом) для получения желаемого результата. Вы также можете комбинировать это сtmux new-session -A -s mysessionописано в этом другом ответе, так что команды ловушки запускаются только при первом создании сеанса, а не при последующих вложениях.

Эта функция была добавлена d15d54c2c еще в 2016 году. Первый выпуск, который включает ее, - это 2.4.

Попробуйте, братан, это проект начальной загрузки.

Это обеспечивает легкий API для взаимодействия с tmux,

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

#!/bin/sh
# @ project_name/tasks/init.sh
structure project_name
  window editor
    run 'vim'
  window terminal
    run 'echo happy coding ...'
focus editor
connect project_name

Для запуска проекта достаточно выполнить следующую команду -

bro start <project_name>

Для этого есть плагин tmux.

Проверьте tmux-воскресить

Восстановите среду tmux после перезагрузки системы.

Tmux отлично, за исключением случаев, когда вам нужно перезагрузить компьютер. Вы теряете все работающие программы, рабочие каталоги, макеты панелей и т. Д. Существуют полезные инструменты управления, но они требуют начальной настройки и постоянных обновлений по мере развития вашего рабочего процесса или запуска новых проектов.

tmux-resurrect сохраняет все мелкие детали из вашей среды tmux, чтобы их можно было полностью восстановить после перезагрузки системы (или когда вы захотите). Конфигурация не требуется. Вы должны чувствовать, что никогда не выходите из Tmux.

Или tmux-континуум

Особенности:

  • постоянное сохранение среды tmux
  • автоматический запуск tmux при включении компьютера / сервера
  • автоматическое восстановление при запуске tmux

Это работает для меня. Создание 5 окон с заданными именами и автоматический выбор home окно.

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1

smux.py позволяет просто перечислить нужные команды на каждой панели с префиксом строки, содержащей три дефиса.

Вот пример файла smux, который запускает три панели.

      ---
echo "This is pane 1."
---
cd /tmp
git clone https://github.com/hq6/smux
cd smux
less smux.py
---
man tmux

Если вы поместите это в файл с именем Sample.smux, вы можете запустить следующее:

      pip3 install smux.py
smux.py Sample.smux

Полный отказ от ответственности: я являюсь автором smux.py.

Плагин tmux-континуум автоматически сохранит ваш сеанс tmux и загрузит его при следующем запуске tmux, его будет проще в настройке, чем некоторые из пользовательских скриптовых решений.

Особенности:

  • постоянное сохранение среды tmux
  • автоматический запуск tmux при включении компьютера / сервера
  • автоматическое восстановление при запуске tmux

Чтобы сохранить сеанс по требованию, вы можете использовать плагин tmux-resurrect. tmux-resurrect также требуется для запуска tmux-континуума

tmux-resurrect сохраняет все мелкие детали из вашей среды tmux, чтобы их можно было полностью восстановить после перезагрузки системы (или когда вы захотите). Конфигурация не требуется. Вы должны чувствовать, что никогда не выходите из Tmux.

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

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

Для моего проекта под названиемjohndoe, я создаю файл, который по сути является скриптом bash, где-то в моих конфигах (~/.config/tmux/tmux-sessions/johndoe.conf).

Этот файл прост в обслуживании, потому что в нем нет множества\везде, как я видел в других ответах:

      # Create a new session named johndoe, with a first window named Main 
# at the specified starting path.
# The -d is for detached mode, which allows me to continue defining the rest of the session 
# before attaching to it. Without -d, tmux would open the client right away and
# ignore the rest of the session definition
tmux new -d -s johndoe -n 'Main' -c ~/dev/own/johndoe
# Simulate the user entering some docker command in the first window available 
# in the target session named (-t) johndoe
tmux send -t johndoe 'docker compose up -d' Enter

# Create a new window in the target session, with the title 'UI run'
tmux neww -t pers -n 'UI run' -c ~/dev/own/johndoe/front-end
# Simulate user entering a command to the first pane
tmux send -t pers:'UI run.0' 'git status --short' Enter 
# Split this window horizontally
tmux split-window -t pers:'UI run' -h -c ~/dev/own/johndoe/front-end
# Simulate user entering a command to the second pane in this window
tmux send -t pers:'UI run.1' 'npm run dev' Enter 

tmux neww -t johndoe -n 'API run' -c ~/dev/own/johndoe/back-end/Api
tmux send -t johndoe:'API run' 'dotnet run --no-build' Enter

# Focus the first window
tmux select-window -t johndoe:'Main'
# Attach the current terminal to the only session available 
# (you might want to add "-t johndoe" here if you need several sessions running in parallel)
tmux a -d
  1. Я создаю псевдоним bash/zsh для получения этой конфигурации сеанса:
      alias tmuxjohndoe='. ~/.config/tmux/tmux-sessions/johndoe.conf'
  1. Я трачу достаточное количество времени на отладку, выясняя, что мне нужно предоставить разрешения на выполнениеjohndoe.confфайл :-)

  2. Теперь из любого места я просто бегуtmuxjohndoe!

Поддержка tmuxp конфигурации JSON или YAML и API Python. Простой файл конфигурации tmuxp для создания нового сеанса в синтаксисе YAML:

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd

Чтобы просто открыть tmux с несколькими панелями и выполнить некоторые команды, я создал следующий файл bash:

      #!/bin/bash
tmux split-window -v -p 30 -c ~/path/to/folder1
tmux split-window -h -p 66 -c ~/path/to/folder2
tmux split-window -h -p 50 'mongod'

Запустите файл bash, чтобы получить следующее:

      -----------------------------------
|                                 |
|---------------------------------|
|  folder1  | folder2  |  mongod  |
-----------------------------------

Я создал этот скрипт. Для этого не нужен tmuxinator, ruby ​​или другие. Это просто bash-скрипт, настраиваемый:

Файл с именем config должен содержать что-то вроде этого:

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

и код bash должен быть:

#!/bin/bash

if [ -r config ]; then
    echo ""
    echo "Loading custom file"
    . config
else
    . config.dist
fi

tmux start-server

window=0
windownumber=-1

for i in "${combo[@]}"; do

    if [ $((window%2)) == 0 ]; then
        name=${i}
        ((windownumber++))
    else
        command=${i}
    fi

    if [ ${combo[0]} == "${i}" ]; then
        tmux new-session -d -s StarTmux -n "${name}"
    else
        if [ $((window%2)) == 0 ]; then
            tmux new-window -tStarTmux:$windownumber -n "${name}"
        fi
    fi

    if [ $((window%2)) == 1 ]; then
        tmux send-keys -tStarTmux:$windownumber "${command}" C-m
    fi

    ((window++))
done

tmux select-window -tStarTmux:0
tmux attach-session -d -tStarTmux

Я просто попытался использовать все идеи на этой странице, и мне не понравилась ни одна из них. Я просто хотел решение, которое запустило tmux с определенным набором окон, когда мой терминал открылся. Я также хотел, чтобы он был идемпотентным, то есть открытие нового терминального окна перенесет сеанс tmux из предыдущего.

Вышеуказанные решения часто имеют тенденцию открывать несколько сеансов tmux, и я хочу только один. Во-первых, я добавил это в свой ~/.bash_profile:

tmux start-server
if [[ -z "$TMUX" ]]
then
  exec tmux attach -d -t default
fi

Затем я добавил следующее к моему ~/.tmux.conf:

new -s default -n emacs /usr/local/bin/emacs
neww -n shell /usr/local/bin/bash
neww -n shell /usr/local/bin/bash
selectw -t 1

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

Вы должны указать это в вашем конфигурационном файле tmux (~/.tmux.conf), например:

new mocp
neww mutt

new -d
neww
neww

(открывает один сеанс с двумя окнами, в первом из которых запускается mocp, а во втором - mutt, и другой отдельный сеанс с тремя пустыми окнами).

Из ответа user1260906 user11107541 по адресу /questions/10121999/kak-nastroit-tmux-tak-chtobyi-on-zapuskalsya-s-ukazannyimi-otkryityimi-oknami/10122064#10122064 . Я провел несколько тестов, чтобы получить то, что хотел: создайте окна, как если бы я сделал это вручную с помощью Cb c, и после закрытия программы, вернитесь в bash (окно не закрывайте). Из ответа user22483 /questions/10121999/kak-nastroit-tmux-tak-chtobyi-on-zapuskalsya-s-ukazannyimi-otkryityimi-oknami/10122073#10122073 Я провел несколько тестов, чтобы перейти к первому окну.

      #!/bin/sh

# tmux new-session \; \
#  send-keys 'tail -f /var/log/monitor.log' C-m \; \
#  split-window -v -p 75 \; \
#  split-window -h -p 30 \; \
#  send-keys 'top' C-m \; \
#  select-pane -t 1 \; \
#  split-window -v \; \
#  send-keys 'weechat' C-m \;

tmux new-session -n top \; \
  send-keys 'top' C-m \; \
  new-window -n firefox \; \
  send-keys 'firefox' C-m \; \
  new-window -n 'weechat' \; \
  send-keys 'sleep 2s ; weechat' C-m \; \
  selectw -t 0

Используйте следующий пример:

      #!/bin/bash

# Create a new TMUX session named "my_session" with a single window
tmux new-session -d -s my_session -n my_window

# Split the window horizontally into two panes
tmux split-window -h

# Split the second pane vertically into two additional panes
tmux select-pane -t 1
tmux split-window -v

# Rename the panes for easier identification
tmux select-pane -t 0
tmux rename-pane "Main"
tmux select-pane -t 1
tmux rename-pane "Left"
tmux select-pane -t 2
tmux rename-pane "Right Top"
tmux select-pane -t 3
tmux rename-pane "Right Bottom"

# Attach to the new session with the desired pane configuration
tmux attach-session -t my_session

Другие вопросы по тегам