如何让 tmux 打开一组窗格而无需手动输入它们?

JUS*_*ION 30 tmux

所以,我想创建一个特定于项目的tmux会话,自动在某些窗格中弹出某些命令。按照在线教程tmux手册页,这是我为配置文件提出的:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls
Run Code Online (Sandbox Code Playgroud)

结果是……没什么。 tmux以单个窗口和该窗口中的单个窗格启动,不执行任何命令。

我将如何制作一个配置文件,该文件实际上允许我使用预先执行的某些命令创建一组窗口和窗格?

Chr*_*sen 36

您的配置文件正在运行,但有一些复杂情况。

短期命令

首先,您正在启动的命令(ls 的实例)运行速度非常快。命令的窗口和窗格已创建,但一旦每个命令退出,它们就会消失。

如果您的目标是在最终配置中实际使用此类“一次性”命令,那么您可能应该使用 window 选项remain-on-exit(也可能使用 session 选项set-remain-on-exit为会话中创建的所有窗口提供默认值)。当remain-on-exit为一个窗口设置时,命令退出时它不会消失。您可能希望将 映射respawn-window到一个键(注意:respawn-window将重新生成原始命令;respawn-panetmux 1.5 中也可用于重新生成单个窗格)。

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit
Run Code Online (Sandbox Code Playgroud)

或者,如果您不介意初始窗口是数字 1 而不是数字 0,那么我们可以避免更改全局值:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit
Run Code Online (Sandbox Code Playgroud)

如果您仅用ls作简化的占位符命令,并且您实际上打算在窗口/窗格中生成某种类型的交互式命令,那么您可能应该只生成您打算最终运行的命令。如果您打算命令的时间太长启动过程中使用它TMUX测试,然后替换一个壳或其它简单的交互式命令(例如topsqlite3等)。

new-session 是默认命令

其次,在没有命令参数(例如)的情况下运行tmuxtmux等效于使用new-session命令(即tmux与 相同tmux new-session)。您.tmux.conf为其窗口/窗格创建一个会话(new是 的别名new-session),并且正在为new-session通过启动tmux指定的隐式命令创建另一个会话,而没有命令参数。如果您使用的是默认状态栏,[1]当您处于“额外”会话(在.tmux.conf0 中创建的初始会话)时,您将在状态栏的左侧看到。

如果您想避免创建额外的会话,请使用tmux attach而不是普通的tmux. 来自您的命令.tmux.conf将运行,创建会话 0,然后您的客户端将附加到该会话而不是创建一个新会话。

  • @Just:无论你是否使用 `-f`,没有命令参数的 `tmux` 与 `tmux new-session` 相同(对于新服务器,它将在你的配置文件之上创建一个新会话)。您的预拆分窗口是在会话 0 中创建的,但隐含的“new-session”命令正在创建(并附加到)一个额外的会话(会话 1;在您的状态行中查找“[1]”)。使用`tmux -f myconfig attach` 避免创建隐藏预拆分窗口的新会话。 (4认同)
  • 好吧,我可能像这里的鲸鱼三明治一样厚,但现在我有一个只有 `splitw` 的配置文件——没有别的——而且我仍然没有得到分屏,因为它说它无法建立当前会话。如果我在它之前添加 `new`,我会得到......一个窗口,一个窗格。我似乎一辈子都无法在启动时获得两个窗格。 (2认同)

小智 10

我不确定我是否理解您所说的“手动输入”是什么意思,但这就是我的做法。我写了一个我的窗口管理器启动的“自动启动”脚本。它包含了:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done
Run Code Online (Sandbox Code Playgroud)

每个 .session 文件看起来像这样:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter
Run Code Online (Sandbox Code Playgroud)

等等,还有更多!我用 konsole 加载了越来越多的 .session 文件:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs
Run Code Online (Sandbox Code Playgroud)

其中 work_console.tabs 看起来像这样:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.
Run Code Online (Sandbox Code Playgroud)

然后我按 F12 启动 konsole。


Jas*_*sen 6

假设您要启动 3 个服务器监控任务(此处为 ping localhost),则无需弄乱配置文件和保存的会话。这一切都可以从命令行完成。

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Run Code Online (Sandbox Code Playgroud)


Kri*_*ris 5

我发现teamocil对于自动化 tmux 窗口/会话非常有用。

它是用 Ruby 编写的,因此您需要安装它。

这是一个示例配置:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard
Run Code Online (Sandbox Code Playgroud)

您可以安排窗口和拆分。