我可以在Modeline打火机中使用图像吗?


12

我的模型太混乱了。我可以显示图片而不显示模式名称吗?

我可以使用unicode表情符号(例如🐍表示Python或🐓表示Coq),但是使用Emacs配置的某些计算机没有预先安装正确的字体(理想情况下,我也想在我正在编写的模式,因此我不能期望用户使用正确的字体设置)。

我尝试将:image显示属性添加到玩具次要模式的Modeline打火机中,但是在Modeline中什么也没出现:

(define-minor-mode my/test-mode
  "Test mode."
  :lighter (propertize " 🐓" 'display '(image :type imagemagick
                                             :file "/home/clement/.emacs.d/rooster.png")))

TWEmoji公鸡(https://raw.githubusercontent.com/twitter/twemoji/gh-pages/72x72/1f413.png)


有没有办法将字体带入配置?
PythonNut

2
是的,完全有可能做到这一点。参见nyan-mode。可能是图像太大而无法正确显示?
wasamasa

@wasamasa,太好了!你知道它的nyan模式如何吗?
克莱门特

如何用此图标替换模式行中的主模式字符串?
stardiviner

Answers:


11

模式行是从分段列表中呈现的,每个分段都有自己的特殊规则。有关详细信息,请参见模式行数据。符号部分包含使您的代码正常工作的重要提示:

除非将SYMBOL标记为“风险”(即它具有非“ nil”“风险本地变量”属性),否则将忽略在SYMBOL值中指定的所有文本属性。这包括SYMBOL值中的字符串的文本属性,以及其中的所有':eval'和':propertize'形式。(这样做的原因是安全性:可以从文件变量中自动设置非风险变量,而无需提示用户。)

我怀疑nyan-mode的执行方式不太理想,所以这是我的最小示例:

(defvar my-nyan-mode-lighter
  (list " " (propertize ":3" 'display
                        `(image :type imagemagick
                                :file ,(expand-file-name "~/nyan.png")))))
(put 'my-nyan-mode-lighter 'risky-local-variable t)

(define-minor-mode my-nyan-mode
  "Nyan mode"
  :lighter my-nyan-mode-lighter)

(my-nyan-mode)

之所以使用空格和图像的列表,是因为习惯上是用一个空格来启动打火机,以将其与前面的空格分开。


其实,您是否尝试过emacs -Q?在启用智能模式行的情况下,它可以很好地工作,但是当我从裸露的Emacs开始时,我无法使其工作。
克莱门特

嗯,是的。我会检查还缺少什么。
wasamasa

好,我知道了。显然,该包仅使用格式字符串内的字符串,而真正的交易是单独遍历模式行段,并且仅识别从头到尾经过适当处理的字符串,因此我选择了两个字符串的列表以使用分隔符。
wasamasa

布里恩,非常感谢!该列表诱使模式行格式化程序不应用:propertizedefault 的顶级mode-line-format
克莱门特

@wasamasa哇,太好了。现在,当您将鼠标悬停在图像上时,将出现一个通用菜单;如何将条目放入其中?将简单的字符串作为鼠标悬停消息也可以。
yPhil

4

好问题。

您可以尝试使用类似以下的东西作为打火机:(concat " " (propertize " " 'display (create-image img-file))),其中img-file图像文件的名称是。(第一个空格是为了将打火机与上一个打火机分开。)

好吧,我只是想,使用此代码,但它并没有为我工作。您可以尝试摆弄更多。邓诺是否有可能。

(defvar my-lighter-string
        (concat " " (propertize " " 'display (create-image "/path/to/an/image/file.png"))))

(define-minor-mode foo "..." nil my-lighter-string)

打火机只是显示为普通的空格字符-该display属性似乎并未受到尊重。

如果您对这个问题没有很好的答案,请考虑使用提交Emacs增强请求M-x report-emacs-bug

您当然可以做的一件事是在模式行字符串中使用一个或两个Unicode字符。您可以使用实际上是图形的字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.