代码之家  ›  专栏  ›  技术社区  ›  Cheeso

在Emacs中,如何在c_中更明智地使用IMENU?

  •  8
  • Cheeso  · 技术社区  · 15 年前

    我用emacs已经很长时间了,但我没有跟上一堆功能。其中之一是 speedbar 我只是简单地调查了一下。另一个是 imenu . 这两个都是在 in-emacs-how-can-i-jump-between-functions-in-the-current-file?

    使用IMENU,我可以跳到我正在工作的模块中的特定方法。但是有一个解析层次结构,我必须在得到选择方法名称的选项(使用autocomplete)之前进行协商。

    就像这样。I型 M-x imenu 然后我就可以选择 Using Types . 使用选择允许我跳转到C语言文件的顶层的任何使用语句(比如Java模块中的导入语句,对于不知道C语言的人)。不是很有用。我选择类型。然后我必须选择一个名称空间和一个类,即使源模块中每个都只有一个。此时,我可以在变量、类型和方法之间进行选择。如果我选择方法,我最终会得到要从中选择的方法列表。我所遍历的层次结构如下:

    Using
    Types
      Namespace
        Class
          Types
          Variables
          Methods
             method names
    

    只有在我到达第5级之后,我才能选择我真正想要跳到的东西:一个特定的方法。

    IMENU在源模块方面看起来很智能,但有点难以使用。我做错了吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Eric    15 年前

    Cedet工具 http://cedet.sf.net 在“contrib”区域中包含一个C解析器,可以解析C代码。CEDET随后支持speedbar和IMENU的专用接口,这将以代码组织而不是标记类型组织的方式塑造菜单结构。在C++中,例如,这样的代码:

    namespace foo {
       class bar {
           int somemethod();
       }
    }
    

    会给你一棵树,在“foo”下有“bar”,在“bar”下有“somemethod”,所以如果你知道你的结构,你只需要按名称展开到你想要的标签上。

        2
  •  1
  •   Nathaniel Flath    15 年前

    我使用下面的函数,它将使用IDO并提示您可以跳转到的符号。只需称之为它而不是伊蒙:

    (defun ido-goto-symbol ()
      "Will update the imenu index and then use ido to select a symbol to navigate to"
      (interactive)
      (imenu--make-index-alist)
      (let ((name-and-pos '())
            (symbol-names '()))
        (flet ((addsymbols (symbol-list)
                           (when (listp symbol-list)
                             (dolist (symbol symbol-list)
                               (let ((name nil) (position nil))
                                 (cond
                                  ((and (listp symbol) (imenu--subalist-p symbol))
                                   (addsymbols symbol))
                                  ((listp symbol)
                                   (setq name (car symbol))
                                   (setq position (cdr symbol)))
                                  ((stringp symbol)
                                   (setq name symbol)
                                   (setq position (get-text-property 1 'org-imenu-marker symbol))))
                                 (unless (or (null position) (null name))
                                   (add-to-list 'symbol-names name)
                                   (add-to-list 'name-and-pos (cons name position))))))))
          (addsymbols imenu--index-alist)
          (let* ((symbol-at-point (symbol-name (symbol-at-point)))
                 (selected-symbol (ido-completing-read
                                   "Symbol? "
                                   (if (member symbol-at-point symbol-names)
                                       (cons symbol-at-point (remove-if (lambda (x) (string-equal x symbol-at-point))
                                                                        symbol-names))
                                     symbol-names)))
                 (position (cdr (assoc selected-symbol name-and-pos))))
            (if (markerp position)
                 (goto-char position) (goto-char (overlay-start position)))))))
      (goto-char position) (goto-char (overlay-start position)))))))