我可以设置 tmux 在进程完成时在非活动窗口中触发警报吗?
例如:我开始了一个漫长的构建过程。我希望在完成时收到通知,而不是每次打印状态时收到通知。
您可以使用 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'
(如果您只想分别在成功或失败时响铃,则用
&&
||
代替 ;
)
我知道有 3 种解决方案,但没有一个是真正理想的。您可以将这些命令放入您的
~/.tmux.conf
中,或者通过 Ctrl-B :
将它们直接作为 Tmux 命令运行。
每当输出发生变化时进行监视并发出警报(然后您可以将输出重定向到其他地方,以便仅在命令完成后输出才发生变化):
:set -g visual-activity on
:setw -g monitor-activity on
只要输出在一段时间内没有发生变化(此处为 30 秒),就进行监控并发出警报:
:set -g visual-silence on
:setw -g monitor-silence 30
(已弃用,有一天会被更好的选项取代)当输出包含与给定模式匹配的字符串时进行监视和警报(并且可能运行像
my-command; echo foobar
这样的命令):
:set -g visual-content on
:setw -g monitor-content foo*bar
$ some-command; tmux display-message "Task 1 done"
。但是,该消息只会显示通过 :set -g display-time 4000
定义的较短持续时间。如果将
visual-*
保留为 off
(默认),它将仅突出显示发生警报的窗口的名称,而不显示全局警报状态消息。
有关每个设置的详细信息,请参阅 tmux 手册页
我在 shell 中使用
zsh
,它有一个名为“Hook Functions”的功能——在某些操作上执行的 shell 函数:http://zsh.sourceforge.net/Doc/Release/Functions.html.
其他 shell 可能也有类似的功能。
我使用的钩子函数是
precmd
,每次显示提示时都会执行该函数。即,当命令刚刚完成运行时。
在我的
.zshrc
:
precmd () {
echo -n -e "\a"
}
这会向
tmux
发送响铃,使其仅突出显示运行该命令的窗口。
如果您已经专注于该
tmux
窗口,则这不会执行任何操作,因为铃声会立即清除。
这种方法的好处是它不会触发所有视觉活动。它仅在命令完成时触发。
您可以使用 && bash 衍生品包装正在运行的脚本,它将调用 tmux 命令来通知您。 使用 && 意味着只有当脚本以错误代码 0 退出时您才会收到通知。如果您希望它无论如何都通知您,只需使用 ;
至于包装脚本的 tmux 命令,看看这些命令,它们应该足够了 选择窗口 split-window -h '执行回显...' 发送密钥
为了将来参考,人们还可以查看由 ChanderG 创建的 tmux-notify 插件,该插件是为此目的而设计的。
免责声明:我是这个插件的贡献者。如果您发现错误或发现缺少某些内容,请随时查看并提出问题/拉取请求或功能请求。
基于@psp940的答案(StackOverflow不允许我添加评论):
precmd () {
echo -n -e "\a" >$TTY
}
如果您使用 powerlevel10k 的即时提示功能,将铃声直接重定向到终端可以避免有关预初始化控制台输出的警告。另请参阅此处。
添加@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 它们之间的字符是零宽度
有两种选择:
set -g visual-activity on
setw -g monitor-activity on
您尝试过在 tmux.conf 中设置它们吗?
作为一个好的解决方法,您可以使用: https://github.com/tcreech/tmux-notifications
您只需执行以下操作: $命令; tmux-通知
您将在状态栏中收到一条不错的通知(如果启用)