使用Emacs作为IDE

目前我使用Emacs编写C或C ++的工作stream程涉及三个窗口。 最大的右侧包含我正在使用的文件。 左边被分成两部分,底部是一个我用来编译或者编译命令的shell,最上面的部分通常是我在工作时想咨询的一些文档或者自述文件。 现在我知道在那里有一些非常专业的Emacs用户,我很好奇如果其他Emacsfunction是有用的,如果意图是使用它作为一个完整的IDE。 具体而言,大多数IDE通常以某种forms履行这些function:

  • 源代码编辑器
  • 编译器
  • debugging
  • 文档查找
  • 版本控制
  • 面向对象的function,如类查找和对象检查

对于其中的一些,Emacs如何适应这些function是非常明显的,但其余的呢? 另外,如果一个特定的语言必须关注,我会说它应该是C ++。

编辑:一位用户指出,当我说“剩下的事情”时,我应该更具体一些。 大部分时候我对高效的版本控制以及文档查询感到好奇。 例如,在SLIME中,对Lisp函数进行快速超大规模查找是相当容易的。 有没有一种快速查找C ++ STL文档中的东西的方法(例如,如果我忘记了hash_map的确切语法)?

你必须具体说明“剩下的”是什么意思。 除了对象检查员(我知道),emacs很容易做到以上所有:

  • 编辑(显而易见)
  • 编译器 – 只需运行Mx compile并input你的编译命令。 从那里,你可以只是Mx compile和使用默认。 Emacs将捕获C / C ++编译器错误(最适合GCC),并帮助您导航到有警告或错误的行。
  • debugging – 类似地,当你想debugging的时候,inputMx gdb ,它将创build一个带有特殊绑定的gdb缓冲区
  • 文件查找 – emacs具有卓越的CScope绑定代码导航。 对于其他文档:Emacs也有一个手册页阅读器,其他的一切都有网页和书籍。
  • 版本控制 – 各种VCS后端都有很多Emacs绑定(CVS,SCCS,RCS,SVN,GIT)

编辑:我意识到我的答案关于文档查找确实涉及到代码导航。 这里有一些更多的信息:

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

谷歌search无疑将揭示更多的例子。

正如第二个链接所示,即使不支持开箱即用,也可以在其他文档中查找function(以及其他)。

我必须推荐Emacs Code Browser作为emacs更“传统”的IDE风格的环境。

编辑 :我现在也推荐Magit高度超过emacs中的标准VCS接口。

而不是在shell窗口中运行make命令,你试过Mx编译? 它会运行make命令,显示错误,在很多情况下,如果输出包含文件名和行号,则可以很容易地跳转到导致错误的代码行。

如果你是IDE的粉丝,你可能也想看看emacs的speedbar软件包(Mx speedbar)。 而且,如果您还没有学习如何使用标签表来导航您的代码。

有一些emacs的angular落曾经被发现,让你从未想过的方式更有效率。 正如其他人所提到的那样,使用标签是放大源代码的绝妙和快捷的方式,而使用M- /(dabbrev-expand)通常完成了您期望完成variables名称的操作。

在缓冲区中使用所有发生正则expression式的缓冲区,使用发生是有用的。 当重构代码并寻找代码片段或使用variables,或者如果在源文件中使用TODO标记,并且想要全部访问它们时,这非常方便。

flush-lines,sort-numeric-fields,replace-regexp和rectangle函数对于从某个工具转储并将其转换为有用的数据(如elisp程序或逗号分隔的电子表格)非常有用。

我写了一个关于IDE的页面,就像你可以用emacs做的事情一样

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

学习elisp是另外一种很好的方式来回答emacs除了典型的IDE能做什么之外还能做什么。

举例来说,我已经写了一些关于编写Perforce帮助函数的问题,比如怪(写自己的意思是说你可以按照你的意思去做)。

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

我还编写了代码,dynamic地为一个函数创build注释,这与我正在使用的编码标准相匹配。

我的elisp代码没有一个特别好,大部分已经存在于库中,但是能够使emacs在一天的工作时间内做出定制的东西是非常有用的。

你可以在我的网站上find关于emacs和版本控制集成的详细描述。 我也在编写有关使用Emacs作为许多语言的开发环境的文章 – C / C ++,Java,Perl,Lisp / Scheme,Erlang等等。

