短期命令

短期命令

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

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

结果是......什么都没有。 tmux启动时只有一个窗口,并且该窗口中只有一个窗格,没有执行任何命令。

我该如何制作一个配置文件,使我能够创建一组预先执行某些命令的窗口和窗格?

答案1

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

短期命令

首先,您要启动的命令(ls) 非常快地完成运行。命令的窗口和窗格已创建,但它们在每个命令退出时立即消失。

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

或者,如果你不介意你的初始窗口是 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

如果你只是将其用作ls简化的占位符命令,而你实际上打算在窗口/窗格中生成某种类型的交互式命令,那么你可能应该只生成你最终打算运行的命令。如果你打算使用的命令启动时间太长,无法在运行期间使用它tmux测试,然后替换为shell或其他简单的交互命令(例如topsqlite3等)。

new-session是默认命令

二、跑步tmux没有命令参数(例如tmux)相当于使用new-session命令(即tmux相同tmux new-session)。您.tmux.conf为其窗口/窗格创建一个会话(new是 的别名),并且正在为通过启动指定的new-session隐式命令创建另一个会话new-sessiontmux无需命令参数。如果您使用默认状态栏,则当您处于“额外”会话中时(在会话中创建的初始会话为 0 号),您将[1]在状态栏左侧看到 。.tmux.conf

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

答案2

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

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

每个 .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

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

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

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

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

然后我按 F12 启动 konsole。

答案3

假设您要启动 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

答案4

另一个与 teamcoil 类似的替代方案是多路复用器,它正在积极开发中,并且运行良好。它还被推荐(并被评论)在令人惊叹的tmux:高效的无鼠标开发实用书架

相关内容