如何禁止一款软件仅使用一种(表情符号)字体?

如何禁止一款软件仅使用一种(表情符号)字体?

语境 :

我正在使用 Luke Smith 的st(suckless-terminal)版本幺半群大多数 Unicode 符号的字体,我注意到当它看到一些表情符号时通常会崩溃,比如U1F970st尝试加载彩色表情符号字体(目前是Apple Color Emoji,但对于其他用户来说默认是Noto Color Emoji,我尝试了两者,但有同样的问题)和崩溃:

X Error of failed request:  BadLength (poly request too large or internal Xlib length error)
  Major opcode of failed request:  139 (RENDER)
  Minor opcode of failed request:  20 (RenderAddGlyphs)
  Serial number of failed request:  850
  Current serial number in output stream:  883

如果我想避免这种崩溃,我有几个“不满意”的解决方案:

  • st根本不要使用。并且不要使用存在相同问题的任何其他软件。
  • 我安装了ttf-ancient-fonts-symbola.我可以使用它并且到处都有无色表情符号。
    使用此解决方案,我需要删除彩色表情符号,因为每次我有NotoApple使用彩色表情符号时,默认情况下都会采用它而不是Symbola.
  • 当我启动时禁用字体st.文件名之前的a足以隐藏它),然后再次启用它。看起来像是作弊,并且在启动其他软件时可能会导致问题。
  • 将表情符号存储在个人user文件夹中,创建另一个用户user_2,启动st并再次user_2成为user
    有没有办法做到这一点 ?如果是这样,这是避免崩溃的最简单方法吗?
  • 使用来自的解决方案卢克·史密斯 (Luke Smith) 的 St 在 Github 上
    If st crashes when viewing emojis, install libxft-bgra from the AUR.
    可能对我不起作用,因为我没有使用基于 Arch 的发行版
    (我目前使用的是 Ubuntu 20.04LTS。如果有人知道在其上安全使用 AUR 的方法,为什么不呢,但这似乎不太可能)。

我想做的事 :

告诉我的计算机允许Apple Color Emoji除我选择的软件之外的所有软件
(目前,它只是stpango-view我仅使用第二个软件进行一些测试),或使用其他软件xft),
并告诉st我使用它想要的任何“允许st”的东西对于表情符号,最好是Symbola.

或者告诉我的电脑至少Symbola默认为emoji家人拍摄。
如果可能,“默认情况下仅适用于st”。

我认为可以有一个解决方案font-config

我尝试过的事情(非详尽):

使用font-config,有一些标签,例如仅<match><test><string>st</string></test>…</match>针对目标(我可以告诉它“将字体设为粗体,仅适用于 st,仅适用于某些尺寸”。它在我的计算机上工作)。 还有其他标签,例如全局禁止一种(或多种,具有全局模式)字体。st

<selectfont><rejectfont><glob>/path/to/emoji/font</glob></rejectfont></selectfont>

我尝试将它们结合起来,但看起来不可能。这是一个不起作用的代码:(
字体在所有地方都被删除,而不是“仅用于st”)。

<match>
    <test qual="all" name="prgname" target="pattern" compare="eq"><string>St</string></test>
    <selectfont>
        <rejectfont>
            <glob>/home/user/.local/share/fonts/Apple*</glob>
        </rejectfont>
    </selectfont>
</match>

我认为<selectfont>标签不应该位于<match>标签内。


问题实际上是已知的,并且不仅与 相关st。我在这里尝试了几乎所有解决方案,但仍然出现崩溃。
我尝试过的示例,类似于某人对此问题提出的建议:

<match target="pattern">
  <test name="family"><string>emoji</string></test>
  <edit name="family" mode="append"><string>Symbola</string></edit>
</match>
<match target="pattern">
  <test qual="any" name="family"><string>Apple Color Emoji</string></test>
   <edit name="family" mode="assign" binding="same"><string>Symbola</string></edit>
</match>

但无论有没有它, 的输出fc-match --verbose :family=emoji | grep '^.family:
仍然是family: "Apple Color Emoji"(s)

当我用默认的等宽字体代替 时,monospace它仍然不起作用。我在这里做错了什么吗?emojiApple Color Emoji


我找到了设置默认字体的解决方案(如下例子),

<alias>
  <family>monospace</family>
  <prefer><family>Cantarell</family></prefer>
</alias>

我设置monospace为一种名为的随机字体Cantarell并且它有效。
它也适用于其他字体,包括但如果我写emoji而不是monospace,这里,它的作品!
因此,有一种方法可以更改默认字体。这是一个好的开始,但它不针对软件,并且似乎没有emoji以相同的方式对待。 如果我同时启用和,则表情符号的默认值是,并且此解决方案不允许我再次设置为默认值。sans-serifserifmonospace
Noto Color EmojiApple Color EmojiNoto Color EmojiApple Color Emoji

我还注意到此配置适用于sans-serif(而不是monospace),但不适用于sans,即使:family=sans每次:family=sans-serif我在 上尝试时都有类似的结果fc-match。同样的评论mono代替monospace.也许,这三个词的意思是sans,,,monoemoji有一些共同点。

但这“共同点”是什么?
有没有办法做出emoji像这样的作品monospace

相关内容