导出Org Mode文件时,如何自动添加链接到上级目录索引页的导航栏?
给Org Mode导出的页面自动添加上级索引页链接
不用折腾复杂的模板系统,几行Emacs Lisp就能搞定自动添加上级链接的需求,分两种场景给你方案:
方案一:导出HTML时自动添加(不修改原Org文件)
直接把下面这段代码加到你的Emacs配置文件(比如~/.emacs.d/init.el)里,之后导出HTML时会自动处理:
(defun org-export-add-parent-link (body backend info) "自动为非根目录的Org文件导出的HTML添加上级索引页链接" (when (eq backend 'html) (let* ((current-file (plist-get info :input-file)) (parent-dir (file-name-directory (directory-file-name (file-name-directory current-file)))) (parent-index-org (expand-file-name "index.org" parent-dir))) ;; 排除根目录文件,且上级目录存在index.org时才添加链接 (unless (string-equal parent-dir (expand-file-name "/")) (when (file-exists-p parent-index-org) (concat "<p><a href=\"../index.html\">← 返回上级索引</a></p>\n" body)))))) (add-hook 'org-export-filter-html-body-functions #'org-export-add-parent-link)
说明:
- 这段代码会在导出HTML的内容最开头插入一个返回上级的链接,不会改动你原有的Org文件
- 如果你的上级索引页不是
index.org(比如是README.org),把代码里的index.org和../index.html改成对应的文件名就行 - 链接文本
← 返回上级索引可以随便改成你喜欢的内容
方案二:手动给Org文件插入链接(适合需要保留链接在原文件里的情况)
如果希望原Org文件里也显示这个链接,可以用下面的函数,绑定快捷键或者手动运行:
(defun org-insert-parent-index-link () "手动给当前Org文件插入上级索引页的链接" (interactive) (let* ((parent-dir (file-name-directory (directory-file-name (file-name-directory buffer-file-name)))) (parent-index (expand-file-name "index.org" parent-dir))) (unless (string-equal parent-dir (expand-file-name "/")) (when (file-exists-p parent-index) (goto-char (point-min)) ;; 跳到第一个标题后面插入链接 (if (search-forward-regexp "^\\*+ .*" nil t) (insert "\n[[../index.org][← 返回上级索引]]\n") ;; 如果文件没有标题,就插入到开头 (insert "[[../index.org][← 返回上级索引]]\n\n"))))))
使用方法:
- 把代码加到配置文件里,重启Emacs或者用
M-x eval-buffer执行这段代码 - 打开需要添加链接的Org文件,运行
M-x org-insert-parent-index-link,链接会自动插入到第一个标题下方(没有标题就插在开头)
内容的提问来源于stack exchange,提问作者Preston Pan
相关产品推荐
相关产品推荐

