有无方法通过icon区分org-mode中链接类型?

org笔记中有多种链接,希望能区分内部的笔记链接、本地文件以及网页链接,有助于检索、浏览的定位。

因为我的笔记链接基本都是id链接,所以单独设置了id的显示方式,用以简单区分:

(defface org-id-link
  '((t (:inherit org-link :foreground "Skyblue3")))
  "Sky Blue Link")

(org-link-set-parameters
 "id"
:face 'org-id-link)

最近看到有人分享使用的笔记软件(猜测是Bear?),觉得这种方式很直观

不知org-mode中能否通过icon区分链接类型?

1赞

在info中的elisp里搜索display

他是一个文字属性,可以显示图片

感谢!按照您的建议找到了这个 Display Margins - GNU Emacs Lisp Reference Manual ,似乎不是用于 defface 的属性,貌似是Overlay?没怎么找到实例,我再研究研究。

你看的是39.16.5

你应该看39.16.4

没找到实例 推荐你用 github.com

因为这不是一个优先级较高的需求,在探索过程不断遇到很多新的概念,近期不会投入大量时间在此。先记录一下我的思路,一方面希望大家得到解决方法或解决问题元方法的帮助,另一方面如果给新人带来如何解决emacs问题的思路就更好了。

目标:在链接的文字旁边附加图标,而不是完全取代链接

解决思路

  1. 直接搜索 org link with image/icon 没有结果
  2. 思考有没有类似修改方案,或许是 defface ? 查看defface 发现其属性主要是调整常规的大小、字体、颜色等
  3. 个人无法解决。论坛提问
  4. 在坛友指导下,搜索到 39.16 The display Property,快速浏览该节大纲
    • Replacing Specs: Display specs that replace the text. 排除。不是替代

    • Specified Space: Displaying one space with a specified width. 排除,不相关

    • Pixel Specification: Specifying space width or height in pixels. 排除,不相关

    • Other Display Specs: Displaying an image; adjusting the height, spacing, and other properties of text. 有可能有用

    • Display Margins: Displaying text or images to the side of the main text. 有可能有用

  5. 进一步浏览后两节,排查可能的选项
    1. 可能选项 the specified bitmap be displayed in the left or right fringes for that line
      (left-fringe  bitmap [face] )
      (right-fringe  bitmap [face] )
      
      在github搜索 left-fringe 找到 nschum/fringe-helper.el: Emacs: helper functions for fringe bitmaps,进一步找到使用场景: 图片 结论:fringe是行首或行尾的 边缘 ,不适合在文本链接旁边加图标的场景
    2. 可能选项 image descriptor, When used as a display specification, it means to display the image instead of the text that has the display specification. (image . image-props) 是替代文本?需要进一步考察
    3. 可能选项 A margin display specification looks like ((margin right-margin) spec ) or ((margin left-margin) spec ) . Here, spec is another display specification that says what to display in the margin. Typically it is a string of text to display, or an image descriptor.
  6. 理解应用场景,可能类似的实例找到 [想法]Org agenda 显示时间块
    • 确定使用 propertize 方法

作为新手,困难主要在于:

  1. 不能清晰地定义问题,不知道该用什么关键词去搜索
  2. 因为使用场景少,不能联想到类似案例
  3. 很多时候一个问题带来更多的问题,不理解的术语源源不断

已经由热心的 stardiviner 解决,感谢!

1赞

这不是一个需要投入大量时间的问题

你看到了叶子,却没看到一个树枝上可以有两个叶子

你要写代码 而不是 考察

这个特性挺有意思,如果写出来了,希望楼主可以提交到Org Mode,这样大家都能用。我觉得这个功能还是挺有用的。

链接是用text-property来显示的,找到这个处理函数,在最开头添加一个 unicode 图标文字不就可以了,为什么必须总图片呢?

感谢您的建议,确实由于没有系统了解elisp,我很难全面地看到一个问题。最终解决问题肯定是要写代码,但是我认为首先要明确elisp的什么功能模块适用当前的场景,否则, 我看到 left-fringe 之后觉得直接开始写代码。写完之后发现不能实现我的需求,这个过程肯定是有成长的,但是我个人的目标不是elisp的代码精进,也不是工具的打磨,而是用顺手的工具推进我的项目

经验丰富的人,比如您,很快就能定义问题,知道用什么方法来解决问题,很快就能进入写代码环节,这是您丰富的经验的积累。新手如我,可能在定义问题上就需要花费大量时间,这个问题远超自己现有的知识范围,最好的情况是有现成的我不知道的方案,其次是有经验的人指导可行方向,最差是完全靠自己补足知识鸿沟。请理解,在时间有限的情况下,如果打磨工具花费时间过多,我还是会将主要精力投入在我的项目。

啰嗦一通,对于解决这个实际的问题没有太多帮助,但我一直觉得,如何解决问题的方法也很重要。简单陈述自己现在的想法,如果管理员觉得无益于社区建设,请自由处置。

没有说必须是图片,我一开始的想法是用all-the-icon的icon。现在的情况是我还没有找到用什么功能定义这个属性。:joy:

您说的text-property 是类似这里的应用么?

对的,用文本图标比较简单,因为它是文本,用图片的话稍微复杂一点

https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Properties.html#Text-Properties

用两天时间写了一个小插件,能够达到楼主的效果了。其实很早就有写这样一个能够显示链接信息的插件,但是一直没动手,后来看到楼主发的帖子,结合不断增长的Org Mode的代码经验,发现现在有可能写了,于是写了一个,还比较原始。欢迎这里的各位大神PR。

效果图如下

7赞

天哪,我真不知该如何表达我的感谢之意!太赞啦! 目前我的显示效果

主要问题:

  1. 一些图标貌似图文不符
  2. 显示的位置不居中,可以用 :height :v-adjust 来调整?

如果能用类似 org-agenda-category-icon-alist 自定义指定类型的图标,上述其实都不是问题啦

我现在的问题是开启了link-beautify之后就关不掉了😂 还在熟悉该怎么调试您的代码

一些图标貌似图文不符

这个问题我在截图中也说道了,all-the-icons的问题。目前还没有解决办法。这个issue在all-the-icons上面很久了。

显示的位置不居中,可以用 :height :v-adjust 来调整?

是的,你可以在代码中相应调整,欢迎提交PR :grinning:

如果能用类似 org-agenda-category-icon-alist 自定义指定类型的图标

本来是像用类似 alist 的自定义变量来实现的,但是发现代码上我还无法实现,里面涉及到变量的传递,比如 path ,还有一些条件判断。不知道哪位大神有办法可以调整代码实现。

我现在的问题是开启了link-beautify之后就关不掉了

这个还没有实现,目前只知道 org-link-set-parameters ,不知道怎么 unset ,我去看过 org-link-set-parameters 的源代码,没怎么看明白。技术还不够厉害。不过我已经预留了 org-link-unset-parameters 函数的位置。有可能的话,我会去问问 Org Mode 邮件列表的维护者 Nicolas 是否在 org 里面实现一个提供给用户。

font-lock 只能用 (message ...) 这种原始方法,我也是问的 John Kitchin, 他说的。所以我特意在代码中保留了 (let ((debug1 (message var)) ...) 这种注释掉的遗留代码。就是为了方便自己调试,也方便后来的人调试。

1赞

我也不是很明白 :joy: 不过如果你有兴趣的话,这个功能 org-toggle-time-stamp-overlays 实现的是类似功能

感谢,这个确实实现了重新font-lock的功能,但是在 org-link-parameters 上面 :activvate-func 还是存在,还是需要从 org-link-parameters 上面移除 :activate-func 才行。然后再执行类似 org-toggle-time-stamp-overlays 的功能。我再看看源代码,不行就去问问Nicolas。谁叫我笨呢。

@yuchen-lea 之前是设置 :activate-funcnil,没效果,现在设置为 t 就可以了。最新的更新实现了真正的minor-mode toggle。

修复了 org-link-beautify 当链接在其他特殊地方导致的破坏 font-lock 的情况。采用检测当前 context 来选择是否跳过。

— UPDATE —

重新载入后,我发现这个更新解决了其他我在Issues里的所有问题。哈哈哈。开心