如何设置 tmux 以使其在打开指定窗口的情况下启动?
22 回答
您可以编写一个小的 shell 脚本来启动带有所需程序的 tmux。我在名为 dev-tmux 的 shell 脚本中有以下内容。开发环境:
#!/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 在 bar 上方运行。焦点将在窗口 2 (foo/bar) 的顶部窗格 (foo) 中。
然后,您可以使用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
从我的“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
首先我有来自@jasonwryan的方法,但如果你有超过 2 个配置,它可能会让人感到困惑。
所以我创建了一个别名函数:
tmx () {
tmux "$2" source-file "$HOME/.tmux/$1.conf";
}
在~/.tmux/
我有许多用途的多个会话。例如,我为拥有不同开发环境的不同公司工作。因此,使用上面的别名函数,我可以简单地调用:tmx company1
并加载我需要的配置。
更新:命令后“$2”的目的tmux
是,您可以传递额外的 tmux 参数。
此脚本启动一个名为“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
如果您只想在 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
命名。然后,您将能够从每个地方运行它。
试试bro,它是一个项目引导程序。
它提供了与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-resurrect 保存 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 挂钩执行命令。具体来说,这是使用session-created
钩子实现的。
例如,要在右下角运行 top 以三种方式拆分屏幕,您可以在~/.tmux.conf
文件中添加以下行:
set-hook -g session-created 'split -h ; split -v top'
这种方法的优点是您不必以任何特殊方式(即,shell 脚本或别名)运行 tmux 即可获得所需的结果。您还可以将其与其他答案tmux new-session -A -s mysession
中的描述结合起来,以便挂钩命令仅在您首次创建会话时运行,而不是在后续附件中运行。
此功能由d15d54c2c早在 2016 年添加。包含它的第一个版本是 2.4。
插件tmux-continuum将自动保存您的 tmux 会话并在下次 tmux 启动时加载它,应该比这里的一些自定义脚本解决方案更容易设置。
特征:
- tmux环境的持续保存
- 打开计算机/服务器时自动启动 tmux
- tmux 启动时自动恢复
要按需保存会话,您可以使用tmux-resurrect插件。tmux-resurrect也需要运行tmux-continuum
tmux-resurrect 保存 tmux 环境中的所有小细节,以便在系统重新启动后(或当您喜欢它时)可以完全恢复。无需配置。你应该觉得你永远不会退出 tmux。
为了简单地使用多个窗格打开 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 |
-----------------------------------
tmuxp支持 JSON 或 YAML 会话配置和 python API。用 YAML 语法创建新会话的简单 tmuxp 配置文件是:
session_name: 2-pane-vertical
windows:
- window_name: my test window
panes:
- pwd
- pwd
您应该在 tmux 配置文件 ( ~/.tmux.conf
) 中指定它,例如:
new mocp
neww mutt
new -d
neww
neww
(打开一个带有 2 个窗口的会话,第一个启动 mocp,第二个启动 mutt,另一个带有 3 个空窗口的分离会话)。
我已经创建了这个脚本。它不需要 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
),要么使用该设置创建一个新会话。