将Emacs用作IDE

时间:2020-03-05 18:53:36  来源:igfitidea点击:

目前,当我使用C或者C ++进行编码时,我在Emacs上的工作流程涉及三个窗口。右侧最大的包含我正在使用的文件。左侧分为两部分,底部是我用来键入编译或者制作命令的外壳,顶部通常是我在工作时想查阅的某种文档或者自述文件。现在我知道那里有一些相当专业的Emacs用户,并且我很好奇如果打算将其用作完整的IDE,那么其他Emacs在功能上还有什么用。具体而言,大多数IDE通常以某种形式或者其他形式实现这些功能:

  • 源代码编辑器
  • 编译器
  • 调试
  • 文档查询
  • 版本控制
  • OO功能,例如类查找和对象检查器

对于其中的一些,很明显Emacs如何适合这些功能,但是其余的呢?另外,如果必须专注于特定语言,我会说它应该是C ++。

编辑:一位用户指出,当我说"其余的内容"时,我应该更加具体。通常,我对有效的版本控制以及文档查找感到好奇。例如,在SLIME中,对Lisp函数进行快速的超规格查找非常容易。有没有一种快速的方法可以在C ++ STL文档中查找内容(例如,如果我忘记了hash_map的确切语法)?

解决方案

回答

我们是否尝试过M-x编译,而不是在shell窗口中运行make命令?它将运行make命令,显示错误,并且在许多情况下,如果输出包含文件名和行号,则很容易跳转到导致错误的代码行。

如果我们是IDE的狂热者,则可能还需要查看emacs的speedbar软件包(M-x speedbar)。并且,如果还没有,请学习如何使用标签表浏览代码。

回答

我们必须具体说明"其余"的含义。除了对象检查器(我知道)之外,emacs非常容易完成上述所有操作:

  • 编辑器(明显)
  • 编译器-只需运行M-x compile并输入编译命令即可。从那里开始,我们可以执行M-x compile并使用默认值。 Emacs将捕获C / C ++编译器错误(与GCC配合使用效果最好),并导航到带有警告或者错误的行。
  • 调试-同样,当我们要调试时,键入M-x gdb,它将创建带有特殊绑定的gdb缓冲区
  • 文档查找-emacs具有出色的CScope绑定,可用于代码导航。对于其他文档:Emacs也有一个联机帮助阅读器,对于其他所有内容,都有网络和书籍。
  • 版本控制-各种VCS后端都有很多Emacs绑定(CVS,SCCS,RCS,SVN,GIT都可以想到)

编辑:我意识到我有关文档查找的答案确实与代码导航有关。这里是一些更重要的信息:

  • 从emacs中查找手册页,信息手册和Elisp文档
  • 从Emacs中查找Python文档。

毫无疑问,Google搜索将揭示更多示例。

如第二个链接所示,即使不支持现成的功能,也可以在其他文档中查找功能(及其他功能)。

回答

我同意我们应该了解M-x编译(将其与M-x next-error绑定到短键序列)。

了解有关版本控制的绑定(例如vc-diff,vc-next-action等)

查看寄存器。我们不仅可以记住缓冲区中的位置,还可以记住整个窗口配置(C-x r w -window-configuration-to-register)。

回答

我必须推荐Emacs代码浏览器作为emacs的"传统" IDE风格环境。

编辑:我现在也强烈推荐Magit通过emacs中的标准VCS接口。

回答

编译,下一个错误和上一个错误都是Emacs中C ++开发的非常重要的命令(在grep输出上也很有效)。电子标签,访问标签表和查找标签也很重要。 complete.el是20世纪最伟大的无名黑客之一,可以将C ++黑客速度提高一个数量级。哦,别忘了ediff。

我还没有学习如何在不访问shell的情况下使用版本控制,但是现在我运行git的频率越来越高,我可能不得不这样做。

回答

M-x vc-next-action是探索Emacs VC功能的起点(可能并不明显)。

根据文件的状态和VC后端,它对当前文件执行"下一逻辑版本控制操作"。因此,如果文件不受版本控制,它将对其进行注册;如果文件已更改,则提交更改等。

这需要一点时间来适应,但是我发现它非常有用。

默认的键盘绑定是C-x v v

回答

对于版本控制,我们可以使用几项内容,具体取决于我们使用的版本控制系统。但是其中一些功能是所有人共有的。

vc.el是在文件级别处理版本控制的内置方法。它具有大多数版本控制系统的后端。例如,Subversion后端随Emacs一起提供,还有git后端和其他可从其他来源获得的后端。

