首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在emacs中约束变量为正变量?

如何在emacs中约束变量为正变量?
EN

Stack Overflow用户
提问于 2018-09-16 21:13:03
回答 2查看 199关注 0票数 1

我有一个可定制的变量timer-granularity,用于每次用户调用类似(timer-faster)(timer-slower)之类的东西时增加/减少计时器的周期。但是,如果用户将timer-granularity设置为负数,那么调用(timer-slower)实际上会使计时器更快!

我希望约束这个变量的值,以便尝试将它设置为小于某个阈值的值是一个错误。

代码语言:javascript
复制
(setq timer-granularity 0.3)  ;; okay
(setq timer-granularity -1)  ;; error!

这种行为可以实现吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-16 23:18:03

您可以将任何东西setq到任何东西(无论是否合理),但是您当然可以向customize接口添加验证。例如:

代码语言:javascript
复制
(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-fastertimer-slower中--但在这种情况下,我认为我相信用户知道他们在用elisp设置值时在做什么。

完整性:Emacs26.1确实引入了add-variable-watcher,它可以用来捕获“无效”的setq,但老实说,我认为将它用于如此琐碎的目的是不合理的。customize UI是正确的断言这些事情的地方。

票数 5
EN

Stack Overflow用户

发布于 2019-04-04 03:10:38

类似于@phils的答案--您可以直接这样做,而无需定义新的:type

代码语言:javascript
复制
(defcustom foo 42
  "Foo..."
  :type '(restricted-sexp
          :match-alternatives ((lambda (x) (and (natnump x)  (not (zerop x)))))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52358421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档