【问题标题】:Add extra action (recenter) to `org-forward-element`?向“org-forward-element”添加额外的操作(重新居中)?
【发布时间】:2021-03-23 11:49:22
【问题描述】:

在组织模式下,调用org-forward-element 的罢工M-} 非常方便跳转。

但是,匹配行始终停留在底部。所以我必须手动执行(重新居中)。

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

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

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

【问题讨论】:

    标签: elisp


    【解决方案1】:

    这似乎有效:

    (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 调用所做的。

    【讨论】:

    • 非常感谢您的解决方案和善良和耐心的导师。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2017-04-04
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多