首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Emacs中,如何在C#中更明智地使用imenu?

在Emacs中,如何在C#中更明智地使用imenu?
EN

Stack Overflow用户
提问于 2010-02-10 21:03:31
回答 3查看 985关注 0票数 9

我使用emacs已经很长时间了,但是我一直没有跟上很多特性。其中之一是快速杆,我刚才对它进行了简要的研究。另一个是伊梅努。这两者都在in-emacs-how-can-i-jump-between-functions-in-the-current-file?中提到过。

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

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

代码语言:javascript
复制
Using
Types
  Namespace
    Class
      Types
      Variables
      Methods
         method names

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

关于源模块,我的菜单似乎很聪明,但有点难以使用。我做错了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-13 01:49:44

http://cedet.sf.net的CEDET工具包括一个C#解析器,位于“cont肋骨”区域,可以解析C#代码。然后,CEDET支持速度条和imenu的专用接口,这将以代码组织而不是标记类型组织的方式来塑造菜单结构。例如,在c++中,这样的代码:

代码语言:javascript
复制
namespace foo {
   class bar {
       int somemethod();
   }
}

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

票数 2
EN

Stack Overflow用户

发布于 2010-02-10 22:37:49

我使用以下函数,它将使用ido并提示您可以跳转到的符号。就叫它而不是伊梅努吧:

代码语言:javascript
复制
(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)))))))
票数 1
EN

Stack Overflow用户

发布于 2022-01-13 23:27:32

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

代码语言:javascript
复制
  (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)))

如果我有什么变化的话,我会尽力保持最新的。现在,它识别“使用”语句作为变量。没有其他我知道的虫子。

我还没试过艾瑞克的解决方案,也许比我的好得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2240320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档