Ответы:
Вы можете написать небольшой скрипт оболочки, который запускает 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
vim
там обозначает команду, которая должна быть выполнена в первой (и только в то время) панели окна. Если вы вместо этого хотите назвать сессию vim, тогда да, вы правы, вы должны использовать -s
флаг. Весь синтаксис: tmux new-session -d -s SessionName -n WindowName Command
Я пытался создать сложную сетку панелей, и мне приходилось иметь дело с переключением и разделением панелей снова и снова. Вот мои уроки:
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
энтузиастам в будущем.
-h -p 30
создает горизонтальную панель с 30% доступной высоты; -v -p 75
то же самое для вертикали с шириной 75%.
\:
? Я видел сценарии, работающие с этим и без него.
\;
передает точку с запятой в tmux вместо bash, что позволяет отправлять команды одним вызовом tmux. stackoverflow.com/questions/20913198/…
Вы можете использовать различные сессии из вашего, .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
Prefix Shift S
мне нужно быть в tmux, а поиск вашего файла пытается начать новый сеанс, который tmux не любит и не сделает, если вы не заставите его.
Используйте 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 по ссылке выше для полного объяснения.
посмотрите @ https://github.com/remiprev/teamocil
Вы можете указать свою структуру, используя YAML
windows:
- name: sample-window
splits:
- cmd: vim
- cmd:
- ipython
width: 50
- cmd:
height: 25
:~$ tmux new-session "tmux source-file ~/session1"
neww
split-window -v 'ipython'
split-window -h
new-window 'mutt'
:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc
:~$ . ~/.bashrc
:~$ tmux_s1
neww
? Я не могу найти эту команду нигде. ~ Похоже, что это так new-window
, хотя я не могу понять, почему вы используете как длинную, так и короткую форму.
Сначала у меня был подход от @jasonwryan, но если у вас более 2 конфигов, это может сбить с толку.
Итак, я создал функцию псевдонима:
tmx () {
tmux "$2" source-file "$HOME/.tmux/$1.conf";
}
У ~/.tmux/
меня есть несколько сессий для многих целей. Например, я работаю в разных компаниях, в которых есть среда разработки. Так что с помощью функции псевдонима выше я могу просто позвонить: tmx company1
и загрузить нужный мне конфиг.
Обновление: цель "$ 2" после tmux
команды в том, что вы можете передать дополнительные аргументы tmux.
no server running on /tmp/tmux-1000/default
). Вот почему мне нужно было исправить команду tmux new-session
. Ссылка github.com/fatso83/dotfiles/commit/…
Из моего сценария "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
И вот как я это делаю:
#!/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
имя. Тогда вы сможете запустить его из каждого места.
Попробуй братан , это проект начальной загрузки.
Это обеспечивает легкий 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
и использовать его tmux
API.
https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif
Плагин tmux-континуум автоматически сохранит ваш сеанс tmux и загрузит его при следующем запуске tmux, его будет проще настроить, чем некоторые из пользовательских скриптовых решений.
Особенности:
- постоянное сохранение среды tmux
- автоматический запуск tmux при включении компьютера / сервера
- автоматическое восстановление при запуске tmux
Чтобы сохранить сеанс по требованию, вы можете использовать плагин tmux-resurrect . tmux-resurrect также требуется для запуска tmux-континуума
tmux-resurrect сохраняет все мелкие детали из вашей среды tmux, чтобы его можно было полностью восстановить после перезагрузки системы (или когда вы захотите). Конфигурация не требуется. Вы должны чувствовать, что никогда не выходите из Tmux.
Для этого есть плагин tmux.
Проверьте tmux-воскресить
Восстановите среду tmux после перезагрузки системы.
Tmux отлично, кроме случаев, когда вам нужно перезагрузить компьютер. Вы теряете все работающие программы, рабочие каталоги, макеты панелей и т. Д. Существуют полезные инструменты управления, но они требуют начальной конфигурации и постоянных обновлений по мере развития вашего рабочего процесса или запуска новых проектов.
tmux-resurrect сохраняет все мелкие детали из вашей среды tmux, чтобы его можно было полностью восстановить после перезагрузки системы (или когда вы захотите). Конфигурация не требуется. Вы должны чувствовать, что никогда не выходите из Tmux.
Или tmux-континуум
Особенности:
- постоянное сохранение среды tmux
- автоматический запуск tmux при включении компьютера / сервера
- автоматическое восстановление при запуске tmux
Вы можете использовать ловушки 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.
Вы должны указать это в вашем конфигурационном файле tmux ( ~/.tmux.conf
), например:
new mocp
neww mutt
new -d
neww
neww
(открывается один сеанс с двумя окнами, в первом запущен mocp, а во втором - mutt, а другой отдельный сеанс с тремя пустыми окнами).
Я создал этот скрипт . Для этого не нужен 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 start_server
но сервер не запускается сам по себе. См. Github.com/tmux/tmux/issues/182
Я просто попытался использовать все идеи на этой странице, и мне не понравилась ни одна из них. Я просто хотел решение, которое запустило 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
Поддержка tmuxp конфигурации JSON или YAML и API Python. Простой файл конфигурации tmuxp для создания нового сеанса в синтаксисе YAML:
session_name: 2-pane-vertical
windows:
- window_name: my test window
panes:
- pwd
- pwd
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\")'"