关闭 tmux 中的响铃但保持钩子状态

关闭 tmux 中的响铃但保持钩子状态

我有一个自定义响铃命令:

set -g monitor-bell on
set -g bell-action current
set-hook -g alert-bell 'set -g status-bg "#901010" ; run-shell "sleep 0.1s" ; set -g status-bg colour8'

不幸的是,这并不能抑制蜂鸣声。为了做到这一点,我必须要么出发monitor-bell,要么bell-action出发(参见这个答案)。然而,我的alert-bell钩子永远不会触发。

在添加我自己的钩子之前,我尝试删除任何现有的钩子:

set-hook -u alert-bell
set-hook -gu alert-bell

如何抑制蜂鸣声但仍将挂钩保留alert-bell在 tmux 2.7 中?

答案1

set -g visual-bell on

这将导致tmux闪烁一条消息(“当前窗口中的铃声”),而不是告诉终端发出蜂鸣声。该消息可能会掩盖您使用自己的挂钩所做的状态栏更改。

从手册中:

视觉铃[上|关闭 |两个都]

如果打开,则窗口中的响铃上会显示一条消息, 监控铃窗口选项已启用,而不是传递到终端(通常会发出声音)。 [...]

答案2

我通过使用(显示一毫秒的空消息)visual-bell快速将其隐藏在钩子内部来摆脱该消息。alert-belldisplay -d1

例如,这里有一个钩子,它将通过将其背景颜色设置为白色十分之一秒来使状态行闪烁(尽管您可以更改您想要的任何类型的样式)。

set -g visual-bell on
set-hook -g alert-bell {
    display -d1
    set status-style bg=white
    run -b -d.1 -C {
        set -u status-style
    }
}

请注意,这些set命令设置和取消设置status-style 会议选项(覆盖任何全球的只要设置了该选项)。这意味着您使用全局选项 ( ) 对状态行所做的任何自定义set -g都不受此挂钩的影响。

答案3

我迭代了前面的示例,结果如下:

set -g monitor-bell on
set -g visual-bell on
set-hook -g alert-bell {
  display-message -d1
  setw @bell_flag 1
  run -b -d.5 -C {
    setw @bell_flag 0
  }
}
set-hook -g pane-focus-in {
  setw @bell_flag 0
}

然后,我使用自己的变量 @bell_flag 而不是内置变量 window_bell_flag。

相关内容