Dunst - Arch Linux 中文维基

跳至內容

# Dunst

出自 Arch Linux 中文维基

相關文章

- 桌面通知程序

翻譯狀態：

- 本文（或部分內容）譯自 Dunst，最近一次同步於 2026-03-25，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

Dunst 是大多數桌面環境提供的通知守護程序的輕量級替代品。

dunst 可以在 X11 或 Wayland 下運行。

## 安裝

安裝 dunst包 軟體包。

示例配置文件位於 `/etc/dunst/dunstrc`。將其複製到 `~/.config/dunst/dunstrc` 並進行編輯。

啟動 `/usr/bin/dunst`，確保您的窗口管理器或桌面環境在啟動/登錄時啟動 Dunst 。

注意：您似乎無需手動啟動 Dunst，因為當應用程式向 D-Bus 發送通知時，dbus-daemon 會自動啟動 Dunst。然而，通知服務經常會安裝多個守護進程，且無法知曉應當自動啟動哪一個。dbus-daemon 的維護者曾明確警告不要依賴自動啟動多提供者服務。

## 外觀

可為通知內的文本添加樣式如粗體、斜體、刪除線或下劃線。完整參考見 Pango 標記。若 `markup` 被設為 `none`，Pango 就會從通知中被移除。

通知的格式可被明確規定，選項如下：

    %a  应用名称
    %s  摘要
    %b  主体内容
    %i  图标名称（包含路径）
    %I  图标名称（无需路径）
    %p  进度（需要另外设定，[0%] - [100%]）

它們可以與 HTML 標籤結合起來使用。例如將 `format` 設為 `<b>%s</b>\n%b` 來顯示加粗的摘要、換行和無格式的主體內容。

### 設定圖標

在配置文件的 `global` 節 `icon_path` 項中設定圖標。需要狀態（status）、設備（device）和傳統（legacy）圖標。默認情況下，Dunst 會查找 gnome-icon-themeAUR 圖標。若要使用 adwaita-icon-theme包替換 gnome-icon-theme，請改為：

    icon_path = /usr/share/icons/Adwaita/16x16/status/:/usr/share/icons/Adwaita/16x16/devices/:/usr/share/icons/Adwaita/16x16/legacy/

除了直接指定圖標文件夾的路徑，您也可以在 `global` 節中直接指定圖標主題。若如此，您需要設置 `enable_recursive_icon_lookup=true` 以在主題主文件夾的子文件夾中進行搜索。

例如：

    icon_theme = Papirus
    enable_recursive_icon_lookup = true

## 快捷鍵

使用 dunstctl 控制 Dunst。您可以更新您的快捷鍵來使用 dunstctl。

例如，關閉所有通知：

    $ dunstctl close-all

顯示歷史記錄：

    $ dunstctl history-pop

## 規則

你可以在你的 dunstrc 文件中創建匹配某些通知的規則，然後執行某些操作比如運行一個腳本。

### 匹配通知

要創建新的規則，請在您的配置文件中創建一個自定義命名的節， 您可以使用屬性 appname（應用名）、summary（摘要）、body（主體）、icon（圖標）、category（類別）、match_transient（瞬態通知）和 msg_urgency（緊急程度）來匹配通知。 支持通配符。請在#腳本查看示例。 用 `-print` 選項啟動 Dunst 以在通知中尋找有用的信息來編寫合適的規則。關於各屬性的詳細解釋，請參閱 dunst(5) § filtering。

### 修改格式

當匹配到一條通知時，您可以對其格式進行修改，只需修改 `format` 選項。這在您想完全忽略某些特定的通知時尤其有用。若如此做，您只需將 `format=""` 行添加到您的規則（該規則會把匹配到的通知改成空的）。

另一個有用的特性是您可以完全將某些通知從歷史記錄中排除，例如您想將 Dunst 用作音量指示器，只需將 `history_ignore=yes` 行添加到相應的規則。

### 腳本

Dunst 可以根據某些通知內容來運行腳本，以下是一個當某來自 pidginAUR 的人登錄時，Dunst 運行腳本的示例：

    [signed_on]
       appname = Pidgin
       summary = "*signed on*"
       urgency = low
       script = do_something.sh

指定的腳本將按以下參數的順序來匹配：appname（應用名）、summary（摘要）、body（主體內容）、icon（圖標）、urgency（緊急程度）。

## 暫停 Dunst

有兩種方法暫停 Dunst：

使用 `dunstctl`
  您可以執行 `dunstctl set-paused true/false/toggle` 來禁用/重新啟用/切換通知狀態。執行 `dunstctl is-paused` 來查看 Dunst 是否在運行/暫停。

使用 `killall`
  執行 `killall -SIGUSR1 dunst` 來禁用，執行 `killall -SIGUSR2 dunst` 來重新啟用。

一旦暫停，Dunst 會保留所有通知。再次啟用 Dunst 後，將顯示所有保留的通知。

## Dunstify

Dunstify 是 notify-send 命令的替代品， 它完全兼容 notify-send 且可以與其一起使用，但它提供了更多功能。

除了 notify-send 中可用的一些選項，Dunstify 還提供一些其他特性如 ID 和 action（行為）。

### 替換通知

您可以給 dunstify 加上 `-r ID` 選項來給一條通知分配 ID，其中 `ID` 必須是整數。 如果擁有某 ID 的通知已經存在，那麼它將會被具有相同 ID 的新通知替換。 您亦可使用 `dunstify -C ID` 來關閉一條通知。

