如何实现org文件只展开当前层级

在编辑和阅读org时,如何能做到,只展开当前编辑、阅读的正文内容,对于其他层级则折叠不显示出来。然后进入另一个标题后,自动展开当前标题,而隐藏其他标题的内容。

这个功能比较常用,应该有现成的函数、模式、配置,但找了半天时间都没有找到,有人见到过吗?谢谢指点!

org-use-speed-commands 设置成t,光标移到标题最开始,然后按 c 试试。可按?查看有哪些快捷键。

3 个赞

你指的是稀疏树吧,你可以搜org-sparse-tree的用法

谢谢。看英文像是这个,请问是不是原生emacs的才能用,我用doom和evil,按c没有效果。

我更习惯用这个

C-c C-x b runs the command org-tree-to-indirect-buffer (found in org-mode-map), which is an interactive compiled Lisp function in ‘org.el’.

我试了一下

  • <S-tab> org-shifttab
  • <tab> org-cycle

是可以的,以上需要光标在标题上。

刷新

此功能我想要已久!如上图我的orgcms的文章详情页做了一个刷新按钮,每次点击这个按钮org文件重新载入,光标就回到页面正文开始处,org文件展开折叠的状态不能保持。

我还发过 一个贴子 求教类似问题,目前的解决思路就是 记录光标当前位置,然后goto-char过去,在执行 'org-cycle

(require 's)
(defun cycle-at-point ()
  (interactive)
  (let* ((line-number (line-number-at-pos))
         (line (thing-at-point 'line))
         (trim-line (s-trim-left line)))
    (if (s-starts-with? "*" trim-line)
        (progn
          (org-overview)
          (goto-line line-number)
          (org-cycle)))))
(add-hook 'post-command-hook 'cycle-at-point)
1 个赞
  • fold other expecrt current headline
(defun org-show-current-heading-tidily ()
  (interactive)  ;Inteactive
  "Show next entry, keeping other entries closed."
  (if (save-excursion (end-of-line) (outline-invisible-p))
      ;;(progn (org-show-entry) (show-children))
      (progn (org-show-entry) (outline-show-children))
    (outline-back-to-heading)
    ;;(unless (and (bolp) (org-on-heading-p))
    (unless (and (bolp) (org-at-heading-p))
      (org-up-heading-safe)
      ;;(hide-subtree)
      (outline-hide-subtree)
      (error "Boundary reached"))
    (org-overview)
    (org-reveal t)
    (org-show-entry)
    ;;(show-children)))
    (outline-show-children)))
1 个赞