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

sat*_*oru 248 shell production-environment tmux

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

Amj*_*ith 230

您可以编写一个小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
Run Code Online (Sandbox Code Playgroud)

因此,每当我想要启动我最喜欢的开发环境时,我就可以做到

$ dev-tmux
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我不得不做一些可怕的逃避,让它与`bash --rcfile`一起工作,以便在科学linux上获得一个漂亮的shell,并启用特定的devtools版本.如果有人试图这样做,请留在这里.`tmux new-window -n"git lg""scl enable devtoolset-3'bash --rcfile <(echo \"source \"$ HOME/.bashrc \"; cd~/workspace/coolproject /; git lg \" )""` (4认同)
  • 我认为第二行必须更改,它需要在 'vim' 之前使用 -s 选项。这意味着“ tmux new-session -d 'vim' ”必须替换为“ tmux new-session -d -s 'vim' ” (2认同)
  • @AhmadYoosofan,那里的`vim` 代表要在窗口的第一个(并且仅在那时)窗格中执行的命令。如果您想将会话命名为“vim”,那么是的,您是对的,您必须使用“-s”标志。整个语法:`tmux new-session -d -s SessionName -n WindowName Command` (2认同)

Afr*_*Afr 141

我试图创建一个复杂的窗格网格,并不得不一次又一次地处理切换和分割窗格.以下是我的经验:

tmux new-session \;
Run Code Online (Sandbox Code Playgroud)

让您开始使用新会话.将它分开水平或垂直使用split-window -h-v随后,如下:

tmux new-session \; split-window -v \; split-window -h \;
Run Code Online (Sandbox Code Playgroud)

创建3个窗格,如下所示:

------------
|          |
|----------|
|    |     |
------------
Run Code Online (Sandbox Code Playgroud)

要在该窗格中运行命令,只需使用该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 \; 
Run Code Online (Sandbox Code Playgroud)

结果会话应该是这样的.

------------
|  tail    |
|----------|
|    | top |
------------
Run Code Online (Sandbox Code Playgroud)

现在我尝试再次细分左下方的窗格,然后使用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 \;
Run Code Online (Sandbox Code Playgroud)

那样做.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 \;
Run Code Online (Sandbox Code Playgroud)

这导致会话看起来像那样

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------
Run Code Online (Sandbox Code Playgroud)

希望能tmux在未来帮助发烧友.

  • 更新:`\;` 将分号传递给 tmux 而不是 bash,允许通过对 tmux 的一次调用发送命令。/sf/ask/1463923891/ (5认同)
  • 惊人的指南,你能指导我如何在拆分后调整垂直面板的宽度。 (2认同)
  • @MinhNV `-h -p 30` 创建一个具有 30% 可用高度的水平面板;`-v -p 75` 与垂直宽度相同,宽度为 75%。 (2认同)
  • `tmux 新会话 \; 分割窗口-v -p 50 \; 分割窗口-h -p 50 \; 选择窗格-t 0 \; split-window -h -p 50 \;` 创建一个分为 4 个等距窗格的窗格 (2认同)

jas*_*yan 90

您可以从您的.tmux.conf喜欢中获取不同的会话:

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2
Run Code Online (Sandbox Code Playgroud)

然后根据需要格式化会话:

#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
Run Code Online (Sandbox Code Playgroud)

这将打开2个窗口,其中第二个将被命名为foo/bar,并且将垂直分成两半(50%),foo在bar上方运行.焦点将在窗口2(foo/bar),顶部窗格(foo)中.

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

  • 这些会话不能在.tmux.conf中启动而不需要额外的文件吗? (4认同)
  • 其中一个可以:通过这种方式,您可以轻松添加更多定制的会话 - 而且几个小文本文件几乎不是开销...... (2认同)

Ham*_*ner 50

使用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
Run Code Online (Sandbox Code Playgroud)

有关完整说明,请参阅上面链接中的README.

  • 还有tmuxp,它非常相似:https://github.com/tony/tmuxp (3认同)
  • tmuxinator 基本上正是我正在寻找的。谢谢! (2认同)

loc*_*jay 16

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

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

windows:
  - name: sample-window
    splits:
      - cmd: vim
      - cmd:
        - ipython
        width: 50
      - cmd:
        height: 25
Run Code Online (Sandbox Code Playgroud)


小智 15

:~$ tmux new-session "tmux source-file ~/session1"  
Run Code Online (Sandbox Code Playgroud)

会话1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  
Run Code Online (Sandbox Code Playgroud)

在.bashrc中创建一个别名

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  
Run Code Online (Sandbox Code Playgroud)


Ran*_*rtz 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
Run Code Online (Sandbox Code Playgroud)


dan*_*gge 11

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

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

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}
Run Code Online (Sandbox Code Playgroud)

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

更新:tmux命令后"$ 2"的目的是,您可以传递额外的tmux args.


ks1*_*322 8

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

tmux new-session \; split-window -h \;
Run Code Online (Sandbox Code Playgroud)

你的屏幕看起来像这样:

[ks@localhost ~]$                      ?[ks@localhost ~]$ 
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
                                       ?
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-???-16
Run Code Online (Sandbox Code Playgroud)


kev*_*tch 8

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

例如,要以三种方式分割屏幕并在右下角运行顶部,您可以将以下行添加到文件中~/.tmux.conf

set-hook -g session-created 'split -h ; split -v top'
Run Code Online (Sandbox Code Playgroud)

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

此功能由d15d54c2c于 2016 年添加。第一个包含该功能的版本是 2.4。


rub*_*o77 8

此脚本启动一个名为“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
Run Code Online (Sandbox Code Playgroud)


Art*_*cki 6

这就是我的方法:

#!/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
Run Code Online (Sandbox Code Playgroud)

每个项目都有一个文件。您也可以将他们分组,以便为​​一些业余项目工作。

您也可以将其移动到~/bin文件夹,将其添加到PATHtmux_my_awesome_project命名。然后,您将可以在每个地方运行它。


Sya*_*man 5

有一个 tmux 插件可以解决这个问题。

查看tmux 复活

系统重启后恢复tmux环境。

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

tmux-resurrect 保存 tmux 环境中的所有小细节,以便在系统重新启动后(或当您愿意时)可以完全恢复它。无需配置。您应该感觉自己从未退出过 tmux。

或者tmux-连续体

特征:

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


Asu*_*sur 5

试试bro,它是一个项目引导程序。

它提供了简单的 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
Run Code Online (Sandbox Code Playgroud)

要启动一个项目,只需运行以下命令 -

bro start <project_name>

查看下面的截屏视频,它展示了如何开始bro使用它的tmuxapi。

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


Vic*_*gin 0

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

new mocp
neww mutt

new -d
neww
neww
Run Code Online (Sandbox Code Playgroud)

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