首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs Lisp中的动态变量

Emacs Lisp中的动态变量
EN

Stack Overflow用户
提问于 2013-12-12 10:59:34
回答 2查看 262关注 0票数 2

我有这样的代码

代码语言:javascript
复制
(defun work ()
  (interactive)
  (case major-mode
    ('javascript-mode (setq js-indent-level (if (eq js-indent-level 2) 4 2)))
    ('css-mode (setq cssm-indent-level (if (eq cssm-indent-level 2) 4 2)))
    ('nxml-mode (setq nxml-child-indent (if (eq nxml-child-indent 2) 4 2)))
    (t (setq c-basic-offset (if (eq c-basic-offset 2) 4 2)))))

在缩进级别2和4之间的切换(我使用4个缩进空间,但工作需要2),是否可以减少代码的大小--每一行看起来都是一样的:

代码语言:javascript
复制
(defun work ()
  (interactive)
  (let ((var (case major-mode
                 ('javascript-mode 'js-indent-level)
                 ('css-mode 'cssm-indent-level)
                 ('nxml-mode 'nxml-child-indent)
                 (t 'c-basic-offset))))
     ;; like C pointers
     (setf (pointer var) (if (eq (pointer var) 2) 4 2))))

代码语言:javascript
复制
(defun work ()
  (interactive)
  (let ((var (cdr (assoc major-mode indent-vars))))
     (setf (pointer var) (if (eq (pointer var) 2) 4 2))))

如果我的缩进变量在缩进-vars中

我需要使用宏还是eval来完成这个任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 12:06:16

你需要符号值set

代码语言:javascript
复制
(defun work ()
  (interactive)
  (let ((var (cdr (assoc major-mode indent-vars))))
     (set var (if (eq (symbol-value var) 2) 4 2))))
票数 3
EN

Stack Overflow用户

发布于 2013-12-12 11:50:27

您可以尝试下面的操作,而不是setf-construct。

代码语言:javascript
复制
(set var (if (eq (eval var) 2) 4 2))

它应该有效,但我没有测试它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20541634

复制
相关文章

相似问题

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