如何设置tmux在启动时打开指定的窗口?

我如何设置tmux,使它启动与指定的窗口打开?

245456 次浏览

你应该在你的tmux配置文件(~/.tmux.conf)中指定它,例如:

new mocp
neww mutt


new -d
neww
neww

(打开一个会话,2个窗口,第一个启动mocp,第二个启动mutt,另一个分离会话,3个空窗口)。

您可以编写一个小型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.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)。

然后,您可以使用前缀转变年代启动首选的tmux会话(在本例中为session1)

看一看@ https://github.com/remiprev/teamocil

你可以使用YAML指定你的结构

windows:
- name: sample-window
splits:
- cmd: vim
- cmd:
- ipython
width: 50
- cmd:
height: 25

从我的“得到”。脚本,我每天早上都会调用它来运行一堆后续的“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

使用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"

session1

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

这对我很有用。创建5个具有给定名称的窗口并自动选择home窗口。

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 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

我试着用了这一页上的所有想法,但没有一个我喜欢。我只是想要一个解决方案,当我的终端打开时,用一组特定的窗口启动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的会话),要么用该设置创建一个新会话。

tmuxp支持JSON或YAML会话配置和python API。一个用YAML语法创建新会话的简单tmuxp配置文件是:

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

如果你只是想把屏幕分成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命名。然后你就可以在每个地方运行它了。

我试图创建一个复杂的窗格网格,不得不一遍又一遍地处理切换和分割窗格。以下是我的体会:

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-windowselect-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爱好者有所帮助。

首先,我从@jasonwryan的方法,但如果你有超过2个配置,它会让人困惑。

所以我创建了一个别名函数:

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

~/.tmux/中,我有多个会话用于许多用途。例如,我在不同的公司工作,他们拥有彼此的开发环境。因此,使用上面的别名函数,我可以简单地调用:tmx company1并加载我需要的配置。

更新: tmux命令后面的"$2"的目的是,你可以传递额外的tmux参数。

插件tmux-continuum将自动保存您的tmux会话,并在下次tmux启动时加载它,应该比这里的一些自定义脚本解决方案更容易设置。

特点:

  • 持续节约tmux环境
  • 当计算机/服务器打开时自动启动tmux
  • tmux启动时自动恢复

要按需保存会话,可以使用tmux-resurrect插件。tmux-resurrect也需要运行tmux-continuum

tmux- resurrection保存tmux环境中的所有小细节 因此,它可以在系统重新启动后(或当您重新启动时)完全恢复 感觉像这样)。无需配置。你应该感觉像你自己

.

.

有一个tmux插件。

查看tmux-resurrect

重启系统后恢复tmux环境。

Tmux很棒,除了必须重新启动计算机的时候。你会丢失所有正在运行的程序、工作目录、窗格布局等。有一些有用的管理工具,但它们需要初始配置,并随着工作流程的发展或开始新项目而不断更新。

tmux- resurrection保存tmux环境中的所有小细节,以便在系统重新启动后(或者当您需要时)可以完全恢复。无需配置。你应该觉得自己从未放弃过tmux。

tmux-continuum

特点:

  • 持续节约tmux环境
  • 当计算机/服务器打开时自动启动tmux
  • tmux启动时自动恢复

尝试兄弟,它是一个项目引导器。

它提供了与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>

检查下面的截屏,它展示了如何从bro开始并使用它的tmux api。

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

创建新会话时,可以使用tmux钩子来执行命令。具体来说,这是使用session-created钩子实现的。

例如,要将屏幕分成三部分,顶部在右下角运行,你可以在~/.tmux.conf文件中添加以下行:

set-hook -g session-created 'split -h ; split -v top'

这种方法的优点是,您不必以任何特殊的方式(即shell脚本或别名)运行tmux来获得所需的结果。你也可以将它与另一个答案中描述的tmux new-session -A -s mysession结合起来,这样钩子命令只在你第一次创建会话时运行,而不是在后续的附件上运行。

这个特性是由d15d54c2c在2016年添加的。包含它的第一个发行版是2.4。

这个脚本启动一个名为“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

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并运行一些命令,我创建了以下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  |
-----------------------------------

我知道我的解决方案和其他人的很相似,但我找不到任何一个完全符合我的要求的解决方案:

  • 我想在特定的路径上打开标题窗口
  • 我想要尽可能多的窗户和玻璃
  • 我想在每个窗格中运行任意命令,保存在历史记录中
  • 我想要聚焦在脚本末尾的窗口
  • 我希望能快速生成这个
  • 我希望它易于维护

对于我的名为johndoe的项目,我创建了一个johndoe.conf文件,它本质上是一个bash脚本,在我的配置(~/.config/tmux/tmux-sessions/johndoe.conf)的某处。

这个文件很容易维护,因为它不像我在其他答案中看到的那样到处都有无数的\:

# Create a new session named johndoe, with a first window named Main
# at the specified starting path.
# The -d is for detached mode, which allows me to continue defining the rest of the session
# before attaching to it. Without -d, tmux would open the client right away and
# ignore the rest of the session definition
tmux new -d -s johndoe -n 'Main' -c ~/dev/own/johndoe
# Simulate the user entering some docker command in the first window available
# in the target session named (-t) johndoe
tmux send -t johndoe 'docker compose up -d' Enter


# Create a new window in the target session, with the title 'UI run'
t neww -t pers -n 'UI run' -c ~/dev/own/johndoe/front-end
# Simulate user entering a command to the first pane
tmux send -t pers:'UI run.0' 'git status --short' Enter
# Split this window horizontally
tmux split-window -t pers:'UI run' -h -c ~/dev/own/johndoe/front-end
# Simulate user entering a command to the second pane in this window
tmux send -t pers:'UI run.1' 'npm run dev' Enter


tmux neww -t johndoe -n 'API run' -c ~/dev/own/johndoe/back-end/Api
tmux send -t johndoe:'API run' 'dotnet run --no-build' Enter


# Focus the first window
tmux select-window -t johndoe:'Main'
# Attach the current terminal to the only session available
# (you might want to add "-t johndoe" here if you need several sessions running in parallel)
tmux a -d
  1. 我创建了一个bash/zsh别名来源会话配置:
alias tmuxjohndoe='. ~/.config/tmux/tmux-sessions/johndoe.conf'
  1. 我花了适量的调试时间,弄清楚我需要给johndoe.conf文件执行权限:-)

  2. 现在从任何地方,我只要运行tmuxjohndoe !