RJT*_*JTK 1 variables emacs numbers
我有一个自定义的变量timer-granularity用于增加/减少定时器的周期每个用户调用像时间(timer-faster)或(timer-slower).但是,如果用户设置timer-granularity为负数,则调用(timer-slower)实际上会使计时器更快!
我想约束这个变量的值,以便尝试将其设置为低于某个阈值的任何值,这是一个错误,例如
(setq timer-granularity 0.3) ;; okay
(setq timer-granularity -1) ;; error!
Run Code Online (Sandbox Code Playgroud)
这种行为是否可以实现?
你可以做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)
Run Code Online (Sandbox Code Playgroud)
您可以添加错误处理timer-faster和timer-slower- 但在这种情况下,我认为我只是相信用户知道他们正在做什么,如果他们在elisp中设置值.
为了完整性:Emacs 26.1确实引入了add-variable-watcher可用于捕获"无效"的内容setq,但老实说,我认为将其用于这样一个微不足道的目的是不合理的.该customizeUI是要断言这种事情的正确位置.