程序员的工作效率:Emacs vs IntelliJ IDEA-阿里云开发者社区

开发者社区> -开发者助手-> 正文

程序员的工作效率:Emacs vs IntelliJ IDEA

简介: 我用 Emacs 写了 7 年的 C++ 代码。 4 年前,当我换了工作,开始使用 IntelliJ IDEA 转向 Java 开发。毫无疑问,比起 Emacs,我在 IntelliJ IDEA 上写代码更有效率。
+关注继续查看

我用 Emacs 写了 7 年的 C++ 代码。 4 年前,当我换了工作,开始使用 IntelliJ IDEA 转向 Java 开发。毫无疑问,比起 Emacs,我在 IntelliJ IDEA 上写代码更有效率。

image.png

导航

代码好像真的是80%由导航生成,只有20%是实际写作的结果,IntelliJ IDEA的真正亮点所在是导航到代码库。例如,假设你要添加功能到现有的类,即使你对那个类很熟悉,你还是需要检查新代码该放在哪里比较合适,需要添加一 个新的声明吗?还有什么其他的类在使用你现在修改的方法?这些都需要查看现有代码。


甚至在你写代码时也会有很多导航,你想要使用的那个方法的名称是什么?参数的序列是什么-是先有一个string,然后一个整型,或是其他方式?枚举可能的取值是什么?


有一些些导航存在于一个文件中,而在一个文件中我最常用的操作有:跳转到文件的顶部或底部,转到一行的开始或结束,选择文本,剪切,复制,粘贴,向前向后搜索,注释以及取消注释代码。 Emacs 和IntelliJ IDEA对这些操作都有很好的命令和快捷键支持。


但是,当涉及到文件之间的导航时,IntelliJ IDEA就有很大的优势。其中一个最有用的命令是Ctrl + B(转到声明),正如其名所暗示的,你可以转到变量,方法,以及类的声明处,即使它在另一个文件中。Ctrl + Alt + 左键可以返回上一级,我时刻都在用它,经常会在跳几级后回到开始的地方。


另一个相关的导航命令是Ctrl + Alt + B(转向定义)。在一个接口的方法名处使用此命令,你将会得到一个弹出的列表显示着这个方法所有实现的地方,然后你可以选择一个你需要转向的,(如果只有一个实现,你就可以直接转到哪儿)。重载方法是同样的道理。

与此相反的是Ctrl + U (转向父类方法或父类)。如果插入符在一个接口函数的实现处(一个小小的界面符号在方法名的左侧),这个命令将会带你转到接口本身。


当我想查看一个方法或变量被使用的所有地方时,我使用Ctrl + Alt + F7(显示用法)。这个命令弹出一个包含所有使用处的列表,你可以很容易地转向任意一个。如果要查找类,我使用Ctrl + N ( 转到类),它可以让你使用大写字母和*通配符搜索类名。我也经常用ctrl + E。他会弹出一个窗口包含了最近最常使用的15个文件(最常使用的在最上面)。你只需要向下选择一个你想要的,然后按下回车转到它。


另一个有用的命令是Ctrl + P(参数信息),在方法和构造函数的参数处使用它来获得一个弹出窗口显示参数的名称和类型。而在Emacs中,从某种意义上来说这不是导航,你将不得不去方法或构造函数的定义处去找到这些信息。


上述所有的命令是难以置信的节省时间。在Emacs中,你需要自己转到文件以便找到你所需要的。而在IntelliJ IDEA中,它是自动的。事实上,我注意到,在我使用C++和Emacs的日子里,比起Java我定义的类趋向于更大,方法少而且长。我想一个原因是,当 一切操作都在同一个文件中时Emacs导航更加容易,但是对于具有巨大导航功能的 IntelliJ IDEA来说,如果功能分散在多个文件中也并没有多大的关系。


其他优势

除了导航,IntelliJ IDEA在很多方面都具备优势。虽然这两种环境都有语法高亮, IntelliJ IDEA在此之上增加了一个新的有用功能。静态的方法和变量以斜体显示,没有使用的变量或方法会变灰。当然,IntelliJ IDEA会用红色标注任何你输入的语法错误。没有必要再去为了检查错误编译程序-它会实时地帮你完成。


在实际编码时IntelliJ IDEA也会有一些非常有用的功能。首先就是名称的自动补全,键入一个变量或方法名的几个字母,按Ctrl+空格键,名称会被补全。或者在点后按Ctrl+空格可以查看一个对象的可用方法。


另一个功能,根据IntelliJ IDEA的使用统计数据,是我用的最多的一个单一功能,那就是语法的自动选择。当你反复按下 Ctrl + W,他对代码的选择部分会越来越大。例如,它就会选择一个方法名,然后是一个表达式,再然后是整个语句,最后是整个代码块。这在搜索,排版缩进,注释代码 时非常有用。


当然,还有重命名支持。在Emacs中,如果我重命名一个方法名称,我需要做查找和替换。但是对于每一个替换,我不得不检查以确保我不会一不小心改 变不应该改变的东西。如果方法是公有的,我又必须在其他类中找到出现的地方。在IntellJ IDEA中,这就变成一件非常容易的事情。仅仅需要选择方法名,按下Ctrl+F6,输入新的名字,然后敲回车。所有文件中方法名出现的所有地方都将会被 替换。


