gpt4 book ai didi

Emacs 次模式编程 : cancel toggle-off procedure?

转载 作者:行者123 更新时间:2023-12-02 01:37:37 25 4
gpt4 key购买 nike

我正在使用类似于这个最小示例的习惯用法和宏来编写自己的 Emacs 次要模式:

(define-minor-mode foo-mode
"Toggle Foo mode."
:init-value nil
:lighter " Foo"
:group 'foo
(if foo-mode
(do-enable-foo)
(do-disable-foo))
)

(defun do-enable-foo ()
"Enable foo minor mode"
(message "Enabling foo...")
(if test-something
(message "Foo enabled after disabling was canceled!")
(message "Foo enabled from scratch"))
)

(defun do-disable-foo ()
"Disable foo minor mode"
(message "Disabling foo...")
(if (not certain-situation)
(message "... done.") ; finish disabling foo
;; else forms:
(message "Need to cancel disabling foo!")
(foo-mode 1)) ; turning foo mode on again
)

在切换次要模式期间,当我不得不取消切换时,可能会出现'certain-situation。目前,我在想,因为我正在使用 define-minor-mode 宏,所以我无法摆脱困境,而只需要使用 (foo-mode 1)< 以编程方式再次打开模式 如代码所示。

如果我走这条路,我将不得不在启用函数 do-enable-foo 中以不同的方式处理这个问题——所以我的第一个问题是如何使用占位符 检测这种情况'test-something 在上面的代码中?

或者,是否有更简洁的方法来实现取消,例如,通过发出错误信号而不是 (foo-mode 1) 来防止模式切换通过?

最佳答案

如果你想取消“关闭”,而不是调用(foo-mode 1),你可以只(setq foo-mode t)

如果出于某种原因你真的想递归调用(foo-mode 1)来(重新)启用该模式,那么你可以通过以下方式进行:

(defvar foo-mode--reenabling nil)
....
(defun do-enable-foo ()
(if foo-mode--reenabling
...
...))
...
(defun do-disable-foo ()
...
(let ((foo-mode--reenabling t))
(foo-mode 1)))

关于Emacs 次模式编程 : cancel toggle-off procedure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com