【需求帖】编辑markdown/org时左侧显示大纲

代码拆分成多个文件

编写代码时会将代码拆分成多个文件,而不是讲所有代码都放在同一个文件内。否则,代码量大的话,就很难管理,很难快速找到自己该进行编辑的地方。在VS Code这类GUI编辑器中,会有文件导航栏,以方便快速切换文件。

文章也应该拆分成章节编辑,不互相干扰

而写文章的时候,有和写代码同样的问题。如果文章太长、章节层次多:

  • 每次编辑的时候都需要先大幅度上下翻阅一下,才能找到自己应该插入新内容的位置;
  • 而且编辑一个章节的时候,前后章节的内容仍然会出现,会有干扰。

focus

org-mode下的org-narrow-to-subtree功能可以将编辑界面聚焦到当前章节,不显示前后的章节,正是我想要的功能。 但是切换章节就不怎么方便了,需要先退出org-narrow-to-subtree,然后将光标逐渐移动到另外一个章节,再org-narrow-to-subtree。比较麻烦。

加一个大纲的导航栏

我希望org-mode具有org-narrow-to-subtree功能的同时,在编辑界面左侧有个导航栏。当点击某个章节,编辑界面就聚焦到这个章节,不显示其他相同等级的章节。

求助

Emacs社区这么大,发展这么久,普通的需求常常好几年前就有人实现了。之前在mac环境下特别喜欢可以彻底摆脱鼠标的NV(Notation Velocity)编辑器,后来用上Emacs,我想NV的功能完全可以通过一个插件在Emacs上实现,结果还真找到了,然后一直在使用,非常喜欢。

所以求助社区里的朋友,有没有见过实现我这个需求的插件。

imenu-list 就可以

只是需要几行配置代码

楼下有答案

1 个赞

感谢!~

尝试了一下,跟我的需要很接近。

但是不能它只能展示二级标题,不能显示三级标题……

点击章节之后,虽然可以跳转到这个章节,但是前后的章节仍然会显示

我期望能够隐藏前后的章节,减少干扰

org-imenu-depth

treemacs 也可以。如果楼主既要显示文件树,又要显示大纲,用 treemacs 就可以了。

在Imenu-list.el找了半天,感谢!

我去体验了一下,开启narrow后treemacs的跳转功能直接失效

简单来说,我感觉楼主的需求应该是比较简单的:就是在org的多个header里面跳来跳去。

  1. 选择的时候可以选择全文所有的header。
  2. 跳到对应的header的时候,就直接narrow到它。

其实综合一下上面大家的回答就可以了。

尝试了一下,跟我的需要很接近。

但是不能它只能展示二级标题,不能显示三级标题……

这个问题,可以自己设置,比如这样设置为可以显示三级:

(setq org-imenu-depth 3)

使用imenu的时候,如果当前是narrow状态,跳转不能成功。

其实就是在imenu蹐之前调一下widen,跳成功后,再narrow一下就可以了。

我用的ivy,所以我直接把 counsel-imenu拿来改了一下,我试了一下是可以的:


(defun peng-org-special-imenu ()
  "Jump to a buffer position indexed by imenu."
  (interactive)
  (unless (featurep 'imenu)
    (require 'imenu nil t))
  (let* ((imenu-auto-rescan t)
         (imenu-auto-rescan-maxout (if current-prefix-arg
                                       (buffer-size)
                                     imenu-auto-rescan-maxout))
         (items (imenu--make-index-alist t))
         (items (delete (assoc "*Rescan*" items) items))
         (items (counsel-imenu-categorize-functions items)))
    (ivy-read "imenu items: " (counsel-imenu-get-candidates-from items)
              :preselect (thing-at-point 'symbol)
              :require-match t
              :action (lambda (candidate)
                        (with-ivy-window
                          ;; In org-mode, (imenu candidate) will expand child node
                          ;; after jump to the candidate position
                          
                          (widen) ; 这里先widen
                          (imenu (cdr candidate)) ; 这里跳转
                          (org-narrow-to-subtree) ; 这里再次narrow
                          
                          ))
              :keymap counsel-imenu-map
              :caller 'counsel-imenu)))

顺便说下,之前搞ivy的时候,搞过中文的匹配。我给它写了个wiki 在这里

如果楼主配置成功了,可以直接以中文的拼音前缀来匹配中文。连输入法都不用切换啦 :slight_smile:

2 个赞

imenu-list-after-jump-hook