如何从自动模式警报(Emacs)中删除项目

时间:2018-06-30 19:38:04

标签: list emacs

我以为这样做很简单,但是我被困住了。

当我在〜/ .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模式或确保八度模式取代它的任何建议都很好。

3 个答案:

答案 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)

这里有三个障碍:

  1. 同时引用和regexp语法
  2. assq-delete-all(显而易见的选择)使用eq来比较密钥,只有找到(emme)相同对象的对象才会成功(因此删除)-不会成功如果仅看到相同的字符串
  3. 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 文件一起使用,而方案模式仍然可用于其他方案文件,我必须先删除球拍模式条目,然后将它们添加回来,将它们放在与方案关联的前面-模式。