2012-07-20 66 views
6

我想我的第一个步骤,的Emacs Lisp从LaTeX-clean-intermediate-suffixes删除元素"\\.synctex\\.gz"emacs lisp:如何删除/删除列表元素?

(eval-after-load 'latex 
    '(setq my-LaTeX-clean-intermediate-suffixes (remove '"\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)); that's not working 
    '(setq LaTeX-clean-intermediate-suffixes 
    (append my-LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

我怎么可以在这里删除此元素吗?我发现removedelete,尝试了它们,但是我得到了一个wrong-number-of-arguments-类型的错误。

更新

我尝试这样做:

(eval-after-load 'latex 
    (setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)) 
    '(setq LaTeX-clean-intermediate-suffixes 
    (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

,但我收到相当长的输出回溯 :-(

+0

看起来你只是有一个间距错误。删除多余的空格:'LaTeX-clean- intermediate-suffixes',你应该没问题。 – assem 2012-07-20 06:01:27

+0

这是一个复制和粘贴错误,我没有在代码中。我会改变上述。 – 2012-07-20 06:27:06

回答

4

您看到的错误不是由于操作列表,而是由加载后评估的错误使用引起的。该功能只允许两个参数:(eval-after-load FILE FORM)。所以,你的代码段应改为​​要么

(eval-after-load 'latex 
    '(setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes) 
     LaTeX-clean-intermediate-suffixes (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

(多重分配是在一个setq声明允许)或更一般的变种(如你所愿一个progn内归并为多种形式):

(eval-after-load 'latex 
    '(progn 
    (setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)) 
    (setq LaTeX-clean-intermediate-suffixes (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml"))))) 
12

正如汇编指出,代码中似乎有额外的空白,阻止remove的正确调用。

注意,既deleteremove工作用于这样的目的,只要在列表的元素可以通过equal其用于它们两者正确地进行比较。如果要使用eq进行比较,请使用功能delqremq

(分别或delqremqdeleteremove之间的主要区别是,delete去除由副作用,即,改变代替给定列表中的给定元素,而remove不而是返回给定的副本列表中删除了该元素。

(setq list1 '("foo" "bar" "baz")) 
(setq list2 (remove "bar" list1)) 

(message "list1: %s" list1) 
(message "list2: %s" list2) 

(setq list3 (delete "bar" list1)) 

(message "list1: %s" list1) 
(message "list3: %s" list3) 

如果评估上面的代码,你会发现下面的输出在*Message*缓冲区:

list1: (foo bar baz) 
list2: (foo baz) 
list1: (foo baz) 
list3: (foo baz) 

正如你所看到的,呼吁list1remove后,它并没有改变。但是在你拨打delete之后,它就改变了。