对IDE毫无根据的顾虑

我经常会看到一些评论,关于如何你如果使用了IDE,你就必须很多时候在使用使用鼠标和菜单。这是完全错误地。我在所有的程序中都喜欢用快捷键,尽 量不用鼠标。IntelliJ IDEA对于所有的命令都有强大的快捷键绑定,而且很容易增加新的或者修改现有的命令。所以你需要使用鼠标和菜单的情况并不多。以上我提到的所有命令都是 用快捷键访问的。


另一个毫无根据的顾虑是你只能做那些列在IDE菜单中的操作。这也是一个不能成立的观点。就我而言,我所做的正和我在emacs中的一样,即编写和编辑代码。唯一的区别是,IntelliJ IDEA更快更准确。


还有一个普遍的担心,即你会被强制带入到IDE“封闭的环境中”。好了,没有什么可以阻止你在需要的时候使用其他具。源码树一直在那里存在。退出 IDE,去用任何你需要的工具,然后再返回来。例如,我有时需要跨越好几个IntelliJ IDEA工程使用grep。在这些情况下,我就会用一个合适的正则表达式来使用grep。没有什么大不了的。

最后,我还看到的一种说法是IDE到处加了配置和元数据文件。在IntelliJ IDEA中,只有3个工程文件被加到了目录结构的根目录下。就是这样,非常的不起眼。


你不知道你错过了什么

非常有趣的一件事是,在我换用IntelliJ IDEA之前我非常喜欢用Emacs。我已经学到了很多快捷操作,已经变得非常善于编辑。我也非常善于使用grep,查找以及使用目录结构中的其他的 Unix命令,因此并没有觉得我还缺少什么工具。(Unix命令行工具最好的来源是 Unix Power Tools)


当我开始用Symsoft时,几乎所有的开发人员都在使用 IntelliJ IDEA。所有就很自然地尝试了。我很快发现可以用它能做什么,并且永不回头。事实上,一旦意识到它可以做一些酷的东西,我就坚持展示它给我的前同事看。 无论何时,只要我和他们共进完午餐,我都会带他们来到我的办公室。给他们展示一些IntelliJ IDEA的招数,眼见为实。


但是一个好的编辑器总会有自己的空间

对于一个好的文本编辑器来说总会有一些有用的地方。即使我没有用Emacs写java,我还是几乎每天都在用它。这是我编辑文本文件的选择,我也偶然用它编写bash和ruby脚本。


然而,就在前几天,我的一个同事提出了关于文本编辑器的话题。他提到他开始学习VIM,本着确保我知道我错过了什么的精神,我也会试试看。所以过会儿,我将会用Vim代替Emacs。让我们看看结果会如何呢。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
黑马程序员 二、方法与数组
获得更多资源关注Java帮帮IT资源分享网  二、黑马程序员—方法与数组 第二篇: 1、什么是方法(Method)? 方法是一组为了实现特定功能的代码块的集合。方法在语法上的功能主要有以下两个: ①:结构化代码 将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护 性强。 ②:减少代码重复 一个固定的功能,可能会在程序中多次使用,在
1341 0
一个6年Java程序员的年终总结,写给还在迷茫中的你
我越来越担心我作为一个Java程序员的未来。 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫折。
967 0
黑马程序员 一、java 概述与基础知识
获取更多资源关注Java帮帮IT资源分享网 一、黑马程序员—java 概述与基础知识 1、何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程。 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通 过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完 成某种特定的任
1549 0
黑马程序员 十、IO 文件操作(2)
Java帮帮-IT资源分享网  十、IO 文件操作(2) 1、内存操作流 操作内存流的时候(从读取出来,注意一定要把真正的数据用toByteArray或者toCharArray 将数据读出来) 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内 存操作流。此时要使用内存流完成内存的输入和输出操作。 如果程序运行过程中要产生一些临时文
1213 0
黑马程序员 八、集合框架(2)
Java帮帮-IT资源分享网  八、黑马程序员—集合框架(2) 第八篇 集合框架(2)  1、Collections 类 操作集合的工具类: static void reverse(List list):反转指定 List 集合中的顺序;(和 ListItertor 的逆序排列一样!) static void shuffle(List list):对集合元素
1182 0
黑马程序员 七、集合框架(1)
Java帮帮-IT资源分享网  七、黑马程序员—集合框架(1)  第七篇 集合框架(1)  1、集合类 & 容器 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要 对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的;集合长度是可
1549 0
黑马程序员 六、线程技术
Java帮帮-IT资源分享网  六、黑马程序员—线程技术 第六篇  1、进程和线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中 可以有多个线程。比如在 Windows 系统中,一个运行的 xx.exe 就是一个进程。 Java 程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程) 线程是指进程中的一个执行任务(控
1252 0
《高效能程序员的修炼》一导读
出版社的冀康一开始来找我谈翻译这本书的时候,我的第一反应是:这兄弟真是不知道我现在有多忙!我每天要处理200多封邮件;在资源有限的情况下经常要同时带6~7个项目,而且每个项目的交付计划都很紧,压力很大;每天起码工作12个小时,有时候还要熬夜跟美国同事开会;周六基本上也是工作状态……我哪里还有空来翻译
1253 0
2450
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载