是否向"组织转发元素"添加额外操作(重新居中)



在组织模式中,调用org-forward-element的strikeM-}非常方便。

然而,匹配线总是位于底部。所以我必须手动执行(重新居中(。

如何将操作(重新居中(添加到org-forward-element

我尝试了一个装饰器解决方案,但不起作用。

(defun add-recenter(func)
(lambda ()
(func)
(recenter)))
(setq org-element-forward (add-recenter org-element-forward))

这似乎有效:

(advice-add 'org-forward-element :after (lambda () (recenter)))

我第一次尝试了(advice-add 'org-forward-element :after 'recenter),但没有成功,因为如果添加的建议函数(在本例中为recenter(是交互式的,则其interactive规范会覆盖旧函数(org-forward-element(的规范,这会导致错误,因为recenter生成一个参数,而org-forward-element取零个参数。


您的代码不起作用的原因是,在Emacs中,Lisp变量和函数位于单独的名称空间中,与Common Lisp一样,与Scheme不同。这有时被描述为";Lisp-2";,与";Lisp-1〃;。参见本文:http://ergoemacs.org/emacs/lisp1_vs_lisp2.html

基本上每个符号都有一个";值单元格";和一个";"功能细胞";。setq更改符号的值单元格,调用符号(如(foo)(访问其函数单元格。相应的Emacs Lisp代码类似于:

(defun add-recenter(func)
(lambda ()
(funcall func)
(recenter)))
(fset 'org-element-forward (add-recenter (symbol-function 'org-element-forward)))

这基本上就是上面的advice-add调用所做的。

最新更新