我有一个~/.tmux/dev看起来像这样的文件:
selectp -t 0 # select the first pane
splitw -h -p 50 # split it into two halves
selectp -t 1 # select the new, second (1) pane
splitw -v -p 50 # split it into two halves
selectp -t 0 # go back to the first pane
send-keys 'vim .' Enter
Run Code Online (Sandbox Code Playgroud)
如果我tmux source-file ~/.tmux/dev从 tmux 会话内部运行,它工作正常。
我想创建一个 bash 脚本来打开 tmux 并自动运行这些命令。
我试过跑步
tmux new 'tmux source-file ~/.tmux/dev'
Run Code Online (Sandbox Code Playgroud)
但我只看到两个窗格;缺少带有 vim 的窗格。
我已阅读如何让 tmux 打开一组窗格而无需手动输入它们?,但在安装用于管理 tmux 配置的工具之前,我想了解一下这里发生了什么。
预先感谢您对这个主题的任何了解。
这是正在发生的事情:
tmux new 'tmux source-file ~/.tmux/dev'
这些new命令使用具有单个窗格的单个窗口创建一个新会话。该命令tmux source-file ~/.tmux/dev在这个新窗格中运行。
N(其中 N 是某个数字),其中N:0(或您base-index设置的任何窗口),N:0.0(或您base-pane-index设置的任何内容),tmux source-file ~/.tmux/dev。该source-file命令被处理。
send-keys命令然后vim .在窗格 0 处“键入” + Enter。source-file。因此,出乎意料的是,窗格 0(即N:0.0)正在运行(仅)source-file忽略您的“键入”命令的命令。此窗格从不运行可以解释“键入”命令的交互式 shell。
至少有几种方法可以解决这个问题:
开始~/.tmux/dev时new-window,窗格 0 正在运行您的“默认命令”(即可能是交互式 shell)。
这种方法的好处是不假设您的当前窗格正在运行交互式 shell,也不假设当前窗格正在运行0(即,如果您对作为已经拆分窗口一部分的窗格运行原始系列命令会发生什么? ?)。这意味着您可以安全地绑定source-file ~/.tmux/dev到可以在任何上下文中运行的键(因为它为其所有窗格创建了一个新窗口)。你可以从 shell 运行tmux source-file ~/.tmux/dev(在当前会话中创建一个新窗口),或者你原来的tmux new 'tmux source-file ~/.tmux/dev'来创建一个新会话。
此方法的一个小缺点是,当您运行 时tmux new 'tmux source-file ~/.tmux/dev',初始窗口仍将运行发送source-file和退出相当快的客户端。这意味着您的“主窗口”(带有拆分的窗口)将比您的高一个,base-index并且未来的新窗口将放置在“主窗口”之前。你可以通过使用这样的东西来解决这个问题:
tmux new 'tmux move-window -t 99 \; source-file ~/.tmux/dev'
Run Code Online (Sandbox Code Playgroud)
它将(短暂的)初始窗口移动到高索引,以便new-windowin~/.tmux/dev将在base-index.
使用 (eg)tmux new 'tmux source-file ~/.tmux/dev ; zsh -l'以便在source-file命令完成后窗格最终运行交互式 shell 。
丑陋的一点是你最终将你喜欢的 shell 硬编码到这个命令中。此外,从技术上讲,send-keys输入(vim .+ Enter)是在 shell 启动之前发送的;这可能没问题,但可能并不总是完全可靠。
您可以通过查询tmux来避免对 shell 进行“硬编码” default-command(或者如果未设置,default-shell(或者如果未设置,则使用 SHELL)),但这可能比您真正想做的工作要多。