我以为这样做很简单,但是我被困住了。
当我在〜/ .emacs中添加 octave-mode 时:
(add-to-list 'auto-mode-alist ("\\.m$" . octave-mode))
打开一个Octave文件.m,我转而以OBJC主要模式结束...这是因为auto-mode-alist包含:
(\.m\' . objc-mode)
在A列表中排在首位。
我尝试过:
(setq auto-mode-alist (delete '( \.m\' . objc-mode) auto-mode-alist))
我什至尝试过:
(setq ama '())
(setq objc '(\.m\' . objc-mode))
(dolist (item auto-mode-alist)
(if (not (eq (cdr (last objc)) (cdr (last item))))
(setq ama (list ama item))))
(setq auto-mode-alist ama)
关于从清单中删除objc模式或确保八度模式取代它的任何建议都很好。
答案 0 :(得分:7)
这里基本上有两个问题。一种是如何从列表中删除元素。另一个是如何以八度模式自动打开*.m
文件。您无需删除该元素即可覆盖它。提供的表格
(add-to-list 'auto-mode-alist ("\\.m$" . octave-mode))
导致错误。相反,您应该使用
(add-to-list 'auto-mode-alist '("\\.m$" . octave-mode))
或更妙的是:
(add-to-list 'auto-mode-alist '("\\.m\\'" . octave-mode))
这两种形式会将元素添加到关联列表的开头,这意味着将首先对文件名进行检查,而永远不会将其添加到列表下方的objc-mode元素。
如果您确实要从列表中删除元素,则有两种方法。
仅删除确切的con单元格'("\\.m\\'" . objc-mode)
的一种方法:
(setq auto-mode-alist (delete '("\\.m\\'" . objc-mode) auto-mode-alist))
另一种删除与"\\.m\\'"
关联的关联列表中的内容的方法:
(require 'cl-lib)
(cl-remove "\\.m\\'" auto-mode-alist :test 'equal :key 'car)
答案 1 :(得分:1)
这里有三个障碍:
assq-delete-all
(显而易见的选择)使用eq
来比较密钥,只有找到(emme)相同对象的对象才会成功(因此删除)-不会成功如果仅看到相同的字符串 assq-delete-all
不保证修改列表,因此需要另一个 setq 解决方案很明确:在列表中找到 car 对象。喜欢:
(setq auto-mode-alist(assq-delete-all(car(rassoc'objc-mode auto-mode-alist))auto-mode-alist))
之后,您可以
(setq auto-mode-alist(添加到列表中的'auto-mode-alist'(“ \ .m \'”。八度模式)))
答案 2 :(得分:0)
补充已经说过的内容,以便完成。
对于某些模式,auto-mode-alist
包含几个不同的条目,将不同的文件扩展名与模式相关联。例如,球拍模式使用 3 个条目:
...
("\\.rktl\\'" . racket-mode)
("\\.rktd\\'" . racket-mode)
("\\.rkt\\'" . racket-mode)
...
如果你想删除那些,模式符号上的单个 assq-delete-all
是不够的,你必须用这样的循环:
(while (rassoc 'racket-mode auto-mode-alist)
(setq auto-mode-alist
(assq-delete-all (car (rassoc 'racket-mode auto-mode-alist))
auto-mode-alist))))
我使用球拍模式解决了这个问题,因为内置的方案模式将 .rtk
文件与 scheme-mode
相关联,并且这种关联更接近于 auto-mode-alist
的头部而不是球拍模式的那些。尝试添加一个新的失败,因为它已经存在。为了能够将球拍模式与 .rkt 文件一起使用,而方案模式仍然可用于其他方案文件,我必须先删除球拍模式条目,然后将它们添加回来,将它们放在与方案关联的前面-模式。