在Emacs中,如何使用C#更合理地使用imenu?

我已经使用了emacs很长一段时间,但我还没有跟上一堆function。 其中一个是speedbar ,我现在只是简单地研究过。 另一个是imenu 。 在当前文件中的in-emacs-how-can-can-between-functions-in中提到了这两个?

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

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

 Using Types Namespace Class Types Variables Methods method names 

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

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

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

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

会给你一棵在“foo”下面有“bar”的树,在“bar”下面有“somemethod”,所以如果你知道你的结构,你只需要按照你想要的标签放松。

我使用以下函数,它将使用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)))))))