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")))
有谁知道为什么?
答案 0 :(得分:8)
问题在于这两种模式(假设您使用的是内置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
(请参阅{{的定义) 1}},在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)))
的值,例如。对于python-mode
imenu-create-index-function
类似的解决方案适用于(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
是一个元字符,您需要将其转义为匹配正常[
,您还需要转义[
因为您在字符串中,所以正确的正则表达式字符串将是\