我使用 tmux 进行开发,我有一个任务在一个窗口中运行,另一个任务在它自己的窗口中运行。我已设置约定,项目目录的基本名称是 tmux 会话名称。
export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
"api.start --monitored" \; \
split-window "ui.start --monitored" \; \
select-layout tiled \; \
set-option -w remain-on-exit on \; \
set-option -w mouse on \; \
set-option -g mouse on \; \
bind-key -n C-c kill-session -t "$SESSION_NAME"
一切似乎都工作正常,除非以相同的约定启动不同的项目,不知何故,第一个会话中的 CTRL+c 认为 SESSION_NAME 是最近的 tmux 生成的会话之一,这不是我所希望的。
答案1
在您发布的代码片段中,$SESSION_NAME
shell 扩展了每个外观,并且每个外观都tmux
将扩展值作为命令行参数获取。
(即使它没有,并且您想$SESSION_NAME
稍后在 tmux 内或 tmux 内的 shell 内扩展它,您export SESSION_NAME="my-project-name"
可能是徒劳的,因为tmux
环境如何建设。该update-environment
选项或new-session -e …
命令可能有用。)
这包括$SESSION_NAME
在bind-key -n C-c kill-session -t "$SESSION_NAME"
.你的tmux
执行:
bind-key -n C-c kill-session -t my-project-name
然后对于不同的项目,tmux 命令如下:
bind-key -n C-c kill-session -t different-name
重要的是bind-key
它本身并不针对单个会话。改变整个 tmux 服务器的+bind-key -n C-c …
行为。在您的情况下,最后一个会覆盖之前的作业,然后在任何会话中都会覆盖+ 。Ctrlcbind-key
Ctrlckill-session -t different-name
我想您可以使用该key-table
选项将默认密钥表设置为除 之外的其他内容root
,分别为每个会话设置默认密钥表。在每个新的密钥表中,您可以为C-c
.这个我没测试过,我思考也许有可能。
如果我是你,我会做更简单的事情。我会这样做:
tmux bind-key -n C-c kill-session
kill-session
没有-t
目标的当前的会话,因此此绑定应该执行您想要的操作my-project-name
,different-name
或任何其他会话。
坦率地说,“任何其他会议”对我来说都太多了。我不想Ctrl+c杀死我的一切一般用途会话。我会解决这个问题:
要么
C-c
不理会并选择另一个击键作为“全局SIGINT”,然后无意中使用其中一个;或者通过显式地将应使用Ctrl+ 的会话“标记”c为“全局 SIGINT”。可能是这样的:
tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \ bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
TMUX_GLOBAL_SIGINT
现在,在其环境中具有非空变量的每个会话中Ctrl+c将终止该会话。在每个会话中,如果TMUX_GLOBAL_SIGINT
为空或未设置Ctrl+,c则将照常工作。笔记:
tmux set-environment -u TMUX_GLOBAL_SIGINT
对于已启动的会话,您可以使用或更改设置tmux set-environment TMUX_GLOBAL_SIGINT 1
(用于-t
定位特定会话,不一定是当前会话)。在 tmux 中启动的 shell(或另一个程序)可以继承
TMUX_GLOBAL_SIGINT
.如果它运行tmux new-session …
,那么(取决于等等update-environment
)新会话也可能继承该变量,即使没有显式的-e 'TMUX_GLOBAL_SIGINT=1'
.阅读man 1 tmux
并了解 tmux 如何管理环境。