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


Ответы:


258

Вы можете написать небольшой скрипт оболочки, который запускает 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

4
Спасибо! Мне пришлось сделать какое-то ужасное побег, чтобы заставить его работать вместе с bash --rcfileкрасивой оболочкой для научного Linux с включенной конкретной версией devtools. Оставим это здесь, если кто-то попытается сделать то же самое. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen

1
Я думаю, что вторая строка должна быть изменена, ей нужна опция -s перед 'vim'. Это означает, что "tmux new-session -d 'vim'" должен быть заменен на "tmux new-session -d -s 'vim'"
Ахмад Йусофан

2
@AhmadYoosofan, vimтам обозначает команду, которая должна быть выполнена в первой (и только в то время) панели окна. Если вы вместо этого хотите назвать сессию vim, тогда да, вы правы, вы должны использовать -sфлаг. Весь синтаксис: tmux new-session -d -s SessionName -n WindowName Command
Mitja

обратите внимание: если вы уже начали сеанс tmux (в другом месте), команды могут оказаться в другом сеансе! Ответ @ waqar-lim не имеет этой проблемы.
Haja

174

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

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где where 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энтузиастам в будущем.


2
Изумительный ориентир, не могли бы вы подсказать, как изменить ширину вертикальной панели после разделения.
MinhNV

2
@MinhNV -h -p 30создает горизонтальную панель с 30% доступной высоты; -v -p 75то же самое для вертикали с шириной 75%.
Afr

1
Какова цель \:? Я видел сценарии, работающие с этим и без него.
Кевин Макдоно

2
ОБНОВЛЕНИЕ: \;передает точку с запятой в tmux вместо bash, что позволяет отправлять команды одним вызовом tmux. stackoverflow.com/questions/20913198/…
Кевин Макдоно

96

Вы можете использовать различные сессии из вашего, .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


4
Разве этот сеанс не может быть запущен внутри .tmux.conf без дополнительных файлов?
Ино

2
Один из них мог бы: таким образом, вы можете легко добавить больше индивидуальных сессий - и пара крошечных текстовых файлов вряд ли будут накладными расходами ...
jasonwryan

1
Разве это не было бы вложением сессии? Я имею в виду, что для запуска Prefix Shift Sмне нужно быть в tmux, а поиск вашего файла пытается начать новый сеанс, который tmux не любит и не сделает, если вы не заставите его.
user35915

1
@ user35915 это просто не запустит дочерний сеанс, а отдельный сеанс - на который вы можете переключиться, используя, например, prefix-s или prefix-) и prefix- (
sehe

1
Это должен быть принятый ответ. Однако привязка к s (не к S) переопределит встроенную привязку tmux для перечисления сеансов.
считать0

54

Используйте 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 по ссылке выше для полного объяснения.


2
tmuxinator - в основном именно то, что я искал. Спасибо!
Джастин Форс

3
есть также tmuxp, который довольно похож: github.com/tony/tmuxp
Бен


16
:~$ 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  

~ Что neww? Я не могу найти эту команду нигде. ~ Похоже, что это так new-window, хотя я не могу понять, почему вы используете как длинную, так и короткую форму.
oligofren

11

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

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

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

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

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


1
Комбинируя это с советами @ soc1c, вы сделали очень приятную установку ( github.com/fatso83/dotfiles/commit/35a7ed ). Спасибо!
oligofren

Функция на самом деле не работает, когда нет уже существующего сеанса tmux для подключения (get no server running on /tmp/tmux-1000/default). Вот почему мне нужно было исправить команду tmux new-session. Ссылка github.com/fatso83/dotfiles/commit/…
oligofren

1
Я сделал настройку tmux с помощью systemd. Так что всегда есть сеанс, запущенный после загрузки. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd Извините, что не упомянул об этом.
Данбрюгге

10

Из моего сценария "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

8

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

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

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

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

8

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

#!/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имя. Тогда вы сможете запустить его из каждого места.


4

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

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

3

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

Это обеспечивает легкий 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>

Оформление экрана ниже, оно показывает, как начать работу broи использовать его tmuxAPI.

https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif


2

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

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

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

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

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


2

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

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

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

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

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

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

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

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

2

Вы можете использовать ловушки 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.


1

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

new mocp
neww mutt

new -d
neww
neww

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


1

Я создал этот скрипт . Для этого не нужен 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

Привет sensorario, хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. Пожалуйста, посмотрите здесь: почему и как удаляются некоторые ответы?
Бумми

Замечательно, tmux start_serverно сервер не запускается сам по себе. См. Github.com/tmux/tmux/issues/182
Джек

1

Я просто попытался использовать все идеи на этой странице, и мне не понравилась ни одна из них. Я просто хотел решение, которое запустило 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 start_serverно сервер не запускается сам по себе. См. Github.com/tmux/tmux/issues/182
Джек

1

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

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

0

Этот скрипт запускает сеанс с именем «е» и тремя окнами

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.