如何在切换buffer后让hook重新检查自己是否应生效

我想让我的逗号:, 在c-mode下变成逗号加空格,所以我写了以下代码:

(add-hook 'c-mode-hook 'trun_commas_into_commas_and_spaces)

(defun trun_commas_into_commas_and_spaces ()
  ", to , SPC."
  (interactive)
  (define-key evil-insert-state-map (kbd ",") (kbd "C-q , SPC")))

当我首先打开一个 .el 文件时,上面函数是不生效的,然后我切换到 .c 文件,函数生效,到目前为止一切正常。但是当我重新从 .c 文件切换到 .el 文件时,我发现这个函数还是生效。

有什么办法可以让hook在我切换buffer时重新检测一下这个函数是否应当启动吗?或者还有别的办法可以达成我的目的?

方法有很多,比如说用 make-local-variableevil-insert-state-map 变成 buffer-local 的,这样就不会影响其他 buffer 。

我还是不太明白,您可以具体说一下吗?

(add-hook 'c-mode-hook 'trun_commas_into_commas_and_spaces)

(defun trun_commas_into_commas_and_spaces ()
  ", to , SPC."
  (interactive)
  (make-local-variable 'evil-insert-state-map)
  (define-key evil-insert-state-map (kbd ",") (kbd "C-q , SPC")))

这样应该就可以了。

我将您的这段代码复制到我的配置中,但是结果还是和我在开始时描述的一样

(add-hook 'c-mode-hook 'trun_commas_into_commas_and_spaces)

(defun trun_commas_into_commas_and_spaces ()
  ", to , SPC."
  (define-key evil-insert-state-local-map (kbd ",") (kbd "C-q , SPC")))

我看了一下 evil 的 doc,原来 evil 有自己的本地变量

非常感谢,这段代码生效了