如何设置tmux,使其在打开指定窗口的情况下启动?


Answers:


257

您可以编写一个小的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

4
谢谢!我必须做一些令人讨厌的转义操作,才能使其与bash --rcfile启用了特定devtools版本的科学linux结合使用。如果有人尝试执行此操作,则将其保留在此处。tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
拉伦,2015年

1
我认为第二行必须更改,在“ vim”之前需要-s选项。这意味着“ tmux new-session -d's 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其中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 \;

那样做。Basicaly知道周围的路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
更新:\;将分号而不是bash传递给tmux,从而允许通过一次调用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,并且foo在bar上方运行时将垂直拆分为一半(50%)。焦点将位于窗口2(foo / bar),顶部窗格(foo)中。

然后,您可以使用以下命令启动首选的tmux会话(在本例中为session1) PrefixShifts


4
不能在不需要其他文件的情况下在.tmux.conf中启动这些会话吗?
伊诺(Eno)2012年

2
其中之一可能是:这样一来,您可以轻松地添加更多量身定制的会话-几个微小的文本文件几乎没有开销……
jasonwryan 2012年

1
这不是会话嵌套吗?我的意思是要运行,Prefix Shift S我需要进入tmux,寻找您的文件来尝试启动一个新的会话,除非您强迫它,否则tmux不会并且不会这样做。
user35915'3

1
@ user35915它不会简单地启动子会话,而是一个单独的子会话-您可以在其上切换到使用例如prefix-s或prefix-)和prefix
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

有关完整说明,请参见上面链接的自述文件。


2
基本上,tmuxinator正是我想要的。谢谢!
贾斯汀部队

3
还有一个tmuxp也非常相似:github.com/tony/tmuxp
Ben Creasy


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,尽管我不明白为什么您同时使用长格式和短格式。
oligofren

11

首先我有@jasonwryan的方法,但是如果您有2个以上的配置,它可能会造成混乱。

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

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

~/.tmux/我有许多用途的多个会议。例如,我为拥有彼此开发环境的不同公司工作。因此,使用上面的别名功能,我可以简单地调用:tmx company1并加载所需的配置。

更新:tmux命令后“ $ 2”的目的是,您可以传递其他tmux args。


1
将此与@ soc1c的技巧结合起来,进行了超甜的设置(github.com/fatso83/dotfiles/commit/35a7ed)。谢谢!
oligofren

当尚不存在要挂接到(get no server running on /tmp/tmux-1000/default)的tmux会话时,该功能实际上不起作用。这就是为什么我需要使用来修补命令tmux new-session。参考github.com/fatso83/dotfiles/commit/…–
oligofren

1
我用systemd设置了tmux。因此,引导后总会运行一个会话。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或shell脚本):

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文件夹,将其添加到PATHtmux_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

尝试兄弟,这是一个项目引导程序。

它提供了易于交互的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和使用其tmuxapi。

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


2

有一个tmux插件。

看看tmux-resurrect

系统重启后恢复tmux环境。

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

tmux-resurrect会保存tmux环境中的所有小细节,因此可以在系统重新启动后(或在您觉得有必要时)将其完全还原。无需配置。您应该觉得自己永远不会退出tmux。

tmux-continuum

特征:

  • 持续保存tmux环境
  • 打开计算机/服务器后自动启动tmux
  • 启动tmux时自动还原

1

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

new mocp
neww mutt

new -d
neww
neww

(打开一个带有2个窗口的会话,首先打开mocp,然后打开mutt,另一个会话分离3个空窗口)。


1

我已经创建了这个脚本。它不需要解毒剂,红宝石或其他。它只是一个可配置的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

嗨,sensorario,尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。请在这里看看:为什么以及如何删除一些答案?
bummi

Nb令人惊讶的是,tmux start_server它不会自行启动服务器。参见github.com/tmux/tmux/issues/182
Jack Wasey

1

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

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

1

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

特征:

  • 持续保存tmux环境
  • 打开计算机/服务器后自动启动tmux
  • 启动tmux时自动还原

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

tmux-resurrect会保存tmux环境中的所有小细节,因此可以在系统重新启动后(或在您感觉合适时)将其完全还原。无需配置。您应该觉得自己永远不会退出tmux。


1

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

例如,要在右下方运行htop的情况下以三种方式拆分屏幕,可以在~/.tmux.conf文件中添加以下行:

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

这种方法的优点是您不必以任何特殊方式(例如,shell脚本或别名)运行tmux即可获得所需的结果。您还可以将其与其他答案中tmux new-session -A -s mysession所述的内容结合使用,以使hook命令仅在您首次创建会话时运行,而不在后续的附件上运行。

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/issues/182
Jack Wasey

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.