这是 imenu 的 bug 么?

int main(int argc, char *argv) {}

把 cursor 放在 int 上, 调用 imenu 时会出来两项补全的选项:

Index item: 
-> int
   main

而不是只有一项 main

看了下 imenu–completion-buffer 这个函数, 它把 thing-at-point (也就是这里的 int) 当作了 completing-read 的 default, 但我觉得这不怎么合理…我想看 imenu, 和当前 cursor 处的 thing-at-point 有什么关系?

我觉得这样改比较 合适:

  (when (stringp name)
    (setq name (or (imenu-find-default name prepared-index-alist) name)))

改成

  (when (stringp name)
    (setq name (or (imenu-find-default name prepared-index-alist) nil)))

这样改的话,那个or有啥意义呢?when也没用了。

我在Emacs30上试了下,只显示main啊,跟你的显示不一样。imenu–completion-buffer 是哪个包的函数?

image

看起来是 ido-completing-read+ 这个包导致的, 单独用 imenu 并没有问题

ido-completing-read+ 的注释写的:

In ido, the semantics of “default” are simply “put it at ;; the front of the list”. Furthermore, ido can’t handle a ;; list of defaults, nor can it handle both DEF and ;; INITIAL-INPUT being non-nil. So, just pre-process the ;; collection to put the default(s) at the front and then ;; set DEF to nil in the call to ido to avoid these issues.