Answers:
尽管@Dan的答案是一个很好的解决方案,但这不是必需的。Emacs 在这里使用alist的原因之一是,有了alist,您可以简单地将一个新元素添加到列表的前面,它将在列表的下方阴影匹配。
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
使用setf
到位,以改变该值:
(setf (cdr (rassoc 'javascript-mode auto-mode-alist)) 'js2-mode)
如果要替换列表中的值,则setf
需要使用通用机制。有关处理的更惯用的方法auto-mode-alist
,请参见@Drew的答案(以及他对阴影的解释)。
setf
应该向Java专家展示。)
setf
在Common Lisp中一直使用它,但是在elisp中遇到它的频率要低得多。
setf
与CL相比,Elisp 很少使用...
实际更改缺点单元格的最快方法可能是 setcdr
setcdr is a built-in function in `C source code'.
(setcdr CELL NEWCDR)
Set the cdr of CELL to be NEWCDR. Returns NEWCDR.
值得注意的是,setf
旧版Emacsen中没有此功能,但setcdr
确实如此。
*** Welcome to IELM *** Type (describe-mode) for help.
ELISP> (setq tmp '((one . 1) (two . 2) (three . 4)))
((one . 1)
(two . 2)
(three . 4))
ELISP> (setcdr (assq 'three tmp) 3)
3 (#o3, #x3, ?\C-c)
ELISP> tmp
((one . 1)
(two . 2)
(three . 3))
setf
?
OP要求一种解决方案,该解决方案处理具有字符串键的列表。要解决这个问题,请参阅此问题。如果偶然地您只需要使用符号键来处理列表,那么从Emacs 25开始,您可以使用:
(setf (alist-get <key> <alist>) <value>)
更换cdr。如果您可以访问Emacs 26,则该技术可以使用字符串键,如下所示:
(setf (alist-get "\\.js\\'" auto-mode-alist nil nil #'equal) 'js2-mode)
请注意,Emacs 26中还有其他处理字符串键的方法。看到上面提到的这个问题。
(setf (alist-get "\\.js\\'" auto-mode-alist nil nil #'equal) 'js2-mode)
应该可以工作(不过需要Emacs 26)。
alist-get
string "\\.js\\'"
,但是 alist-get
基于assq
,因此您在答案中声明的字符串将无法使用。
如果您知道您将不再使用javascript-mode,请让auto-mode-alist保持不变并添加到您的init.el中
(defalias 'javascript-mode 'js2-mode "Some handy explanation goes here.")
javascript-mode
,真的: javascript-mode
只是js-mode
(默认情况下)的别名,它是专门通过这种方式完成的,以便用户可以根据自己的喜好,按照您的建议进行操作(如果愿意js2-mode
,不会失去使用能力js-mode
)。
js-mode
(例如,与之相反perl-mode
)。