15

如何检查字符串是否已经在 Emacs Lisp 的列表中?我需要检查某个路径字符串是否已经存在exec-path,如果不是,则将其添加到该列表中。

4

2 回答 2

25

该功能add-to-list将在添加前自动检查

(setq a '(1 2 3))
(add-to-list 'a 4)
(add-to-list 'a 3)

将导致a等于 (4 1 2 3)

从 Emacs 26 开始C-h f add-to-list

(添加到列表 LIST-VAR ELEMENT &optional APPEND COMPARE-FN)

将 ELEMENT 添加到 LIST-VAR 的值(如果它尚不存在)。
ELEMENT 是否存在的测试使用“equal”或
COMPARE-FN 如果那不是零。
如果添加了 ELEMENT,则添加在列表的开头,
除非可选参数 APPEND 不为零,在这种情况下
最后添加 ELEMENT。

返回值是 LIST-VAR 的新值。

这很方便将一些元素添加到配置变量中,
但请不要在 Elisp 代码中滥用它,你通常在哪里
最好使用“push”或“cl-pushnew”。

如果你想在一个不是
定义直到某个包被加载,你应该把
将“添加到列表”调用到仅运行的钩子函数中
加载包后。'eval-after-load' 提供了一种方法
做这个。在某些情况下,其他钩子,例如主要模式钩子,
可以完成这项工作。
于 2009-05-22T06:29:20.897 回答
2

除了cobbal 关于的回答add-to-list之外,还有cl-pushnew

(require 'cl-lib)

(setq list-of-strings '("one" "two" "three"))
(cl-pushnew "two" list-of-strings :test #'string=)
    ⇒ ("one" "two" "three")
(cl-pushnew "zero" list-of-strings :test #'string=)
    ⇒ ("zero" "one" "two" "three")

在您的情况下需要该参数,因为默认情况下用于比较,并且它不会将具有相同内容的两个字符串视为相等。( ) 也可以。:test #'string=cl-pushneweqlequal

(eql "some-string" "some-string")
    ⇒ nil
(string= "some-string" "some-string")
    ⇒ t
(equal "some-string" "some-string")
    ⇒ t

从 Emacs 26 开始C-h f cl-pushnew

cl-pushnew 是 'cl-lib.el' 中的一个 Lisp 宏。

(cl-pushnew X PLACE [关键字值] ...)

(cl-pushnew X PLACE):如果 X 还没有,则在列表的开头插入 X。
与 (push X PLACE) 类似,但如果 X 为 'eql' 则列表未修改
已在列表中的元素。

支持的关键字: :test :test-not :key
于 2020-05-22T06:30:37.553 回答