标题非常明确。这里重复一下,它显示“Bookmarks+ 中的哪个函数处理具有相同名称的多个书签?”Bookmarks+ 是对 Emacs 原生书签功能的改进。我有许多 elisp 函数保存在不同目录中的文件中,我想将它们全部添加到书签文件中。我会使用我的标签文件(生成的 Etags)来找到它们,然后将它们添加到书签中,注释与函数文档相同。不同目录中的文件中存在重复的函数名称。
我会随意重复此操作,并与现有书签文件中的书签进行比较。如果不存在一个或多个同名书签,我只会创建新书签。
我查看了所有 Bookmark+ 功能(由 Etags 找到),但找不到我想要的功能。我可能不得不“自己动手”。
答案1
我不确定我是否理解了你的问题。是的,书签+你可以拥有多个具有相同书签名称的书签。(实际上,你也可以使用 vanilla Emacs 来实现,但没什么用。)
如果你创建自动归档书签例如,书签名称与相对文件名相同,但记录的文件名是绝对的,因此您可以拥有具有相同名称的不同书签,指向不同目录中的同名文件。
为了利用此功能,您需要确保 option 的值bmkp-propertize-bookmark-names-flag
不是nil
。您可以*Bookmark List*
使用菜单Bookmark+
> Toggle
>在显示中切换此选项Allowing Identical Bookmark Names
。
除此之外,您无需做任何特殊的事情就可以创建和使用具有相同名称的书签。
的文档字符串bookmark-set
说明如下:
Plain prefix arg (`C-u'): Do not overwrite a bookmark that has the
same name as NAME, if such a bookmark already exists. Instead,
push the new bookmark onto the bookmark alist.
因此,对于普通(例如非自动文件)书签,使用C-u
withC-x r m
可以创建具有相同名称的附加书签。
使用 Bookmark+ 时,命令bmkp-bookmark-set-confirm-overwrite
(而不是bookmark-set
)绑定到C-x r m
。文档字符串说明如下:
This is the same as `bookmark-set', except that with no prefix arg you
are asked to confirm overwriting an existing bookmark of the same
NAME.
也就是说,如果您使用C-x r m
不带前缀的 arg,则在覆盖同名的现有书签之前,系统会要求您确认覆盖。这意味着您不必担心无意中覆盖。
您的评论后更新
这里确实不是讨论的地方。而且你的问题仍然不太清楚。
你问的是如何检查是否存在具有给定名称且为给定文件添加书签的现有书签?如果是的话:
(defun bookmark-name+filename-exists-p (bookmark file)
"Return a bookmark named BOOKMARK for FILE, or nil if there is none.
BOOKMARK is a bookmark name or a bookmark record."
(when (consp bookmark) (setq bookmark (bookmark-name-from-full-record bookmark)))
(catch 'bookmark-exists-p
(dolist (bmk bookmark-alist)
(when (and (string= bookmark (bookmark-name-from-full-record bmk))
(bmkp-same-file-p file (bookmark-get-filename bmk)))
(throw 'bookmark-exists-p bmk)))
nil))
您是否要求列出具有给定名称的所有书签? 如果是:
(defun bookmarks-with-name (bname)
"Return a list of the bookmarks with name BNAME."
(bmkp-remove-if-not
`(lambda (bmk) (string= ',bname (bookmark-name-from-full-record bmk)))
bookmark-alist))