终端日历 khal:在令人敬畏的 wm 中使用 naughty.notify 生成时突出显示当前日期

问题描述

当鼠标按下很棒的 wm 中的认 textclock 小部件时,我正在尝试生成 khal,一个终端日历。

local cal_notification
mytextclock:connect_signal("button::release",function()
        if cal_notification == nil then
            awful.spawn.easy_async(noisy,function(stdout,stderr,reason,exit_code)
                    cal_notification = naughty.notify{
                        text = stdout,width = auto,destroy = function() cal_notification = nil end
                    }
                end
            )
        else
            naughty.destroy(cal_notification)
        end
    end)

不幸的是,在执行时,khal 的所有语法高亮都消失了。 有没有人知道如何在不丢失“外观”的情况下生成通知

编辑: 这可能发生在任何其他终端日历上,例如我认为 cal。

使用 grep --color -EC6 "$(date +%e)" 它仍然不输出颜色。 使用 khal 的强制 --color 语句,它在每个突出显示的字符前输出 001b 1m。

解决方法

khal 等 CLI 应用程序使用所谓的 ASCII escape codes 对彩色突出显示进行编码。其中一部分是您在“每个突出显示的字符之前输出 001b 1m”时看到的内容。 这些序列中的字符比您在此处粘贴的字符多,但这些字符很可能被 Lua 的字符串处理或 awesome 渲染所吞没。

这里的问题是,这种使用 ASCII 转义码突出显示文本的方式是终端和终端模拟器特有的。其他应用程序不使用或实现它们。

具体来说,文本标记是通过 Pango Markup 完成的。因此,为了让您的通知保留由 khal 创建的突出显示,您需要创建一个转换层,将 ASCII 转义码转换为 Pango 标记。

另一个挑战是终端中的颜色使用基于主题的系统。终端配置了一组特定的颜色,转义码只是在该列表中索引。它们本身不保存任何实际的颜色信息。但是,对于 Pango,您需要在标记中指定实际的颜色值。