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

Mar*_*ert 6 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"))))
Run Code Online (Sandbox Code Playgroud)

我该如何删除此元素?我发现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"))))
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*mas 17

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

请注意这两个deleteremove工作等目的,只要在列表的元素可以比较正确地通过equal它用于他们两个.如果要比较使用eq,请使用函数delqremq.

之间的主要区别deleteremove(或delqremq分别)是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)
Run Code Online (Sandbox Code Playgroud)

如果您评估上面的代码,您将在*Message*缓冲区中找到以下输出:

list1: (foo bar baz)
list2: (foo baz)
list1: (foo baz)
list3: (foo baz)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,打完电话后removelist1,它并没有改变.但是在你打电话之后delete,它已经改变了.


小智 6

您看到的错误不是由于操作列表而是由于错误使用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"))))
Run Code Online (Sandbox Code Playgroud)

(因为在单个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")))))
Run Code Online (Sandbox Code Playgroud)