imenu不适用于python模式或c ++模式

时间:2014-02-08 10:30:20

标签: emacs

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")))

有谁知道为什么?

1 个答案:

答案 0 :(得分:8)

问题在于这两种模式(假设您使用的是内置python-mode),将imenu-create-index-function(用于创建索引的函数)设置为imenu-default-create-index-function。此函数依次尝试使用imenu-prev-index-position-functionimenu-extract-index-name-function的值来提取imenu,如果设置了两个变量则不使用imenu-generic-expression(请参阅{{的定义) 1}},在imenu-default-create-index-function)中。这就是为什么不使用您设置的值的原因。我们在这里可以做的是定义一个同时使用imenu.elimenu-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是一个元字符,您需要将其转义为匹配正常[,您还需要转义[因为您在字符串中,所以正确的正则表达式字符串将是\