最有用的命令是C-x v v(vc-next-action),它对要访问的文件执行适当的下一步操作。这可能意味着从存储库进行更新或者提交更改,如果使用的系统(例如RCS),vc.el还会重新绑定C-x C-q以检入和检出文件。

其他非常有用的命令是C-x v l和C-x v =,它们向我们显示正在使用的文件的日志和当前差异。

但是,为了提高工作效率,除了简单起见,我们应该避免使用单文件vc.el命令。有几个软件包可以概述整个树的状态,并为我们提供更多功能,更不用说能够创建跨越多个文件的一致提交的功能。

其中大多数受到严重影响,或者基于CVS的原始pcl-cvs / pcvs。甚至有两个附带的子版本psvn.el和dsvn.el。有用于git等的软件包。

回答

我们可以在我的网站上找到有关emacs和版本控制集成的详细说明。我也在撰写有关将Emacs用作多种语言C / C ++,Java,Perl,Lisp / Scheme,Erlang等的开发环境的文章...

回答

一旦发现了emacs的某些角落,我们就可以以从未想到的方式提高工作效率。正如其他人提到的那样,使用标签是一种缩放源代码的绝佳方法,而使用M- /(dabbrev-expand)通常可以完全满足我们在完成变量名时的期望。

如果要使用一个正则表达式所有出现在缓冲区中的缓冲区,则使用begin很有用。在重构代码,查找代码片段或者使用变量时,或者在源文件中使用TODO标记并希望全部访问它们时,这非常方便。

刷新线,排序数字字段,replace-regexp和矩形函数对于从某些工具中进行转储并将其转换为有用数据(例如elisp程序或者逗号分隔的电子表格)非常有用。

我写了一篇有关IDE的页面,例如可以使用emacs进行的操作

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

学习elisp是为我们自己回答emacs可以完成的工作的另一种好方法,而emacs不能完成典型的IDE可以完成的工作。

例如,我写了一篇博客,写诸如blame之类的Perforce helper函数(编写我们自己的方法意味着我们可以使其完全像我们想要的那样运行)...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

我还编写了可以动态地为函数创建注释的代码,该注释与我正在使用的编码标准相匹配。

我的elisp代码都不是特别出色的代码,大多数代码已经存在于库中,但是能够使emacs执行工作日内出现的自定义内容确实很有用。

回答

关于文档查找:这取决于编程语言。

C库和系统调用通常记录在手册页中。为此,我们可以使用M-x man。在信息页面上可能会更好地记录一些事情;使用M-x info

对于elisp本身,请使用C-h f。对于python,在解释器中使用>>> help(<function,class,module>)

我发现大多数其他语言都以html形式提供文档。为此,请尝试使用嵌入式浏览器(我使用w3m)。将" BROWSER"环境变量设置为" emacsclient -e"(w3m-goto-url-new-session " $ @ ")""(在* nix上)周围的包装脚本,以防可能打开浏览器并我们想在emacs中打开它。

回答

我们可能还会发现标签栏很有用。它模拟了我从Eclipse迁移到Emacs时遗漏的唯一行为。绑定到","和"。"要移至上一个和下一个选项卡栏,它将使我们始终可以通过Ctrl-x b切换缓冲区。

不幸的是,提到的网页没有提供正确的版本供下载。但是,大多数Ubuntu版本都是通过emacs-goodies软件包提供它的。

回答

有一个用于emacs集成到Microsoft TFS中的TFS.el。它适用于任何TFS,包括运行Codeplex.com的TFS。

设置的基本步骤:

  • 将tfs.el放在加载路径中。
  • 在.emacs文件中:
(require 'tfs)
(setq tfs/tf-exe  "c:\vs2008\common7\ide\tf.exe")
(setq tfs/login "/login:domain\userid,password")
      -or-
(setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
  • 还要在.emacs文件中,为tfs命令设置本地或者全局键绑定。像这样:
(global-set-key  "\C-xvo" 'tfs/checkout)
(global-set-key  "\C-xvi" 'tfs/checkin)
(global-set-key  "\C-xvp" 'tfs/properties)
(global-set-key  "\C-xvr" 'tfs/rename)
(global-set-key  "\C-xvg" 'tfs/get)
(global-set-key  "\C-xvh" 'tfs/history)
(global-set-key  "\C-xvu" 'tfs/undo)
(global-set-key  "\C-xvd" 'tfs/diff)
(global-set-key  "\C-xv-" 'tfs/delete)
(global-set-key  "\C-xv+" 'tfs/add)
(global-set-key  "\C-xvs" 'tfs/status)
(global-set-key  "\C-xva" 'tfs/annotate)
(global-set-key  "\C-xvw" 'tfs/workitem)