9

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

使用 imenu,我可以跳转到我正在使用的模块中的特定方法。但是在我获得选择(使用自动完成)方法名称的选项之前,我必须协商一个解析层次结构。

它是这样的。我输入M-x imenu然后我可以选择Usingor Types。Using 选项允许我跳转到 C# 文件顶层的任何 using 语句(对于不了解 C# 的人来说,类似于 Java 模块中的导入语句)。不是超级有帮助。我选择类型。然后我必须选择一个命名空间和一个类,即使源模块中只有一个。那时我可以在变量、类型和方法之间进行选择。如果我选择方法,我最终会得到可供选择的方法列表。我遍历的层次结构如下所示;

Using
Types
  Namespace
    Class
      Types
      Variables
      Methods
         method names

只有到了第 5 级后,我才能选择我真正想跳到的东西:一种特定的方法。

Imenu 似乎对源模块很聪明,但有点难以使用。我做错了吗?

4

3 回答 3

2

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

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

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

于 2010-02-13T01:49:44.950 回答
1

我使用以下函数,它将使用 ido 并提示您可以跳转到的符号。只需调用它而不是 imenu:

(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)))))))
于 2010-02-10T22:37:49.207 回答
0

如果它对任何人有帮助,我按照imenu emacs 文档中的说明编写了自己的代码。您应该可以将其添加到您的 init.el(或者在我的情况下添加到 dotspacemacs/user-config 下的 .spacemacs 文件)

  (setq csharp-imenu-functions
    '(("Variables" "^\\s-*[a-zA-Z0-9._ ]* \\([a-zA-Z0-9_]*\\)\\( = \\sw*\\|\\s-*\\);$" 1)
      ("Functions" "^\\s-*[^/]* \\([a-zA-Z0-9_]+\\)(.*)\\(\\s-*.*\n\\|\\ *\\)\\s-*{" 1)
      ("Classes" "^\\s-*\\(.*\\)class +\\([a-zA-Z0-9_]+\\)" 2)
      ("Namespaces" "^namespace +\\([a-z0-9_]*\\)" 1)))

  (add-hook 'csharp-mode-hook
            (lambda()
              (setq imenu-generic-expression csharp-imenu-functions)))

如果我进行任何更改,我会尽量保持最新。现在它将“使用”语句识别为变量。没有其他我知道的错误。

PS 我还没有尝试过@Eric 的解决方案,也许它比我的要好得多。

于 2022-01-13T23:27:32.080 回答