Emacs 无法在Elisp中使用dolist设置全局变量

Emacs 无法在Elisp中使用dolist设置全局变量,emacs,elisp,Emacs,Elisp,我想排除不需要显示尾随空格的模式: (set-default 'show-trailing-whitespace t) (defmacro non-trailing-whitespaces-modes (mode) (let ((hook (intern (concat (symbol-name mode) "-mode-hook")))) `(add-hook ',hook (lambda () (setq show-trailing-whitespace nil)))))

我想排除不需要显示尾随空格的模式:

(set-default 'show-trailing-whitespace t)

(defmacro non-trailing-whitespaces-modes (mode)
  (let ((hook (intern (concat  (symbol-name mode) "-mode-hook"))))
    `(add-hook ',hook (lambda () (setq show-trailing-whitespace nil)))))

(defvar trailing-whitespace-exclude-modes '(eshell term help diff ztree org calendar syslog slime-repl Info ielm))

(dolist (m trailing-whitespace-exclude-modes)
  (non-trailing-whitespaces-modes m))
但是,我无法使用
dolist
添加钩子,但为每个模式添加idividual调用是有效的,例如:

(non-trailing-whitespaces-modes eshell)
(non-trailing-whitespaces-modes term)
(non-trailing-whitespaces-modes ielm
怎么了?

很简单:

(宏扩展(非尾随空格模式m))
;; (添加挂钩(引用m-mode-hook)
;;(lambda nil(setq显示尾随空格nil)))
您的任务实际上并不需要您使用宏。 把你的宏变成一个函数,你就完成了

下面是可以在
dolist
中使用的等效defun:

(取消非尾随空格模式(模式)
(let((hook(intern)(concat(符号名称模式)“-模式hook”))
(添加钩子钩子(lambda()(setq显示尾随空格nil‘‘‘‘)’))

我明白了。宏按原样接受参数符号。嗯,至少我对宏知道得更多。另外,通过转换成函数,您的意思是我应该创建一个钩子列表并向这些钩子添加函数吗?如果是这种情况,这就是我使用宏的原因,因此我不必编写
-mode hook
。如何在传递到宏之前对
m
进行求值?再多读一点,参数列表是用来定制语法的,所以没有办法计算。谢谢。函数解决方案很简洁。然而,如何解决宏的问题,在宏中参数符号是按字面理解的?也许你可以在这里加上一个eval,但那会破坏目的。宏不太适合这个任务。你是对的。我再考虑一下,我期望函数式的行为,但使用宏。这是不恰当的。当需要创建一个新的语法来减少代码复制或DSL时,我应该考虑使用宏。无论如何,我遵循Emacswiki中的示例:。有人提供了一个更合适的例子。