imenu在emacs-lisp-mode-hook
中为我工作。但是当我在python或c ++模式下尝试以下操作时,它不起作用:
(add-hook 'python-mode-hook
(lambda ()
(add-to-list
'imenu-generic-expression
'("Sections" "^#### [ \\(.+\\) ]$" 1))
(imenu-add-to-menubar "Position")))
(add-hook 'c++-mode-hook
(lambda ()
(add-to-list
'imenu-generic-expression
'("Sections" "^//// [ \\(.+\\) ]$" 1))
(imenu-add-to-menubar "Position")))
有人知道为什么吗?
最佳答案
问题在于这两种模式(假设您正在使用内置的python-mode
),都将imenu-create-index-function
(用于创建索引的函数)设置为imenu-default-create-index-function
。该函数依次尝试使用imenu-prev-index-position-function
,imenu-extract-index-name-function
的值来提取imenu,如果设置了两个变量,则不使用imenu-generic-expression
(请参见imenu-default-create-index-function
中的imenu.el
的定义) )。因此,不使用您设置的值。我们在这里可以做的是定义一个同时使用imenu-default-create-index-function
和imenu-generic-expression
的自定义函数,将其结果组合并返回。然后,我们可以将imenu-create-index-function
的值设置为自定义函数。以下是此类自定义函数的示例
(defun my-merge-imenu ()
(interactive)
(let ((mode-imenu (imenu-default-create-index-function))
(custom-imenu (imenu--generic-function imenu-generic-expression)))
(append mode-imenu custom-imenu)))
然后我们可以将其设置为主要模式挂钩中的
imenu-create-index-function
值。用于python模式(add-hook 'python-mode-hook
(lambda ()
(add-to-list
'imenu-generic-expression
'("Sections" "^#### \\[ \\(.*\\) \\]$" 1))
(imenu-add-to-menubar "Position")
(setq imenu-create-index-function 'my-merge-imenu)))
类似的解决方案应适用于
c++-mode
。关于使用的正则表达式的说明:正则表达式中有一个错误,因为
[
是元字符,您将需要对其进行转义以匹配普通的[
,因此您还需要对\
进行转义。一个字符串,因此正确的正则表达式字符串将为"^#### \\[ \\(.*\\) \\]$"