358

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

4

22 回答 22

336

您可以编写一个小的 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
于 2011-04-22T06:35:21.590 回答
276

我试图创建一个复杂的窗格网格,并且不得不一遍又一遍地处理切换和拆分窗格。以下是我的学习:

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对以后的爱好者有所帮助。

于 2016-10-12T21:56:02.867 回答
110

.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

于 2011-04-22T07:00:55.247 回答
60

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

于 2012-04-18T19:22:35.563 回答
21
:~$ 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  
于 2014-01-09T23:26:15.670 回答
17

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

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

windows:
  - name: sample-window
    splits:
      - cmd: vim
      - cmd:
        - ipython
        width: 50
      - cmd:
        height: 25
于 2011-05-25T02:01:36.030 回答
11

从我的“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
于 2011-07-05T22:48:55.663 回答
11

首先我有来自@jasonwryan的方法,但如果你有超过 2 个配置,它可能会让人感到困惑。

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

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

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

更新:命令后“$2”的目的tmux是,您可以传递额外的 tmux 参数。

于 2016-10-19T07:56:58.783 回答
11

此脚本启动一个名为“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
于 2020-05-12T07:24:30.853 回答
11

如果您只想在 2 个窗格上分屏(例如水平),则可以运行此命令(不需要 tmux 或 shell 脚本):

tmux new-session \; split-window -h \;

您的屏幕将如下所示:

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
                                       │
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16
于 2016-01-31T16:52:40.103 回答
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命名。然后,您将能够从每个地方运行它。

于 2016-07-13T14:38:03.223 回答
6

试试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使用它的tmuxapi。

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

于 2018-12-29T06:26:28.827 回答
5

为此有一个 tmux 插件。

查看tmux-resurrect

系统重启后恢复 tmux 环境。

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

tmux-resurrect 保存 tmux 环境中的所有小细节,以便在系统重新启动后(或当您喜欢它时)可以完全恢复。无需配置。你应该觉得你永远不会退出 tmux。

tmux 连续体

特征:

  • tmux环境的持续保存
  • 打开计算机/服务器时自动启动 tmux
  • tmux 启动时自动恢复
于 2017-07-13T03:14:36.677 回答
4

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

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1
于 2014-11-18T17:18:11.660 回答
4

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 的作者。

于 2020-12-31T08:05:04.460 回答
4

创建新会话时,您可以使用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。

于 2019-08-15T21:58:52.423 回答
2

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

特征:

  • tmux环境的持续保存
  • 打开计算机/服务器时自动启动 tmux
  • tmux 启动时自动恢复

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

tmux-resurrect 保存 tmux 环境中的所有小细节,以便在系统重新启动后(或当您喜欢它时)可以完全恢复。无需配置。你应该觉得你永远不会退出 tmux。

于 2017-04-17T06:44:54.550 回答
2

为了简单地使用多个窗格打开 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  |
-----------------------------------
于 2022-01-04T20:17:37.410 回答
2

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

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd
于 2015-12-29T17:55:52.173 回答
1

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

new mocp
neww mutt

new -d
neww
neww

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

于 2011-04-10T03:39:29.447 回答
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
于 2015-04-16T21:59:01.477 回答
1

我只是尝试使用此页面上的所有想法,但我不喜欢其中任何一个。我只是想要一个解决方案,在我的终端打开时使用一组特定的窗口启动 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),要么使用该设置创建一个新会话。

于 2015-06-24T18:03:33.043 回答