emacs支持能否在整个项目中进行功能声明?


12

emacs是否具有一个函数或库,即使它在另一个文件中定义,也可以允许用户转到该函数声明?

如果是这样,支持哪些语言?

这个问题的灵感来自下面的文章,其中讨论了emacs永远无法与IDE竞争的一些原因。

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/


emacs通常处理此问题的方法是依靠外部编译程序(例如clang)快速了解源代码并响应通过命令行传递的查询。irony-clang为此签出。您是否阅读了该文章的评论?
肖恩·阿雷德

1
alchemist.el为elixir提供的功能,或为C#提供的omnisharp的功能,它们都依赖于外部程序进行导航/重构/理想的东西,这与大多数IDE十分相似。(至少对于大多数用例而言)。Emacs与IDE不在同一行业,因此我认为说它永远不会有竞争的机会是不合理的。
Renan Ranelli 2015年

@RenanRanelli IDE的使用方式相同,只是我们必须手动进行集成,而不是有人已经将其称为“ IDE”。
Tu Do

在我看来,2019年只有一种解决方案应该考虑。这就是公司完成的时间。忘记标签或or肿,不稳定的CEDET。rtags使用编译时信息来提供项目正在使用的实时结构。global等很糟糕-它们是夸张的“技巧”,会带来很多猜测,并经常把您带到错误的地方。 github.com/Andersbakken/rtags
RichieHH

Answers:


14

您可以立即跳转到整个项目的任何定义/引用,这些定义/引用与Linux内核源代码树(大于36k)一样大。有关详细信息,请参见我的C / C ++指南。对于C / C ++,我建议使用支持C,C ++,Yacc,Java,PHP4和汇编语言的GNU Global

关键是,如果要具有某种语言的IDE功能,则必须安装该语言的插件。以下是一些我所知道的动态语言包:

  • 实时网络开发:串模式
  • Javascript:Tern。但在此之前,请记住安装js2-mode。至于做什么js2-mode,请参阅说明;但实质上js2-mode是一个完整的Javascript解析器,该解析器生成AST以执行适当的IDE功能。如果您安装的skewer-modejs2-mode默认情况下要多,则skewer-mode取决于它。
  • Python:elpy,请参阅IDE功能
  • 红宝石:长袍提供以下功能:
  • 跳转到方法定义
  • 跳到super或在point处调用的构造函数
  • 跳转到模块或类(如果已定义至少一个方法)
  • 显示方法文档
  • 显示有关使用ElDoc在点调用的方法的信息
  • 方法和常量名称完成

您还可以ctags用来支持多种语言,例如Shell脚本或Tcl。


对javascript有任何建议吗?
user2522280 2015年

@BarryG有Ternj2-mode我在答案中进行了编辑。
Tu Do

2
我想指出,这anaconda可能是Python中定义跳转的更具体解决方案。
PythonNut

@TuDo您已将Robe的功能列表放在ESS下。
德米特里

对于C ++,还有rtagsycmd。我使用ycmd,它也可以与Python,C#,Go和其他语言一起使用。我使用dumb-jumpcounsel-rg作为后备或显示符号的用法或注释/文档提及。
锤击

20

我在emacs中遇到了类似的问题,所以我做了Dumb Jump。我尝试了接受的答案中提到的许多解决方案,但是我总是遇到以下一个或多个问题:

  • 解决方案仅适用于一种编程语言
  • 解决方案需要索引(TAG)文件或持久性进程

我非常想要一个“可行”且不需要自定义或设置的解决方案。也就是说,我想在Github上克隆一个随机存储库,并像其他任何我自己的项目一样浏览它。

目前,Dumb Jump具有以下基本支持:

  • 的JavaScript
  • 埃马克斯·利斯普(Emacs Lisp)
  • 蟒蛇
  • 的PHP
  • 红宝石
  • 浮士德
  • [R
  • a
  • ...和更多

这是通过MELPA可用和GitHub的问题和永久居民的欢迎。


4

emacs中对此的主要解决方案是使用TAGS文件,这些文件是由诸如etags或gtags之类的程序创建的。我自己使用(并推荐)旺盛的ctags和etags-select.el来帮助您在搜索符号位于多个目标位置时缩小目标范围。支持的语言很多,请参见各个工具的手册。甚至还支持添加您自己的语言,从而可以提供一个正则表达式来指示ctags如何隔离您感兴趣的标签。


1
哦! 我怎么会忘记标签文件?ctags -e -R *从根目录将为您进行设置。
肖恩·阿雷德

当您的项目具有许多依赖项(例如更新的javascript Web开发项目)时,这是可接受的解决方案吗?
Rudolf Olah 2015年

依赖关系的数量本身并不是障碍。您可以拥有一个聚集了许多不同库的大标签文件;我这样做了很多年,ctags命令调用却做到了这一点。或者,我现在建议对每个依赖项使用单独的标记文件。emacs足够聪明,可以加载多个标签文件。为了缓解这种情况,请搜索etags-table.el,该文件有助于每个项目加载标签文件组。
InHarmsWay 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.