org mode 如何让 echo area 显示当前 heading 往上的所有 heading?

之前我用 spacemacs 的 org mode 配置, 光标放在一个 heading 上, echo area 就会显示这个 heading 的所有 parent heading. 比如 /a/b/c/d/e. 后来我自己不知道做了什么设置以后, 就没这个效果了, 想问问大家知道这个效果是咋弄出来的么?

这个应该不难实现吧

(defun test/show-heading-level ()
  (interactive)
  (let ((parent-level (- (org-outline-level) 1))
	(current-heading-path (org-entry-get nil "ITEM")))
    (while (> parent-level 0)
      (outline-up-heading 1)
      (setq current-heading-path (concat (org-entry-get nil "ITEM") "/" current-heading-path))
      (setq parent-level (- parent-level 1))
      )
    (message "%s" current-heading-path)
    ))

不过我现在也只会如何获取heading拼接出a/b/c这样子

上面你可以在org中,通过 M-x test/show-heading-level测试出来

那么接下来,我感觉是需要把这个代码hook到光标移动上,当然为了不影响主线程的使用,应该是要多线程,或者异步,监控光标的移动,然后显示出来。思路应该是这样吧

感谢, 我在你代码基础上改了. 配合 awesome-tray-mode 可以显示了:


  (defun my/awesome-tray-module-org-outline ()
    (test/show-heading-level))

  (defface my/awesome-tray-module-org-outline-face
    '((t :italic t))
    "Hello module face."
    :group 'awesome-tray)

  (add-to-list 'awesome-tray-module-alist
             '("org-outline" . (my/awesome-tray-module-org-outline my/awesome-tray-module-org-outline-face)))
(setq awesome-tray-active-modules '("org-outline" "location" "org-pomodoro" "date"))

(defun test/show-heading-level ()
  (let* ((parent-level (- (org-outline-level) 1))
	(current-heading-path (org-entry-get nil "ITEM")) (toppest nil)
  (last-heading current-heading-path)
  )
  (save-excursion
    (while (not toppest)
      (when (> (org-outline-level) 1)
        (outline-up-heading 1))
        (setq toppest (equal (org-entry-get nil "ITEM") last-heading))
        (setq last-heading (org-entry-get nil "ITEM"))
        (when (not toppest)
          (setq current-heading-path (concat (org-entry-get nil "ITEM") "/" current-heading-path))
          )
      )
    current-heading-path
    )))

效果是:

但是有这些问题:

  • 太长了没法显示
  • 没有 color, 不好看
  • 不在最左边
  • 只适用于 org-mode, 不适用于一般的 outline-mode

可以看看topsy能不能满足你要求,它是在header line显示的。topsy作者有另一个适用于orgmode的包。

我是用topsy加上自己写的适用于orgmode的函数,效果这样: 图片

1 个赞

require org-eldoc

org-eldoc-load

eldoc-mode 1

2 个赞

正解了, 就是这个! 感谢!

其实heading 层级太多了也显示不全, 还是要在 echo area 换行才行, 我自己魔改了一下 org-display-outline-path, 所有 heading 都能看全