右前面:我不是要开始一场宗教战争.
我已经习惯了vi,而且我曾几次尝试过Emacs,我已经迷失了,我很快就放弃了.然而,很多人发现Emacs非常强大.它的可编程性有点传奇.我主要做Solaris + Java开发,我想问一个简单的问题:如果我花时间去了解Emacs,我的工作效率会提高吗?它在Vim上提供的功能是否会在合理的时间内提高生产力?
重复:我不想要"我的编辑比你好"的答案.对于是否值得投入时间,我只想要一个是或否答案.我的生产力真的会提高吗?
[免责声明:就个人而言,我更喜欢Vim.免责声明免责声明:请继续阅读.
Vim擅长于小型:通过动作和动作分离概念并为复杂的重复提供设施,您可以在短暂的击键序列中执行令人难以置信的强大编辑操作.您可以在正常的编辑过程中轻松地在Vim中执行操作,这需要您下载到Emacs中的脚本.此外,您使用的大多数电源都是开箱即用的,因此即使您有大量的.vimrc
自定义功能,您也可以在任何 Vim安装中高效地工作.
Emacs在大型方面表现优异:通过将其所有UI概念直接映射到Elisp中的基本构造和概念,可以非常轻松地为特定类型的文件或环境全局引入功能,使Emacs像基于文本的更加结构化可编程的Excel形式.这假设您将花费大量时间根据个人需求和偏好定制您的环境.当然,Emacs确实尽力让你能够轻松地在一个环境中保留所有你想做的事情.
最终,两者都不是优越的.它们提供不同的风格,根据您的倾向,一个或另一个将更适合您的个人需求和思维方式.当然,了解两者(加上更多编辑者)总是有帮助的.但是你不会以这种方式或那种方式提高效率.
我更喜欢emacs到vi,但我对两者都很满意.
你可以在emacs中做一些使它比vi更强大的东西,但并不是所有的东西都与编程相关.(你可以发送电子邮件或从vi内部阅读新闻吗?不,但是谁在乎?)如果你对lisp感到满意(我不是),你可以编写附加组件和模式以及创造生活的东西更容易,但这可能是语法着色和大括号匹配和像这样的眼睛糖果.
我现在停止漫步.使用emacs 会提高您的工作效率吗?没有.
更新:请参阅下面的评论.由于我公布这一点,我已经遇到方式是使用emacs使我比使用vi更富有成效.
vi是菜刀.
vim是一把非常漂亮,锋利,平衡的厨师刀.
Emacs是一把轻剑.
大多数时候,我的工作要求我切菜.偶尔,我必须承担一整套机器人.
我已经使用Emacs 20年了.我正在输入Emacs,其中有一个名为"It's All Text"的小部件,它允许我在Firefox中的文本框中输入文本.我可以在Emacs中快速前进.没有它,我的生产力会大大降低.
这是非常有争议的,但我也认为学习Emacs可以教你一些关于编程的惊人数量.
根据您的编码方式,您可能会看到生产率的提高.对于背景,我也是一个长期的vim用户,但是大约两年前我学习了emacs,现在可以互换使用它们.
是什么驱使我到了实际学习emacs的重点是它能够同时打开大量文件并轻松切换它们.我正在介绍一个添加并触及大量课程的功能.(这是C++,所以每个类通常有两个文件.)由于我仍然坚持界面,当我意识到我需要改变另一个时,我通常会更新一个文件.
使用gvim,最简单的方法是为每个文件打开一个新窗口,这个窗口开始变得笨拙.但是,使用Emacs,在同一窗口中打开一个新文件很简单(Ctrl-x,Ctrl-f).一旦Emacs打开了文件,就可以很容易地在打开的缓冲区之间来回切换(Ctrl-x,Ctrl-b).
更进一步,单个emacs会话可以打开许多窗口,所以除了垂直分割窗口之外,我可以在不中断文件工作的情况下决定打开另一个窗口,让我有效地一边工作.同时仍将每个窗口保持为默认的80个字符宽度.
在vim中仍然有一些我觉得更容易的事情(例如块选择模式,简单的宏录制,差异模式),以及在Emacs中更容易的事情(行对齐,文件/缓冲管理,窗口/屏幕管理).因此,我发现自己在两者之间交替(有时同时使用两者),这取决于我预期的编辑任务.
如果您仍然不确定,我建议您尝试一下.运行Emacs教程,然后使用它来编写早上或一天的代码,严重依赖于帮助.如果你仍然不喜欢你所看到的,请留在vim.无论编辑带来什么,您对该工具的熟悉程度和知识将是您工作效率中最重要的因素.
我不想要一场神圣的战争,但请回答一个非常主观的问题,回答是/否.
是的,由于强大的功能,您可能会看到生产力的提高.
不,你不会看到生产力提高,因为emacs中使用的模式和隐喻可能与你的大脑不一致.
对你的问题的简短回答是,"是".更多细节如下.
我几乎专门从1980年到1991年使用vi.唯一一次我没有使用vi的时候是我处理的Unix的最小安装量太小而不能包含vi,所以我不得不回到ed这是原始vi构建在其上的最小编辑功能子集.
从大约1985年开始,我工作的其他程序员不断赞扬emacs.但每次我试着学习它,我都不会走得太远.我花了一个小时来浏览emacs turorial(Ch t),到最后我知道如何插入和修改文本并在屏幕上移动.我可以用vi做更多的事情,而不是我在那个小时里学到的那些我无法进行切换的emacs.三个月后,我有时间再花一个小时,我最终会通过同样的材料.Emacs有一个学习曲线,大写字母为"L".直到我做了一个合同,其他人都使用了emacs,我最终决定我需要花费一个多小时来学习它.花了一天多的时间,除了完成教程和附带的文档之外什么都没做,我终于到了能用ema做的事情,我无法用vi做.从那以后,我再也不想回去了.我仍然可以在睡眠中输入vi命令,但是我可以用emacs做更多的事情.
明白我正在比较emacs和vi,而不是vim.我从来没有学过vim添加到vi的扩展,很可能很多都是从emacs复制的功能.如果是这样,如果你已经精通vim,emacs可能不会为你带来多少优势.
在emacs中我一直依赖的东西包括:
当您使用emacs时,所有内容都被视为文本.这意味着您可以使用几乎相同的命令操作任何缓冲区中的任何数据.如果缓冲区处于某些标准命令不可用的模式,您可以将文本复制到以基本模式运行的另一个缓冲区,并在那里使用标准命令.
Emacs提供了一个可在字符单元终端上显示的多"窗口"环境.在位图图形和真实窗口之前的几天,编写emacs以模拟类似窗口的行为,只使用ascii字符和光标定位.你可能在想,"那是古老的历史.今天为什么要关心这个?" 我每天仍然使用这种能力.我使用允许SSH访问的虚拟主机公司.所以我可以通过Internet登录Linux主机并运行shell命令.虽然这非常强大,但是能够使用emacs将我的终端模拟器划分为"windows",在几个"窗口"中运行shell,在其他窗口中编辑文件,以及在其他窗口中查看和编辑目录,功能强大得多.视窗".
实际上,当我在前一段中说"窗口"时,我的意思是"缓冲".Emacs的窗口角色单元模拟是一种划分屏幕空间的方式.emacs缓冲区与当前可能显示或可能不显示的内容(文件,bash shell,目录,与文件无关的任意文本等)相关联.要查看缓冲区中的内容,请选择一个窗口并告诉它要查看的缓冲区.因此,您可以开展更多的工作,而不是在屏幕上显示空间.它大致类似于在图标化/取消图标化窗口时在现代位图图形GUI中的操作.
我已经提到过你可以在emacs缓冲区中运行shell这一事实.您可以根据需要使用尽可能多的缓冲区运行shell.您可以在shell缓冲区和文本文件之间来回复制和粘贴文本,或者使用完全相同的击键序列比较shell缓冲区和文本文件之间的文本部分,用于复制文本或比较两个不同文本之间的文本文本文件.实际上,大多数类型的缓冲区都是如此,而不仅仅是shell缓冲区和与文件关联的缓冲区.
当您使用emacs命令打开文件,但您选择的实际上是一个目录时,缓冲区以dired(目录编辑器)模式运行.在此模式下,单个击键将打开光标当前指向的任何内容,无论是文件还是子目录.处于直接模式的缓冲区是文件管理器 - 在Mac或Windows资源管理器上与Finder类似的字符单元终端.
我经常使用的emacs函数之一是"compare-windows".我更喜欢这个命令行"diff"或GUI比较工具,比如Eclipse中内置的工具.Diff或Eclipse比较整个文件,并显示哪些行不同.但是当你有两条看起来非常相似的不同线条时会发生什么?考虑以下:
这条线和另一条线有什么区别?
这条线和另一条线有什么区别?
你发现差异需要多长时间?(提示:ASCII和Unicode撇号看起来非常相似.)
与diff和Eclipse(只显示不同的行)不同,emacs的"compare-windows"功能是交互式的.将光标定位在窗口内容相同的两个并排窗口中的每一个窗口中.运行"compare-windows",每个窗口中的光标将移动到不同的第一个字符.将光标重新定位在其中一个窗口中,使其与另一个窗口相同,然后重新运行"compare-windows"以查找下一个差异.这样可以轻松比较文件的子部分.
我经常使用"compare-windows"的另一件事是比较校验和.许多软件项目在一个页面上分发应用程序的tarball,该页面还包含tarball的MD5哈希值.那么,如何比较分发页面上的MD5哈希值与从下载文件计算的MD5哈希值.Emacs使这一点微不足道.
首先将MD5哈希从网页复制到新的emacs缓冲区.然后,在下载.tar.gz文件后,运行:
md5sum已下载文件.tar.gz
在shell缓冲区中.将这两个缓冲区显示在并排的emacs窗口中,将光标放在校验和开头的每个窗口中并运行"compare-windows".如果它们相同,则每个窗口中的光标将位于每个校验和的末尾.
在上一点中,我给出了在行上运行"compare-windows"的示例:
这条线和另一条线有什么区别?
这条线和另一条线有什么区别?
"compare-windows"将光标定位在每行的撇号上.那么,现在你知道哪些字符不同了.但他们是什么角色?键入两个击键命令CTRL-x =,emacs将显示该字符,其八进制,十进制和十六进制的ascii值,从文件开头的字符偏移量,以及从行开头的字符偏移量.由于ASCII是7位编码,因此所有ASCII字符的高位都被关闭.一旦你看到第一个撇号的值是0x27而第二个撇号的值是0x92,很明显第一个是ASCII字符集,第二个不是.
Emacs是最早的IDE之一,也许是第一个.它具有特定语言的模式.我发现在我的代码上强加一致的缩进以使其更具可读性是很方便的.还有用于编译和调试代码的内置功能.我没有那么多地使用编译功能,因为在我编写像C这样的编译语言时,我习惯于在shell提示符下执行此操作.调试功能非常适合C和C++.它将gdb与编辑器集成在一起,使您获得与Eclipse中现在的调试功能几乎相同的功能,但不会像现代基于GUI的IDE那样浪费屏幕空间.从理论上讲,调试器集成应该很容易使其适用于几乎任何其他语言,但我还没有检查过它现在使用的其他语言.
Emacs允许您通过告诉它何时开始记住您正在键入的内容以及何时停止来创建宏.这对于您经常执行的任务非常有用.
如果你知道Lisp,Emacs是无限可扩展的.但即使我从未学过Emacs Lisp,我仍然发现Emacs是我用过的最强大的工具之一.
Emacs键绑定.我将是第一个承认Emacs密钥绑定很糟糕的人.但它比我用过的任何其他东西都强大得多,我愿意忍受键绑定.
多年前,Emacs的作者Richard Stallman(也是GPL的创始人,GNU项目的创始人和FSF的创始人)以幽默的方式讽刺那些将vi与emacs视为圣战的人.他发明了Emacs教会的角色"Saint IGNUcius".Stallman用这种幌子评论说:"有时候人们会问我在Emacs教会中使用其他文本编辑器是否是一种罪恶.嗯,vi vi vi是野兽的编辑,但使用的是免费版本vi不是罪,而是忏悔." (请参阅http://stallman.org/saint.html.还有一张他可爱的照片,但由于我是StackOverflow的新手,所以不会让我发布多个网址.所以去同一个域名,但是获取文件saintignucius.jpg)
我用Vim工作了10年,直到2年前深入研究Emacs.我有一个相当新鲜的回忆,即我的生产力曲线如何随着时间的推移而改变.
我的观点都是有条件的,YMMV取决于你的优势和经验.
如果你已经使用Unix和命令行足够长,以至于你熟悉Ca,Ce,Cn,Cp,Ck,Cy等,因为它们在shell上运行,转换到使用那些相同的绑定不需要很长时间(默认情况下)在Emacs中.我最近发现XCode也使用这些绑定.
如果您对一个始终运行的编辑器感到满意,那么管理缓冲区(就像浏览器选项卡一样)并因此生活在应用程序中(就像您在浏览器中使用Web2.0应用程序一样),Emacs可能会立即显示生产力增强.
如果您通常在许多相关文件的项目中工作,则此持久性在维护该缓冲区的上下文时会带来一些额外的好处.每个缓冲区都在其打开的文件中进行上下文,从而可以方便地为您的项目使用各种生产力提升工具(如grep-find,eshell,run-python和slime).这与文本完成,yasnippets等相结合,开始看起来像IDE一样很小,尽管ad-hoc和你的配置非常个性化.这与ECB之类的更加文明的Emacs IDE类服务不同.
我的生产力最初受到了打击,因为我在第一周左右不断输入"jjjkkk"Esc-Esc-Esc-Esc.接下来的一周,我小心翼翼地开始使用正确的导航键.然后我发现了配置文件......老实说,如果我从一开始就拥有Emacs入门套件,我会说我的生产力在第3到第4周慢慢恢复到平价,但我确实顺着配置文件兔洞.不过,我的一位同事刚从vim过渡到emacs,他只是抓住了入门套件,他正在路上.第一周,他似乎很舒服,享受所有惊喜的好处(感觉可能会持续十年).
最后,如果你犯了错误,你将立即从循环杀戮/抽搐戒指和撤销戒指中获得生产力(和信心).我也是个人特定区域的粉丝.
我的简短回答是,是值得花费3-4周的时间来减少生产力,以学习Emacs.即使您决定优先使用简化的unix实用程序组合而不是Emacs进行开发,您也可以从中获得超出编辑器的广泛应用的教育.
Emacs文档是一个森林.当我意识到Vim的文档是如何有条理的时,我从Emacs来到Vim,以及许多功能是多么的可用.我不知道Emacs专家的路径是什么,但我会警告你,学习做任何有用的事情需要很长时间,并且不会让你在nethack上更好.坚持使用Vim.
Textmate是适用于Mac的更好的Emacs,尽管这对Solaris没有帮助.Eclipse很酷,而且有很多插件.
如果您愿意学习和定制它以满足您的需求,Emacs将提高生产力.大多数人不是.为了提高工作效率,您必须使用该工具进行简单编辑 - 大多数人从未进行过简单编辑.
这是一个快速测试:您是否定制了窗口管理器以使您的环境更加高效(根据您的需求量身定制)?如果"不",那么通过学习emacs可能无法获得投资回报率.
话虽这么说,如果你正在开发Java,Eclipse是标准答案,所以你的问题是没有实际意义的.
我对我的Vim非常满意,但是一旦听说了组织模式,我开始学习Emacs.组织模式可能是学习Emacs的一个重要原因.
我喜欢emacs并且每天都使用它.
也就是说,我认为学习它的成本不会因为生产力的提高而得到补偿.
如果您正在编写Java,那么您需要一个好的IDE.Emacs走向成为一体的公平道路,但让我们面对它,IDEA等人击败了它.(emacs可能启发了很多IDE,但这是另一个故事).