laub
1
比如我有一个大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,然后提取出叶子来。
有没有已经实现的这类包呢?
试试用一个简单的例子说明你的需求,很多术语的意思都不太清楚。
试试 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"))
laub
4
谢谢建议,我正在试用这个包,目前感觉它似乎是基于当前文件的。我想是否能找到一个不给予当前文件,可以我直接指定(甚至尚未打开到缓冲区)的文件。
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"))))))