对于版本控制,根据您使用的版本控制系统,您可以使用几件事情。 但是其中的一些function对所有这些function都是通用的。

vc.el是在文件级别处理版本控制的内置方式。 它有后台的大多数版本控制系统。 例如,Subversion后端带有Emacs,并且有其他来源的git后端和其他的。

最有用的命令是Cx vv (vc-next-action),它为正在访问的文件执行相应的下一个操作。 这可能意味着从版本库更新或提交更改,如果您使用的是需要它的系统(如RCS),vc.el还会重新绑定Cx Cq以检入和检出文件。

其他非常有用的命令是Cx vlCx v = ,它们向您显示您正在使用的文件的日志和当前比较。

但是对于实际的生产力,你应该避免使用单文件vc.el命令,而不是简单的事情。 有几个包可以给你一个整个树的状态的概述,给你更多的权力,更不用说创build跨越几个文件的连贯提交的能力。

其中大部分受CVS影响较大或基于原有的pcl-cvs / pcvs 。 甚至有两个与颠覆, psvn.eldsvn.el。 有Git等包。

我同意你应该学习Mx编译(把那个和Mx下一个错误绑定到一个简短的键序列上)。

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

看看寄存器。 您不仅可以记住缓冲区中的位置,还可以logging整个窗口configuration(Cx rw – 窗口configuration到寄存器)。

探索Emacs的VCfunction的起点(这可能是不明显的)是Mx vc-next-action

它根据文件的状态和VC后端对当前文件执行“下一个逻辑版本控制操作”。 所以如果文件不在版本控制之下,它会注册它,如果文件已经被修改,修改被提交等等。

这需要一点习惯,但我觉得它非常有用。

默认的键盘绑定是Cx vv

好的,这里的每个人都给出了完美的提示,使emacs成为一个伟大的IDE。

但是任何人都应该记住,当你定制emacs时有很多扩展(特别是用于types检查,函数定义查找等等),emacs会为编辑器加载速度非常慢。

要解决这个问题,我强烈build议在server mode使用emacs。

使用起来相当简单,不需要定制你的init文件。 您只需要以守护进程模式启动emacs;

 emacs --daemon 

这将创build一个emacs服务器,然后你可以从terminal,或从gui连接它。 我也build议创build一些别名,以便于调用。

 alias ec="emacsclient -t" alias ecc="emacsclient -c &" # some people also prefer this but no need to fight here; alias vi="emacsclient -t" 

这样,emacs的启动速度会比gedit快,诺言。

这里有一个可能的问题,如果你从临时用户运行emacs守护进程,那么你可能无法以root身份连接emacs服务器。

所以,如果你需要打开一个有root权限的文件, 使用tramp来代替。 只要用普通用户运行你的emacs客户端并打开这样的文件;

 Cx Cf /sudo:root@localhost/some/file/that/has/root/access/permissions # on some linux distro it might be `/su:root@...` 

这使得我的生活变得更加简单,我可以用这种方法以毫秒为单位打开沉重的自定义Python IDE。 您可能还想要将emacs – 守护进程添加到系统启动,或为emacsclient创build一个桌面文件。 这取决于你。

有关emacs守护进程和emacs客户端的更多信息可以在wiki中find;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

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

设置的基本步骤:

  1. 将tfs.el放入您的加载path中。

  2. 在您的.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 
  3. 也在你的.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) 

编译,下一个错误和先前的错误都是在Emacs中进行C ++开发的非常重要的命令(对于grep输出也很好)。 Etags,visit-tags-table和find-tag也很重要。 completion.el是20世纪最伟大的黑客之一,可以加速你的C ++黑客行为的数量级。 哦,我们不要忘记ediff。

我还没有学习如何在不访问shell的情况下使用版本控制,但现在我正在更频繁地运行提交(使用git),我可能不得不这样做。

你也可以find有用的tabbar 。 它模拟了从Eclipse转移到Emacs时我错过的唯一行为。 绑定到“,”和“。” 为了移到上一个和下一个标签栏,它总是让你不再需要通过Ctrl-x b来切换缓冲区。

