Emacs Lisp中的动态变量

Emacs Lisp中的动态变量,emacs,elisp,Emacs,Elisp,我有这样的代码 (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

我有这样的代码

(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个),是否可以将代码每行都压缩为类似以下内容:

(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))))

如果我在缩进变量列表中有缩进变量


是否需要使用宏或eval来执行此操作?

您可以尝试以下操作,而不是使用
setf
-构造

(set var (if (eq (eval var) 2) 4 2))
它应该可以工作,但我没有测试它。

您需要和


您不使用文件或目录局部变量有什么原因吗?@immerr这些是什么?
M-:(信息)(emacs)文件变量”)
M-:(信息)(emacs)目录变量”)
给出一个很好的调查。(按
M-:
然后从这里复制粘贴命令。然后按
enter
。您将直接进入右侧的信息节点。)@Tobias,在手册中查找此信息的另一种方法是
C-h r M“文件变量”
C-h r M“目录变量”
加上制表符的完成:)@Tobias我不明白局部变量在这里有什么帮助。
(set var (if (eq (eval var) 2) 4 2))
(defun work ()
  (interactive)
  (let ((var (cdr (assoc major-mode indent-vars))))
     (set var (if (eq (symbol-value var) 2) 4 2))))