Як налаштувати 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\")'"
Лаллен

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 цієї проблеми немає.
хаджа

173

Я намагався створити складну сітку панелей, і мені доводилося стикатися з перемиканням та розбиттям панелей знову і знову. Ось моє навчання:

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ентузіастам у майбутньому.


2
дивовижна настанова, чи можете ви порадити мені, як змінити розмір ширини вертикальної панелі після розколу.
MinhNV

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

1
Яка мета роботи \:? Я бачив, як сценарії працюють з цим і без нього.
Кевін МакДонаф

2
UPDATE: \;передає крапку з комою до 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 не любить і не буде робити, якщо ви не змусите його.
користувач35915

1
@ user35915 він просто не почне дочірнє сеанс, а окремий - на якому можна перейти, використовуючи, наприклад, префікси-s або префікс-) та префікс- (
sehe

1
Це має бути прийнятою відповіддю. Однак прив'язка до s (не S) замінить вбудовану прив'язку tmux для сеансів лістингу.
count0

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
Ben


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, хоча я не можу зрозуміти, чому ви використовуєте і довгу, і коротку форму.
олігофрен

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 ). Дякую!
олігофрен

Функція насправді не працює, коли вже не існує сеансу 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 Вибачте, що не згадуєте про це.
danbruegge

10

З мого сценарію "get.all", який я щоранку закликаю запускати купу наступних завдань "get.XXX", щоб оновити програмне забезпечення, яке я відстежую. Деякі з них автоматично припиняють роботу. Інші потребують більшої взаємодії після завершення отримання (наприклад, прохання створити 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 або оболонки):

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

Спробуйте, брато , це завантажувач проекту.

Він забезпечує простий апіс для взаємодії 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використанням програми tmux.

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


2

Для цього існує плагін tmux.

Перевірте tmux-resurrect

Відновлення середовища tmux після перезавантаження системи.

Tmux чудовий, за винятком випадків, коли вам доведеться перезавантажити комп'ютер. Ви втрачаєте всі запущені програми, робочі каталоги, макети панелей тощо. Там є корисні інструменти управління, але вони вимагають початкової конфігурації та постійного оновлення у міру розвитку робочого процесу або запуску нових проектів.

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

Або tmux-континуум

Особливості:

  • постійне збереження середовища tmux
  • автоматичний запуск tmux при включенні комп'ютера / сервера
  • автоматичне відновлення при запуску tmux

1

Ви повинні вказати його у своєму файлі config tmux ( ~/.tmux.conf), наприклад:

new mocp
neww mutt

new -d
neww
neww

(відкриває один сеанс з 2 вікнами з mocp, запущеним у першому та mutt у другому, та іншим окремим сеансом з 3 порожніми вікнами).


1

Я створив цей сценарій . Тут не потрібен tmuxinator, рубін чи інші. Це просто баш сценарій, який можна налаштувати:

Файл з іменем 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, хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідок. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. Будь ласка, подивіться тут: Чому і як видаляються відповіді?
буммі

Nb дивно, tmux start_serverне запускає сервер самостійно. Дивіться github.com/tmux/tmux/isissue/182
Джек Уейсі

1

tmuxp підтримує конфігурацію сеансу JSON або YAML та API python. Простий файл конфігурації tmuxp для створення нового сеансу в синтаксисі YAML:

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

1

Плагін tmux-континуум автоматично збереже ваш tmux сеанс і завантажить його наступного разу, коли tmux запуститься, має бути простішим у налаштуванні, ніж деякі звичайні рішення скриптів тут.

Особливості:

  • постійне збереження середовища tmux
  • автоматичний запуск tmux при включенні комп'ютера / сервера
  • автоматичне відновлення при запуску tmux

Щоб зберегти сеанс на вимогу, ви можете використовувати плагін tmux-resurrect . tmux-resurrect також потрібен для запуску tmux-континууму

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


1

Ви можете використовувати гачки 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.


0

Я просто спробував використати всі ідеї на цій сторінці, і жодна з них мені не сподобалась. Я просто хотів рішення, яке запустило 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/isissue/182
Джек Уейсі

0

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