不幸的是,提到的网页没有提供正确的版本下载。 然而,大多数Ubuntu版本都是在emacs-goodies包中提供的。

我在Windows上使用emacs。 编译模块是不错的,但我想编译更聪明的编译命令行,它build议。 可以使用“文件variables”来指定compile-command ,但是我想要一些比这更聪明的东西。 所以我写了一些帮助function。 它猜测要使用的编译命令,在运行compile时提示用户。

猜测函数查找vbproj或csproj或sln文件,如果find,它build议msbuild。 然后它查看缓冲区文件名称,并根据它提出不同的build议。 一个.wxs文件意味着它是一个WIX项目,你可能想要build立一个MSI,所以猜测逻辑为MSIbuild议一个nmake命令。 如果它是一个Javascript模块,那么build议运行jslint-for-wsh.js来提取.js文件。 作为后备,它build议nmake。

我使用的代码如下所示:

 (defun cheeso-guess-compile-command () "set `compile-command' intelligently depending on the current buffer, or the contents of the current directory." (interactive) (set (make-local-variable 'compile-command) (cond ((or (file-expand-wildcards "*.csproj" t) (file-expand-wildcards "*.vcproj" t) (file-expand-wildcards "*.vbproj" t) (file-expand-wildcards "*.shfbproj" t) (file-expand-wildcards "*.sln" t)) "msbuild ") ;; sometimes, not sure why, the buffer-file-name is ;; not set. Can use it only if set. (buffer-file-name (let ((filename (file-name-nondirectory buffer-file-name))) (cond ;; editing a .wxs (WIX Soluition) file ((string-equal (substring buffer-file-name -4) ".wxs") (concat "nmake " ;; (substring buffer-file-name 0 -4) ;; includes full path (file-name-sans-extension filename) ".msi" )) ;; a javascript file - run jslint ((string-equal (substring buffer-file-name -3) ".js") (concat (getenv "windir") "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js " filename)) ;; something else - do a typical .exe build (t (concat "nmake " (file-name-sans-extension filename) ".exe"))))) (t "nmake ")))) (defun cheeso-invoke-compile-interactively () "fn to wrap the `compile' function. This simply checks to see if `compile-command' has been previously set, and if not, invokes `cheeso-guess-compile-command' to set the value. Then it invokes the `compile' function, interactively." (interactive) (cond ((not (boundp 'cheeso-local-compile-command-has-been-set)) (cheeso-guess-compile-command) (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t))) ;; local compile command has now been set (call-interactively 'compile)) ;; in lieu of binding to `compile', bind to my monkeypatched function (global-set-key "\Cx\Ce" 'cheeso-invoke-compile-interactively) 

我试图做这个编译function的“之前build议”,但不能令人满意地工作。 所以我定义了一个新的函数,并将其绑定到我用于compile的相同按键组合。


编辑那里现在是“ smarter-compile.el ”这进一步采取这个想法。

在文档查找:这取决于您的编程语言。

C库和系统调用通常logging在手册页中。 为此,你可以使用Mx man 。 有些东西可能会在信息页面中被更好地logging; 使用Mx info

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

我发现大多数其他语言提供html格式的文档。 为此,请尝试embedded式浏览器(我使用w3m)。 将您的BROWSER环境variables设置为emacsclient -e "(w3m-goto-url-new-session \"$@\")" (on * nix)的包装脚本,以防万一有可能打开浏览器并打开它里面的emacs。

最近几年,Clang成为了Emacs C ++支持的重要组成部分。 Atila Neves在CppCon 2015上进行了一次演讲: “Emacs作为C ++ IDE”

这是一个16分钟的谈话,在那里他展示了以下主题的解决scheme:

  • 跳转到定义
  • 自动完成
  • 即时语法突出显示
  • 在项目中查找文件

幻灯片可以在这里find。

在Unix或X窗口风格,我不知道有一个集成的IDE适用于一切。

为了与debugging器交互,只需要一个IDE的一个组件,可以考虑realgud 。 另一件我觉得有用的是位置消息的parsing器,所以如果你有一个调用堆栈跟踪,并且想要在callstack中的特定位置进行编辑,这个前端接口就可以做到这一点。

到目前为止这个程序可以使用改进。 但是也可以使用它来改善它。

免责声明:我在realgud上工作