我使用emacs已经很长时间了,但是我一直没有跟上很多特性。其中之一是快速杆,我刚才对它进行了简要的研究。另一个是伊梅努。这两者都在in-emacs-how-can-i-jump-between-functions-in-the-current-file?中提到过。
使用imenu,我可以跳转到我工作的模块中的特定方法。但是,在我选择(使用自动完成)方法名称之前,必须协商一个解析层次结构。
是这样的。我输入M-x imenu,然后选择Using或Types。使用选项允许我跳转到C#文件顶层的任何Using语句(对于不了解C#的人来说,这类似于导入C#模块中的语句)。不是很有帮助。我选择类型。然后,我必须选择一个名称空间和一个类,即使在源模块中每个类中只有一个。此时,我可以在变量、类型和方法之间进行选择。如果我选择方法,我最终会得到要选择的方法列表。我所遍历的层次如下;
Using
Types
Namespace
Class
Types
Variables
Methods
method names只有在我进入第5级之后,我才能选择我真正想要跳到的东西:一个特定的方法。
关于源模块,我的菜单似乎很聪明,但有点难以使用。我做错了吗?
发布于 2010-02-13 01:49:44
http://cedet.sf.net的CEDET工具包括一个C#解析器,位于“cont肋骨”区域,可以解析C#代码。然后,CEDET支持速度条和imenu的专用接口,这将以代码组织而不是标记类型组织的方式来塑造菜单结构。例如,在c++中,这样的代码:
namespace foo {
class bar {
int somemethod();
}
}会给你一棵树,它在"foo“下有"bar",而在"bar”下有"somemethod“,所以如果你知道你的结构,你只需要按名字展开到你想要的标签上。
发布于 2010-02-10 22:37:49
我使用以下函数,它将使用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)))))))发布于 2022-01-13 23:27:32
为了防止它对任何人有帮助,我按照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)))如果我有什么变化的话,我会尽力保持最新的。现在,它识别“使用”语句作为变量。没有其他我知道的虫子。
我还没试过艾瑞克的解决方案,也许比我的好得多。
https://stackoverflow.com/questions/2240320
复制相似问题