我有一个可定制的变量timer-granularity,用于每次用户调用类似(timer-faster)或(timer-slower)之类的东西时增加/减少计时器的周期。但是,如果用户将timer-granularity设置为负数,那么调用(timer-slower)实际上会使计时器更快!
我希望约束这个变量的值,以便尝试将它设置为小于某个阈值的值是一个错误。
(setq timer-granularity 0.3) ;; okay
(setq timer-granularity -1) ;; error!这种行为可以实现吗?
发布于 2018-09-16 23:18:03
您可以将任何东西setq到任何东西(无论是否合理),但是您当然可以向customize接口添加验证。例如:
(define-widget 'integer-positive 'integer
"Value must be a positive integer."
:validate (lambda (widget)
(let ((value (widget-value widget)))
(when (or (not (integerp value)) (<= value 0))
(widget-put widget :error "Must be a positive integer")
widget))))
(defcustom foo 1 "Positive int"
:type 'integer-positive)您可以将错误处理添加到timer-faster和timer-slower中--但在这种情况下,我认为我相信用户知道他们在用elisp设置值时在做什么。
完整性:Emacs26.1确实引入了add-variable-watcher,它可以用来捕获“无效”的setq,但老实说,我认为将它用于如此琐碎的目的是不合理的。customize UI是正确的断言这些事情的地方。
发布于 2019-04-04 03:10:38
类似于@phils的答案--您可以直接这样做,而无需定义新的:type
(defcustom foo 42
"Foo..."
:type '(restricted-sexp
:match-alternatives ((lambda (x) (and (natnump x) (not (zerop x)))))))https://stackoverflow.com/questions/52358421
复制相似问题