然而，在大部分情況下，使用標籤（tag）比控制 ID 更可取，因為後者有很多陷阱[1]。在調試或面對非常複雜的通知發送者時，請考慮替換 ID[2]。

具有相同標籤（tag，本例中的 tag 是 test）的通知會被替換且無視 ID。

    $ dunstify -h string:x-dunst-stack-tag:test Test -A 'tested,default'
    $ dunstify -h string:x-dunst-stack-tag:test Testing

### 行為

您可以從一個或多個 `--action=action,label` 參數中定義可以直接調用的行為。 例如：

    $ dunstify --action="replyAction,reply" "Message received"

然後用戶可以通過 Dunst 的上下文菜單來做出某些行為，發送到 dunstify 的某些請求會被阻止除非通知消失或一個行為已被選擇。在前一種情況下，若通知超時，則 Dunstify 會返回1；若通知被手動關閉，Dunstidy 會返回2[3]。而在後一種情況下，會返回在上下文菜單中選擇的行為。

除了通過上下文菜單調用行為，您也可以通過滑鼠事件調用行為[4]。這可使 Dunst 更具交互性，這裡也建議這樣做。當通知只有一個行為或一個行為被命名為 「default」 時，您可以單擊滑鼠中鍵來調用這個行為。（Dunst 默認如此，當然您也可以在 `dunstrc` 中定義 `mouse_middle_click = do_action`).

    reply_action () {}
    forward_action () {}
    handle_dismiss () {}

    ACTION=$(dunstify --action="default,Reply" --action="forwardAction,Forward" "Message Received")

    case "$ACTION" in
    "default")
        reply_action
        ;;
    "forwardAction")
        forward_action
        ;;
    "2")
        handle_dismiss
        ;;
    esac

## 提示與技巧

### 將 dunstify 用作音量/亮度水平指示器

您可以使用替換 ID 功能來實現簡單的音量或亮度指示器通知，如圖所示 [5]。

要實現音量指標，請將以下腳本放在 `PATH` 中的某個位置。

    #!/bin/bash
    # changeVolume

    # Arbitrary but unique message tag
    msgTag="myvolume"

    # Change the volume using alsa(might differ if you use pulseaudio)
    amixer -c 0 set Master "$@" > /dev/null

    # Query amixer for the current volume and whether or not the speaker is muted
    volume="$(amixer -c 0 get Master | tail -1 | awk '{print $4}' | sed 's/[^0-9]*//g')"
    mute="$(amixer -c 0 get Master | tail -1 | awk '{print $6}' | sed 's/[^a-z]*//g')"
    if [[ $volume == 0 || "$mute" == "off" ]]; then
        # Show the sound muted notification
        dunstify -a "changeVolume" -u low -i audio-volume-muted -h string:x-dunst-stack-tag:$msgTag "Volume muted"
    else
        # Show the volume notification
        dunstify -a "changeVolume" -u low -i audio-volume-high -h string:x-dunst-stack-tag:$msgTag \
        -h int:value:"$volume" "Volume: ${volume}%"
    fi

    # Play the volume changed sound
    canberra-gtk-play -i audio-volume-change -d "changeVolume"

現在只需將 `changeVolume 2dB+ unmute` 等綁定到某個熱鍵上即可。您可能還想讓 dunst 在歷史記錄中忽略此類通知，請參閱#修改格式。

### 覆蓋以前的通知

對於某些通知（例如聲音或亮度），你可能希望覆蓋之前的通知。你可以使用#替換通知中的 Dunst 方法，也可以參考桌面通知程序#替換之前的通知，了解更一般的示例。

## 疑難解答

### Dunst 無法通過 systemd 啟動

在無登錄管理器的情況下使用 Dunst 時，`DISPLAY` 環境變量可能不會被正確設置[6]。

欲修復，請添加以下行到您的 `.xinitrc` 文件：

    systemctl --user import-environment DISPLAY

提示：這在最近版本的 systemd 上會自動作為 `/etc/X11/xinit/xinitrc.d/50-systemd-user.sh` 的一部分被執行。

### 字體大小不匹配（表情比字大）

這是因為 fontconfig包 沒有重新調節位圖字體。您通常會在某些表情符號上注意到這個問題。（例如：noto-fonts-emoji包 ）

要解決這個問題，只需執行：

    # ln -s /etc/fonts/conf.avail/10-scale-bitmap-fonts.conf /etc/fonts/conf.d/

並重啟 Dunst。

### 部分應用程式的通知不遵守超時規則

這個問題具體表現為所有緊急級別的通知超時配置為 30 秒，但是來自特定應用如 Discord 、Mattermost 和 GitLab 的通知消失得很快（典型表現為3秒）。

您可以在上游找到更多細節：issue #276。

這是由於通知被強制關閉而發生的。要解決這個問題，您需要引入一個名為 `ignore_dbusclose` 的特殊參數。您可以通過啟用該參數來忽略通過 D-Bus 發送的 `closeNotification` 消息。啟用該參數可以確保應用程式通知遵循 Dunst 的配置。默認情況下，該參數是關閉（被設定為 false）的。

## 參見

- Dunst 官方網站

- Dunst Github 倉庫

- Dunst FAQ

- Dunst 文檔

分類：​

- X 伺服器

Dunst
新增話題