如何设置tmux以便在指定的窗口打开时启动?
答案 0 :(得分:206)
您可以编写一个小shell脚本,使用所需的程序启动tmux。我在shell脚本中有以下内容,我称之为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
答案 1 :(得分:110)
我试图创建一个复杂的窗格网格,不得不一次又一次地处理切换和分割窗格。以下是我的经验:
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
希望将来帮助 if choice_attack_3 == 'A'or choice_attack_3 == 'a':
Demon_attack()
elif choice_attack_3 == 'R' or choice_attack_3 == 'r':
print('You run away!')
time.sleep (2)
battle_start()
爱好者。
答案 2 :(得分:87)
您可以从.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在bar上方运行。焦点将在窗口2(foo / bar),顶部窗格(foo)中。
然后,您可以使用前缀 Shift s
启动首选的tmux会话(在本例中为session1)答案 3 :(得分:48)
使用tmuxinator - 它允许您配置多个会话,并且您可以选择在任何给定时间启动哪个会话。您可以在特定的窗口或窗格中启动命令,并为窗口提供标题。这是一个example use with developing Django applications。
示例配置文件:
# ~/.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。
答案 4 :(得分:16)
看看@ https://github.com/remiprev/teamocil
您可以使用YAML指定您的结构
windows:
- name: sample-window
splits:
- cmd: vim
- cmd:
- ipython
width: 50
- cmd:
height: 25
答案 5 :(得分:15)
:~$ 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
答案 6 :(得分:9)
从我的“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
答案 7 :(得分:9)
首先我接受了来自@jasonwryan的方法但是如果你有超过2个配置,它会让人感到困惑。
所以我创建了一个别名函数:
tmx () {
tmux "$2" source-file "$HOME/.tmux/$1.conf";
}
在~/.tmux/
我有多个会话用于许多用途。例如,我为具有彼此开发环境的不同公司工作。因此,使用上面的别名函数,我只需调用:tmx company1
并加载我需要的配置。
更新:" $ 2"的目的在tmux
命令之后,您可以传递额外的tmux args。
答案 8 :(得分:8)
如果您只想在2个窗格(例如水平)上拆分屏幕,则可以运行此命令(不需要tmux或shell脚本):
tmux new-session \; split-window -h \;
您的屏幕将如下所示:
[ks@localhost ~]$ │[ks@localhost ~]$
│
│
│
│
│
│
│
│
│
│
│
[10] 0:ks@localhost:~* "localhost.localdomain" 19:51 31-янв-16
答案 9 :(得分:4)
这对我有用。使用给定名称创建5个窗口并自动选择home
窗口。
new -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1
答案 10 :(得分:4)
这就是我的方式:
#!/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
名称。然后你就可以从每个地方运行它。
答案 11 :(得分:2)
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 的作者。
答案 12 :(得分:1)
tmuxp支持JSON或YAML会话配置和python API。使用YAML语法创建新会话的简单tmuxp配置文件是:
session_name: 2-pane-vertical
windows:
- window_name: my test window
panes:
- pwd
- pwd
答案 13 :(得分:1)
我已创建this script。它不需要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
答案 14 :(得分:1)
插件tmux-continuum将自动保存您的tmux会话并在下次启动tmux时加载它,应该比这里的一些自定义脚本解决方案更容易设置。
特点:
- 持续保存tmux环境
- 计算机/服务器开启时自动启动tmux
- 启动tmux时自动恢复
要按需保存会话,您可以使用tmux-resurrect插件。运行tmux-resurrect
也需要tmux-continuumtmux-resurrect保存tmux环境中的所有小细节 所以它可以在系统重启后完全恢复(或者当你 感觉就像)。无需配置。你应该感觉像你一样 永远不要退出tmux。
答案 15 :(得分:1)
有一个tmux插件。
系统重启后恢复tmux环境。
Tmux很棒,除非您必须重新启动计算机。您丢失了所有正在运行的程序,工作目录,窗格布局等。有一些有用的管理工具,但随着工作流程的发展或您开始新项目,它们需要初始配置和持续更新。
tmux-resurrect保存tmux环境中的所有小细节,以便在系统重新启动后(或者在您想要的时候)完全恢复。无需配置。你应该觉得自己永远不会退出tmux。
特点:
- 持续保存tmux环境
- 计算机/服务器开启时自动启动tmux
- 启动tmux时自动恢复
答案 16 :(得分:1)
尝试bro,它是项目的引导程序。
它提供了易于与tmux
进行交互的api。
它看起来像这样:
#!/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>
答案 17 :(得分:1)
此脚本以名称“ e”和三个窗口开始会话
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go
d = {'Scenario': [1, 2, 3, 1, 2,3],
'Type': ["A", "A", "A", "B", "B", "B"],
'VAL_1': [100, 200, 300, 400 , 500, 600],
'VAL_2': [1000, 2000, 3000, 4000, 5000, 6000]}
df = pd.DataFrame(data=d)
def quick_plot(df):
fig = px.bar(df, y='VAL_1', x='Scenario', color="Type", barmode='group')
fig['layout'].update(title = "PX Plot",
width = 600, height = 400,
xaxis = dict(showgrid=False))
fig.show()
def full_plot(df):
colors = {'A': 'blue',
'B': 'red'}
s0=df.query('Type=="A"')
s1=df.query('Type=="B"')
fig = go.Figure()
fig.add_trace(go.Bar(
name='A',
y=s0['VAL_1'],x=s0['Scenario'], marker={'color': colors['A']}))
fig.add_trace(go.Bar(
name='B',
y=s1['VAL_1'],x=s1['Scenario'], marker={'color': colors['B']}))
fig['layout'].update(title = "Full Plot",
width = 600, height = 400)
fig.update_layout(barmode='group')
fig.show()
quick_plot(df)
full_plot(df)
答案 18 :(得分:1)
您应该在tmux配置文件(~/.tmux.conf
)中指定它,例如:
new mocp
neww mutt
new -d
neww
neww
(打开一个会话,其中包含2个窗口,其中mocp在第一个启动,mutt在第二个启动,另一个分离会话包含3个空窗口。)
答案 19 :(得分: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
的会话),或者使用该设置创建一个新会话。
答案 20 :(得分:0)
创建新会话时,可以使用tmux hooks执行命令。具体来说,这是使用session-created
钩实现的。
例如,要在右下方运行htop的情况下以三种方式拆分屏幕,可以将以下行添加到~/.tmux.conf
文件中:
set-hook -g session-created 'split -h ; split -v top'
此方法的优点是您不必以任何特殊方式(例如,shell脚本或别名)运行tmux即可获得所需的结果。您也可以将其与this other answer中所述的tmux new-session -A -s mysession
结合使用,以使hook命令仅在首次创建会话时运行,而不在后续附件上运行。
d15d54c2c于2016年添加了此功能。包含此功能的第一个版本是2.4。