进程完成时在 tmux 中发出警报

问题描述 投票:0回答:9

我可以设置 tmux 在进程完成时在非活动窗口中触发警报吗?

例如:我开始了一个漫长的构建过程。我希望在完成时收到通知,而不是每次打印状态时收到通知。

tmux
9个回答
32
投票

您可以使用 tmux 窗口设置

visual-bell
为此。然后,您可以使用
bell-action
配置是仅查看当前窗口的铃声,还是仅查看非当前窗口的铃声(其他)。就我个人而言,我更喜欢第二种,因为您不会看到 shell 生成的噪音,并且您可能不关心通知是否在当前窗口中。

set-window-option -g visual-bell on
set-window-option -g bell-action other

当进程产生响铃时,tmux 将突出显示响铃的窗口标题,并显示“窗口 X 中的响铃”通知。

然后在过程结束时按响铃。例如:

make; echo -e '\a'

(如果您只想分别在成功或失败时响铃,则用

&&
||
代替
;


14
投票

我知道有 3 种解决方案,但没有一个是真正理想的。您可以将这些命令放入您的

~/.tmux.conf
中,或者通过 Ctrl-B
:
将它们直接作为 Tmux 命令运行。

  1. 每当输出发生变化时进行监视并发出警报(然后您可以将输出重定向到其他地方,以便仅在命令完成后输出才发生变化):

    :set -g visual-activity on
    :setw -g monitor-activity on
    
  2. 只要输出在一段时间内没有发生变化(此处为 30 秒),就进行监控并发出警报:

    :set -g visual-silence on
    :setw -g monitor-silence 30
    
  3. 已弃用,有一天会被更好的选项取代)当输出包含与给定模式匹配的字符串时进行监视和警报(并且可能运行像

    my-command; echo foobar
    这样的命令):

    :set -g visual-content on
    :setw -g monitor-content foo*bar
    
  4. $ some-command; tmux display-message "Task 1 done"
    。但是,该消息只会显示通过
    :set -g display-time 4000
    定义的较短持续时间。

如果将

visual-*
保留为
off
(默认),它将仅突出显示发生警报的窗口的名称,而不显示全局警报状态消息。

有关每个设置的详细信息,请参阅 tmux 手册页

已更新(感谢 Steven Lu)


9
投票

我在 shell 中使用

zsh
,它有一个名为“Hook Functions”的功能——在某些操作上执行的 shell 函数:http://zsh.sourceforge.net/Doc/Release/Functions.html.

其他 shell 可能也有类似的功能。

我使用的钩子函数是

precmd
,每次显示提示时都会执行该函数。即,当命令刚刚完成运行时。

在我的

.zshrc

precmd () {
  echo -n -e "\a"
}  

这会向

tmux
发送响铃,使其仅突出显示运行该命令的窗口。

如果您已经专注于该

tmux
窗口,则这不会执行任何操作,因为铃声会立即清除。

这种方法的好处是它不会触发所有视觉活动。它仅在命令完成时触发。


2
投票

您可以使用 && bash 衍生品包装正在运行的脚本,它将调用 tmux 命令来通知您。 使用 && 意味着只有当脚本以错误代码 0 退出时您才会收到通知。如果您希望它无论如何都通知您,只需使用 ;

至于包装脚本的 tmux 命令,看看这些命令,它们应该足够了 选择窗口 split-window -h '执行回显...' 发送密钥


2
投票

为了将来参考,人们还可以查看由 ChanderG 创建的 tmux-notify 插件,该插件是为此目的而设计的。

免责声明:我是这个插件的贡献者。如果您发现错误或发现缺少某些内容,请随时查看并提出问题/拉取请求或功能请求。


1
投票

基于@psp940的答案(StackOverflow不允许我添加评论):

precmd () {
  echo -n -e "\a" >$TTY
}

如果您使用 powerlevel10k 的即时提示功能,将铃声直接重定向到终端可以避免有关预初始化控制台输出的警告。另请参阅此处


1
投票

添加@wump和@psp940的答案;我发现,在命令完成时收到警报的最简单方法是在您的

PS1
:

中放一个响铃

tmux.conf

set-window-option -g visual-bell on
set-window-option -g bell-action other

在你的

.bashrc

# ring bell every time a command completes
export PS1+=$'\[\a\]'

我不确定

+=
$''
是否是 bash-ism,但该原理适用于任何 shell。

周围的

\[
+
\]
告诉你的 shell 它们之间的字符是零宽度


0
投票

有两种选择:

set -g visual-activity on
setw -g monitor-activity on

您尝试过在 tmux.conf 中设置它们吗?


0
投票

作为一个好的解决方法,您可以使用: https://github.com/tcreech/tmux-notifications

您只需执行以下操作: $命令; tmux-通知

您将在状态栏中收到一条不错的通知(如果启用)

© www.soinside.com 2019 - 2024. All rights reserved.