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是怎么获取这种变量的值的。
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是怎么获取这种变量的值的。
修改的目的是什么,需要解决的问题是什么
因为org-num-mode
显示的序号(截图中浅色的数字)都是从1开始的,我之前都是自己手动写heading的序号。最近对org-transclusion有需求,手动写序号在transclude的时候不太合适,序号是乱的,如下图。
就我所知的话 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)
对以上代码求值之后就可以试试了:
可以工作 ,不过哪里好像多加了1.
可以改一下 my/org-num-format
,
把 (cons (+ (car numbering) st)
改成 (cons (+ (car numbering) st -1)
这个实现匹配很粗糙,不过能用就是了 我不知道标题过多会怎么样,这个实现在生成每个序号时都会查找一遍 #+MYNUM
可以啦,感谢感谢。先用着吧,如果慢的话,再想法修改,好像有个什么buffer local variable。
是的,要优化的话可以考虑每次在 org-num 需要更新的时候设定一个某个 buffer-local 变量,如果有需要的话按这个思路去改就行了
谢谢啦