org-mode可以直接检索entry,然后遍历entry子树吗?

比如我有一个大org文件,里面有20几个一级entry, 每个一级下面又有若干二级entry,二级下面有若干三级entry…, 简言之就是这个大org文件是一个entry树,具体的文字内容就是末级entry下面的叶子。

现在我想查看某部分内容(也就是叶子),就是在这个org文件里面(默认展示模式是#+STARTUP: indent)从一级entry找到我要的某个entry,按tab键一次展开二级,找到我要的二级,然后按tab一次展开三级…,直到展开了我要编辑的叶子上面。

能不能这样,就是不在org文件里面这样基本操作,而是通过什么命令开一个临时窗口,指定我要提取的org文件,文件名输入后,就自动打开该文件的全部一级entry,我通过某种预定义的快捷键选定某个一级entry,就自动打开该一级下面的全部二级entry,直到打开到我需要的叶子,然后我就开始编辑。操作过程中可以随时回溯到上面任意一级父entry。操作感觉有点像Dired。

相当于capture功能的逆向功能。capture的功能我认为就是在不用让光标具体跑到某个文件某个entry下面,从“外部工作流中、异地”直接往目标entry下面写入一片叶子。我想要的这个功能也是不让光标具体跑到某个文件某个entry下面,从“外部工作流中、异地”直接定位到某个entry,然后提取出叶子来。

有没有已经实现的这类包呢?

imenu-list

试试用一个简单的例子说明你的需求,很多术语的意思都不太清楚。

试试 org-element.el / Org Syntax

(with-temp-buffer
  (insert "* foo\n"
          "** bar\n"
          "*** baz\n")
  (org-element-map (org-element-parse-buffer) 'headline
    (lambda (hl)
      (cons (org-element-property :level hl)
            (mapcar
             #'substring-no-properties
             (org-element-property :title hl))))))
;; => ((1 "foo") (2 "bar") (3 "baz"))

谢谢建议,我正在试用这个包,目前感觉它似乎是基于当前文件的。我想是否能找到一个不给予当前文件,可以我直接指定(甚至尚未打开到缓冲区)的文件。

imenu-list这个我先玩玩哦。

其实我的表达不怎么规范,不是术语来着。

我好好理解下你的代码,谢谢你!

这得懒到一定境界了才不想手动按"TAB",先执行下列的内容再打开个org文件试试:

(add-hook 'org-mode-hook (lambda () (org-shifttab 1) (goer-inspect-mode)))

(define-minor-mode goer-inspect-mode
  "org-mode可以直接检索entry,然后遍历entry子树吗? - Org-mode - Emacs China: https://emacs-china.org/t/org-mode-entry-entry/7729

- `org-forward-heading-same-level'(C-c C-f)下一个同级别的标题。
- `org-backward-heading-same-level'(C-c C-b)上一个同级别的标题。
- `outline-up-heading'(C-c C-u)上一级标题。
- `pop-to-mark-command'(C-u C-SPC)上一个标记点。"
  nil nil nil
  (when (eq major-mode 'org-mode)
    (let ((timer-symbol '*goer-inspect--timer*))
      (save-excursion
        (if (and (boundp timer-symbol)
                 (memq (symbol-value timer-symbol) timer-list))
            (progn
              (cancel-timer (symbol-value timer-symbol))
              (message "goer-inspect-mode OFF"))
          (setf (symbol-value timer-symbol)
                (run-with-timer
                 0 0.5
                 (lambda ()
                   (when (and (eq major-mode 'org-mode)
                              (org-at-heading-p))
                     (outline-hide-subtree)
                     (outline-show-children 1)
                     (outline-show-entry)))))
          (message "goer-inspect-mode ON"))))))

谢谢你,功能试用出来了。我好好学习下这段代码。