向 org-forward-element 添加额外的操作(重新居中)?
Add extra action (recenter) to `org-forward-element`?
在 org-mode 中,点击 M-}
调用 org-forward-element
非常方便跳转。
但是,匹配线总是在底部。所以我必须手动执行(重新居中)。
如何将动作(重新居中)添加到 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
调用所做的。
在 org-mode 中,点击 M-}
调用 org-forward-element
非常方便跳转。
但是,匹配线总是在底部。所以我必须手动执行(重新居中)。
如何将动作(重新居中)添加到 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
调用所做的。