[求助] org如何自定义in-buffer setting并在elisp中获取自定义变量的值

org-num-mode总是从1开始,我有不少org文件,里面的第一个一级heading都不是1,我想自定义一个开始的序号,但org-num-mode似乎不支持。我想自定义一个 in-buffer setting, 比如

#+orgnum: 2

再通过emacs-lisp获取变量orgnum的值,然后在修改下org-num-mode的源码,让编号从orgnum的值开始。除了parse buffer的内容,不知道org是怎么获取这种变量的值的。

修改的目的是什么,需要解决的问题是什么

image

因为org-num-mode显示的序号(截图中浅色的数字)都是从1开始的,我之前都是自己手动写heading的序号。最近对org-transclusion有需求,手动写序号在transclude的时候不太合适,序号是乱的,如下图。

image

就我所知的话 org-num-mode 是完全自动的,解决这个问题的最好方式似乎是不在 headline 中手写序号…

这个包很有意思

现在的问题是org-num编号总是从1开始,我想从任意数值开始,比如2, 3,…

简单看了下源码,可以修改一下 org-num-format-function 这个变量,使用自己的函数:

假设我们在 org 文件中指定了某个选项,比如 #+MYNUM ,我们可以用正则匹配一下(也许 Org-mode 提供了某些获取这类选项的 api,这里为了方便简单正则一下算了)

(defun my/get-num-start ()
  (let (num)
    (save-excursion
      (save-restriction
	  (widen)
	  (goto-char (point-min))
	  (if (search-forward "#+MYNUM:" nil t)
	      (setq num (string-to-number
		       (buffer-substring (point)
					 (progn (end-of-line) (point)))))
	    (setq num 0))))
    num))

(defun my/org-num-format (numbering)
  (let ((st (my/get-num-start)))
    (org-num-default-format
     (cons (+ (car numbering) st)
	   (cdr numbering)))))

(setq org-num-format-function 'my/org-num-format)

对以上代码求值之后就可以试试了:

image

image

可以工作 :+1: :+1:,不过哪里好像多加了1.

可以改一下 my/org-num-format

(cons (+ (car numbering) st) 改成 (cons (+ (car numbering) st -1)

这个实现匹配很粗糙,不过能用就是了 我不知道标题过多会怎么样,这个实现在生成每个序号时都会查找一遍 #+MYNUM

可以啦,感谢感谢。先用着吧,如果慢的话,再想法修改,好像有个什么buffer local variable。

是的,要优化的话可以考虑每次在 org-num 需要更新的时候设定一个某个 buffer-local 变量,如果有需要的话按这个思路去改就行了

谢谢啦 :+1: :+1: