因此,我想创建一个特定于项目的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或其他简单的交互命令(例如top
,sqlite3
等)。
new-session
是默认命令
二、跑步tmux没有命令参数(例如tmux
)相当于使用new-session
命令(即tmux
相同tmux new-session
)。您.tmux.conf
为其窗口/窗格创建一个会话(new
是 的别名),并且正在为通过启动指定的new-session
隐式命令创建另一个会话new-session
tmux无需命令参数。如果您使用默认状态栏,则当您处于“额外”会话中时(在会话中创建的初始会话为 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:高效的无鼠标开发从实用书架。