如何查看当前C语言源文件的所有函数签名?

大概意思就是当前源文件有很多函数的实现,但是我又不确定要找的功能函数会是什么名字,想有个列表可以一眼看到函数签名列表,猜测各个函数的大概用途,再跳转过去细看会否是我想要的。

我在用doom,触发SPC-s-i (counsel-imenu),或者M-x lsp-ui-imenu,出现的函数列表都是根据lsp是否编译到来确定的,如果当前源文件是下面这样:

#if 0
void foo() {
    ...
    ...
}
#endif

int bar() {
    ...
    ...
}

则两者的函数列表里都会看不见foo(),只会看见bar(),我知道这样也没什么不妥,但是对我来说,我想知道这个源文件的所有函数,而不仅仅是会被编译到的函数。

希望我有表达清楚,请大家不吝赐教。

那别用 lsp 提供的 imenu 就行了。用 cc-mode 自带的。

定制imenu很简单,本质就是设置imenu-create-index-function, 以下是adoc-mode设置,

(defun adoc-imenu-index ()
  "Set up imenu for `adoc-mode'."
  (let* ((patterns '((nil "^=\\([= ]*[^=\n\r]+\\)" 1))))
    (save-excursion
      (imenu--generic-function patterns))))

(defun adoc-mode-hook-setup ()
  "Set up `adoc-mode'."
  ;; Don't wrap lines because there is table in `adoc-mode'.
  (setq truncate-lines t)
  (setq imenu-create-index-function 'adoc-imenu-index))
(add-hook 'adoc-mode-hook 'adoc-mode-hook-setup)