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

时间:2011-04-10 01:36:55

标签: shell production-environment tmux

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

21 个答案:

答案 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-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

希望将来帮助 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"  

会话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  

答案 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-continuum
  

tmux-resurrect保存tmux环境中的所有小细节   所以它可以在系统重启后完全恢复(或者当你   感觉就像)。无需配置。你应该感觉像你一样   永远不要退出tmux。

答案 15 :(得分:1)

有一个tmux插件。

查看tmux-resurrect

  

系统重启后恢复tmux环境。

     

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

     

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

tmux-continuum

  

特点:

     
      
  • 持续保存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。