emacs lisp:如何删除/删除列表中的元素?

时间:2012-07-20 05:29:05

标签: emacs elisp

我尝试使用emacs lisp从"\\.synctex\\.gz"删除元素LaTeX-clean-intermediate-suffixes的第一步:

(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"))))

但我在 Backtrace 中收到相当长的输出: - (

3 个答案:

答案 0 :(得分:16)

正如assem所指出的那样,代码中似乎有额外的空格会阻止remove的正确调用。

请注意,deleteremove都可以用于此目的,只要列表中的元素可以通过equal正确比较,而eq用于这两个元素。如果您想使用delq进行比较,请使用函数remqdelete

removedelq(或分别为remqdelete)之间的主要区别是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) 缓冲区中找到以下输出:

remove

正如您所看到的,在list1上致电delete后,它没有改变。但是在你打电话给{{1}}后,它已经改变了。

答案 1 :(得分:5)

您看到的错误不是由于操作列表而是由于错误使用eval-after-load引起的。此功能仅允许两个参数:(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")))))

答案 2 :(得分:2)

delete应该工作 http://www.gnu.org/software/emacs/manual/html_node/elisp/Sets-And-Lists.html

(setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz"  LaTeX-clean-intermediate-suffixes))