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-functionimenu-extract-index-name-function的值来提取imenu,如果设置了两个变量,则不使用imenu-generic-expression(请参见imenu-default-create-index-function中的imenu.el的定义) )。因此,不使用您设置的值。我们在这里可以做的是定义一个同时使用imenu-default-create-index-functionimenu-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

关于使用的正则表达式的说明:正则表达式中有一个错误,因为[是元字符,您将需要对其进行转义以匹配普通的[,因此您还需要对\进行转义。一个字符串,因此正确的正则表达式字符串将为"^#### \\[ \\(.*\\) \\]$"

10-08 08:43