(分享)将一个 org-headline 拆分成一个文件

(defun my/org-export-topmost-parent-at-point ()
  "将光标所在标题的最上层祖先(及其所有子内容)导出为独立 .org 文件,并删除原文内容。"
  (interactive)
  (unless (org-at-heading-p)
    (user-error "请将光标放在一个 Org 标题上"))

  (save-excursion
    ;; 跳转到最顶层的祖先标题
    (while (org-up-heading-safe))
    (let* ((element (org-element-at-point))
           (title (org-element-property :raw-value element))
           (begin (org-element-property :begin element))
           (end (org-element-property :end element))
           (file-name (concat (my/org-sanitize-filename title) ".org"))
           (content (buffer-substring-no-properties begin end)))
      ;; 写入新文件
      (with-temp-buffer
        (insert content)
        (write-file file-name))
      ;; 删除原内容
      (delete-region begin end)
      (message "导出完成:%s" file-name))))

(defun my/org-sanitize-filename (title)
  "将标题转换为合法文件名。"
  (let ((cleaned (downcase title)))
    (setq cleaned (replace-regexp-in-string "[^[:alnum:][:space:]-]" "" cleaned))
    (setq cleaned (replace-regexp-in-string "[[:space:]]+" "-" cleaned))
    cleaned))
3 个赞

footnote 如何迁移?

不知道。我没考虑这个情形

那你的方案约等于 refile 或者手动 kill yank

对,把 5-6 步,压缩成一步完成。