Emacs和Vim的区别

在没有宗教争论为什么一个比另一个更好的情况下,Emacs和Vim之间的实际差异是什么?我想学习一个或另一个,但我意识到每个人的学习曲线都很高,我无法决定。我从未使用过这种类型的编辑器(我一直使用IDE),所以任何能帮助新手的东西都是加分项。


在火焰大战开始之前:我不是在问哪个更好,我是在问两者之间的差异。我想要一个目标的比较。

499508 次浏览

我选择使用emacs而不是vim的最大区别是emacs中内置的gdb支持。Vim的默认发行版中没有包含这一点,并且集成gdb和vim的项目几乎不可能与MacVim一起工作

在日常层面上存在巨大差异-Vim(或任何vi变体)本质上是模态的(您进入无法编辑的命令模式)而Emacs(以及大多数其他编辑器)不是。

当然,使用菜单之类的东西,你一开始不必在Vim中真正进入命令模式。但要使用Vim的一小部分功能,你就会使用。这是Vim/Emacs辩论的核心。

就个人而言,我也认为Emacs的可扩展性要高得多。您可以找到许多Elisp包。

不过,我很好奇,为什么你想在更传统的IDE上学习其中的一个。你想学习其中的一个是为了什么?

Vim不是shell。它不能很好地与子进程通信。这几乎是由设计决定的,而在Emacs中,这些元素是由设计包含的。这意味着有些东西,比如嵌入调试器或解释器(产生某种IDE),在Vim中很困难。

此外,Emacs快捷方式主要通过修饰符访问,显然Vim界面是着名的模态,可以访问大量用于操作的直接键。

Emacs曾经是两个编辑器中唯一可编程的,虽然Vim的可编程性有很多奇怪的级别,加上Python和Ruby绑定(还有更多,我忘了),Vim在你关心的大多数方面也是可编程的。

我使用Vim,我对它相当满意。

Vim:

  • 作为一个简单的编辑器更好(简单任务需要更少的键)
  • 更活跃的脚本社区-内部语言:vimcript
  • 一个脚本、插件、配色方案的中央存储库…
  • 也可在python、ruby中扩展
  • 可以变得便携(emacs有一些问题)

Emacs:

  • 默认情况下是非模态的(今天的大多数编辑器都采用了这种方法)。虽然有邪恶模式模拟vim行为。
  • 更强大的语言来扩展它(elisp是一种成熟的语言,在emacs中你几乎可以重新定义所有东西;而在vim中你不能重新定义编辑器的构建函数。缺点是,vimcript与今天的动态语言相对相似,而elisp几乎没有任何相似之处)
  • 更可扩展
  • 对GNU工具的出色支持(其中的一部分)

就个人而言,我更喜欢vim——它很小,做它应该做的事情,当我希望一个完整的IDE时,我打开VS。Emacs作为一个编辑器的方法,想成为一个IDE(或者我应该说,一个操作系统),但不完全是,IMHO,过时了。在过去,有一个电子邮件客户端,ftp客户端,俄罗斯方块,……在一个包中(emacs)是有意义的……现在,它不再是了。

然而,两者都是程序员和超级用户社区用户之间宗教讨论的话题,在这方面,如果接触(在同一个句子/问题中),两者都非常适合开始火焰战争。

Emacs具有毒蛇模式,因此在某种意义上,它提供了超集的功能(除了Emacs与Viper和VPulp一起缺少哪些Vim功能?中描述的功能)。

vi(和VIM IIRC)重量更轻(它可以就地编辑文件),但提供的功能较少(子进程通信、扩展语言)。

对我来说,emacs的优点是,

  • tramp-mode允许您通过ssh编辑远程文件。就像本地文件一样。
  • tramp-mode+dired=全功能sftp客户端
  • 支持您需要的每种语言。
  • 内置终端模拟器(术语模式),因此我可以保持编码而无需在应用程序之间切换。
  • 可扩展性任何你不喜欢的东西都可以使用lisp进行更改。
  1. Vim的启动速度总是比Emacs快。我的意思是,在任何机器上,开箱即用的Vim安装都会比开箱即用的Emacs更快。我倾向于认为,在对其中任何一个进行适度的定制后,Vim仍然会比Emacs更快地启动。

  2. 在那之后,另一个实际的区别是Emacs的模式。它们使您在编辑XML、C/C++/Java /whatever、LaTeX以及您能想到的大多数流行语言时的生活变得非常轻松。它们使您想让编辑器在长时间的会话和工作中保持打开状态。

总而言之,我要说的是,Vim将您拉向它以完成简短,快速的编辑任务;而Emacs鼓励您深入进行长时间的会话。

VI始终可用,并且将在最残缺的单用户模式,损坏的图形,没有键图,链接速度慢的机器上运行-因此值得了解如何仅为系统管理员任务编辑简单文件。

Emacs是编辑器中的一个完整的用户交互界面。这个想法是当您启动机器时启动Emacs,并且永远不会离开它。可能存在数千个会话。

与使用GUI编辑器/IDE和使用python/awk/etc等其他任务相比,学习Emacs的功能是否值得取决于您。

对我来说,emacs有更好的开发工具(不仅仅是基于标签的工具)。

我是一个成熟的Emacs粉丝,但早在我认识Emacs之前我就认识了VI。也就是说,我让我所有的人都学习VI,因为它总是可用的,无处不在。他们中的任何一个都不会出错。

我从vi开始,到emacs,然后到vim。我一直在考虑试用Emacs,看看过去五年发生了什么变化。(说到IDE,我已经进入eclipse一段时间了,但我更喜欢我的终端窗口连接我的mac和我(丈夫的)linux盒子)。

剪切和粘贴的事情最近一直困扰着我。在Vim中剪切和粘贴比在Emacs,IIRC中需要更多的步骤。从浏览器粘贴到终端窗口很烦人,除非你做一些我不想做的花哨的事情,所以我忍受了奇怪的缩进。我认为,在emacs中编辑多个文件更容易。至少从一个文件跳到下一个文件,如果你把它们都放在屏幕上。

我没有玩过vi或emacs的花哨功能,因为我只是喜欢编码。我所需要的只是漂亮的颜色和正确的制表符到空间的转换(对于python尤其重要)。

我认为这一切都取决于你是否想使用:wqCtrl-x Ctrl-s(IIRC)来保存文件,如果你不关心花哨的东西。

@mgb是正确的。一两个月前,我在Debian发行版中使用最低限度的linux来修复一些东西。vi是唯一可用的编辑器。

如果您正在寻找对这两个编辑器的客观分析,请查看它们的起源和各自设计背后的理念。想想,哪一个更适合您并学习它(并学习它并学习它,因为您需要时间才能发现它与任何IDE相比的真正实用性)。用Vi进行显示编辑介绍是Bill Joy和Mark Horton写的,他解释了为什么他选择模态设计和各种按键的理由(它帮助我记住CTRL-W+W(将切换到下一个Window,CTRL W+CTRL W也是如此,以防万一你持有CTRL键的时间更长。

这是Emacs时间线的链接,并引用了Multics Emacs论文。这是Emacs上的RMS论文,我看到重音是在可编程文本编辑器上(甚至早在1981年及之前)。

我没有读过emacs的论文,但读过Bill Joy的vi论文几次。两者都是旧的,但你仍然会得到哲学,你可以选择使用当前的工具(vim 7. x还是emacs 25?)

编辑:我忘了说,阅读这两篇论文需要耐心和想象力,因为它会让你在阅读时回到过去。但这是值得的。

首先Vi(原始实现)今天没有使用。你说的是一些Vim派生。

要扩展Vim功能,您必须重新编译Vim,而不是Emacs。

Emacs在self(viper-mode)中有Vim。

Emacs通常需要手动安装,Vim通常预装在所有Unix等操作系统上(但如果您有ssh访问主机tramp-mode win Vim:)。

如果你尝试Vim,你会讨厌Emacs,所以先从Emacs开始。

另请阅读http://www.dina.dk/~abraham/religion/vi-tutorial.html(链接向下,因此使用这个

搜索hxxp://en.wikipedia.org/wiki/Editor_war

(以下文字是我的观点,不应被视为事实或侮辱)

使用Emacs,你希望它全天候开放,并生活在程序中,几乎你所做的一切都可以从那里完成。你编写自己的扩展,用它做笔记,组织,游戏,编程,shell访问,文件访问,听音乐,网页浏览。你需要几周又几周的时间才能对它感到满意,然后你会一直学习新的东西。当你无法访问它并不断更改你的配置时,你会感到恼火。你将无法轻松使用其他人的emacs版本,并且不会只是安装。它使用Lisp,这很棒。你可以把它变成你想要的任何东西。

使用Vim,它几乎总是预装的。它很快。你打开一个文件,做一个快速编辑,然后退出。如果你在别人的机器上,你可以使用基本的设置。它不是那么可编辑,但它仍然比大多数文本编辑器好得多。它认识到大多数时候你是在阅读/编辑而不是打字,并使这部分更快。你不会受到emacs小指的困扰。它不那么令人愤怒。它更容易学习。

即使我每天都在使用Emacs(并且喜欢它),除非你打算花很多时间在你选择的程序上,否则我会选择vim

似乎答案已经选定,但对我来说最大的区别一直是模态与非模态。Vim是模态的,这意味着它基于一组特定的使用模式进行优化。至少我一直是这样看待它的。这使得使用Vim成为一种不同的体验,因为你不是在一个工作区输入代码,而是在告诉一个环境对文本采取行动。这就是为什么人们说使用Vim之类的东西你真的在学习一门语言。: wq和: s/foo/bar都是编辑和读取文本的类似shell的环境的一部分。

另一方面,Emacs更接近你今天看到的大多数编辑器/文字处理器等。你有一个具有高度可编程界面的工作区。这就是为什么你会看到电子邮件、irc、shell等东西。作为一名程序员,很容易想到“拿我所在的行号,对信息做些什么”。离开编辑器的愿望变得不那么强烈,因为你不必退出,打开其他应用程序/语言并对一些文本做些事情,你有Emacs,你可以在编辑器的范围内做这些事情。

这两种想法并不一定形成鲜明对比,但它们只是揭示了两个不同的焦点。就我个人而言,我使用Emacs,但我见过一些非常了解Vim的人,他们可以诚实地说你选择哪个并不重要。我先尝试了Vim,但Emacs最终坚持了我的观点。的确,无论你选择什么,你都应该至少精通Vim,因为它真的总是可用的。

如果你经常从一个站点移动到另一个站点,或者你的工作涉及登录到生产系统,那么vim就是你要走的路。

默认情况下,所有*nix机器都将安装vi。

大多数sysdamins更喜欢ksh作为默认shell。ksh使用vi(或emacs)命令击键来搜索历史记录并编辑命令行。

如果您不了解vi,那么当您使用标准配置登录到unix框时,您将严重残疾。

仅出于这个原因,我就会推荐vim作为您的日常编辑器。我见过emacs粉丝在试图修改裸露的unix服务器上的配置文件时撕破头发。

在你的问题中,你没有提到你希望它用Lisp编程!但是当你评论你的答案时,我明白你实际上想要一个LISP编程接口。

对于这项精确的任务,只需忘记Vi。Emacs与LISP的集成很棒!您应该使用SLIME。然后,您将与REPL进行精彩的集成,能够将eval函数、缓冲区或文件直接集成到emacs缓冲区中正在运行的解释器中等等…

击键执行:::vi编辑保留类型化键的每个排列。这在决策树中创建了一个路径,它明确标识任何命令,而Emacs命令是立即执行的类型化键的组合,这使用户可以选择是否使用命令。

内存使用和可自定义性:::vi是一个更小更快的程序,定制能力更有限,而Emacs需要更长的启动时间和更多的内存。然而,它是高度可定制的,包括大量的功能,因为它本质上是为文本编辑设计的Lisp程序的执行环境。

vim是一个方便的编辑器,您只需键入vim filename即可打开文件、编辑、保存和关闭。

emacs是一个假装成编辑器的“操作系统”,您可以eval代码来更改其行为,并根据需要对其进行扩展。在emacs上接收/发送电子邮件的mode就像操作系统上的电子邮件软件。

在进行简单编辑时,例如修改配置文件,我使用vim

否则,我永远不会离开emacs

有很多关于这两位编辑的说法,但我只想补充我的5便士。两位编辑都很棒,你不能对他们中的任何一个出错。

我使用vi/vim已经有15年了,我曾多次尝试转换为emacs,但每次都发现vim实际上可以开箱即用,无需编写lisp扩展或安装任何东西。

对我来说,编辑器的主要区别在于vim让你使用环境/操作系统,而emacs试图封装或替换它。例如,您可以通过以下方式在文本中添加日期:r!vim中的日期,或使用:r!cal 1 2014的日历,甚至用内容的十六进制版本替换缓冲区的内容。例如:%!xxd,编辑十六进制,然后返回:%!xxd-r,以及更多其他用途,如内置grep、ed等。

另一个例子是与jqgron一起使用。例如。将json blob粘贴到编辑器,然后运行以进行转换:

:r!curl -s http://interesting/api/v1/get/stuff:%!gron | grep 'interesting' | gron -u

:%!jq .path.to.stuff

上面的每个管道命令都可以通过:%!<command>单独运行,其中%表示所有文档,但也可以在选择、选定行等上运行。这里gronoutput可以用作jq路径。

您还可以获得EX批处理编辑功能,例如。替换某些单词、重新格式化代码、转换dos->unix换行符、一次在100个文件上运行宏。用ex很容易完成。我不确定emacs是否有类似的东西。

换句话说,IMHO vim更接近unix哲学。它通常更简单、更小,但如果您了解您的操作系统和工具,您可能不会需要比它(VIM)提供的更多。我从来没有这样做过。

此外,vi是任何unix/linux系统的事实标准,为什么要学习使用两个做同样的事情的工具。当然,有些系统提供mg或类似的东西,但绝对不是全部。Unix+Vi<3。

只是我的5便士。

Emacs实际上更像是一个do一切程序,vi(m)实际上只是一个编辑器。如果你正在编辑文本,它们都很好,但我更喜欢emacs,仅仅是因为我必须将一个从本行移开才能移动,并在命令模式下不断输入错误的东西。如果你没有这个问题,vi(m)可能是你的编辑器。

有偏见的观点:

vi(不是vim)是专业必需品。你总是有某种形式的vi很容易获得,无论什么环境。你可以在vi在emacs中,您可以在vi中在unix-land中构建bash命令。

即使是Microsquish也必须支持vi(尽管他们做得很好隐藏它),因为政府和企业遵守已发布的标准。

在我看来,如果你在一个繁忙的环境中从事实践工作-不温室里的花被限制在开发区的一个花式钻机上环境,或者在学术界--了解一个高级编辑是一份工作障碍。不要在vim或emacs中学习所有花哨的技巧,也不要开发一堆宏,使编辑环境屈从于您的意愿。这是一个巨大的时间槽,当你参加时,它会妨碍你不同的机器,你可能无法证明在工厂环境。

阅读比尔·乔伊的论文——这是一个非常有能力的,甚至漂亮,在编辑纯文本的工程练习非常,非常快。帕里托法则在这里适用:80%的水果在20%的篮子。非常非常快地编辑纯文本是的症结所在编辑能力——其他一切都是可选的——有时是有害的。

就像苹果和橘子。两者都有不同的设计和哲学。Vim是一个文本编辑器,而Emacs是一个进行文本编辑的Lisp解释器。

我使用Vim是因为它快速、流畅且非常擅长操作文本。它具有可组合的自然键绑定,可以使您的开发任务真正和谐。Vim基于简单的*nix philiphoy,可以很好地完成一件事-即文本操作。

使用bash/zsh和tmux扩展Vim通常很容易,可以让你学到很多东西。恕我直言,这是一个很好的学习曲线。关键是学习如何集成这些东西以获得更大的工作应用程序。使用Vim,你需要学习集成,因为除非你告诉它如何集成,否则它不会自然集成。我使用的另一个有价值的扩展是Tig。它是一个基于ncurses的Git前端。我只有一个绑定,它可以静静地打开Tig,然后我在那里做所有的Git东西。

最终由最终用户来决定什么最有效。Emacs和Vim经受住了时间的考验,证明了它们的价值。最终,一个好的程序员只需要一支笔和一张纸就可以发挥创造力。好的算法不需要编辑来支持它们。所以,尝试这两种软件,看看什么能让你更有效率。并从这两种软件中学习设计模式,因为有很多东西需要学习和发现!

我想在这里引用《UNIX编程艺术》一书中的一句话:

许多经常使用vi和Emacs的人倾向于将它们用于#36825;不同的东西,并发现了解两者都很有价值。

一般来说,vi最适合小型作业-快速回复邮件,简单调整系统配置等。它特别有用当您使用新系统(或通过网络的远程系统)并且没有你的Emacs自定义文件。

Emacs有自己的扩展编辑会话,您可以在其中必须处理复杂的任务,修改多个文件,并使用结果在会话期间从其他程序中删除。对于使用X on的程序员他们的控制台(这在现代Unix上是典型的),这是正常的在登录后不久在一个大窗口中启动Emacs并离开它永久运行,可能访问数十个文件甚至运行多个Emacs子窗口中的程序。

我真正想强调的是:“很多人觉得了解两者都很有价值”。

我认为主要的区别是设计目标。VIM是UNIX的工作编辑器。Emacs适用于GNU和lisp黑客,因此它具有一些混合设计元素。

我在我的工作站上使用vim,而我也喜欢emacs。

现在你甚至不需要考虑这两者之间的区别,因为Spacemacs。它是一个社区驱动的Emacs发行版。

正如它所说,

最好的编辑器既不是Emacs也不是vim,而是Emacs和Vim。

Spacemacs结合了Emacs和Vim的优点,使您的生活和工作更加轻松。

见下面的截图,


(来源:spacemacs.org

Emacs的好处

  • Emacs同时具有非模态接口(默认情况下)和模态接口(例如,它可以通过Evil、Viper或V脉冲模拟vim和vi)。

  • 移植最多的计算机程序之一。它以文本模式和图形用户界面在各种操作系统上运行,包括大多数类Unix系统(Linux、各种BSD、Solaris、AIX、IRIX、macOS等)、MS-DOS、Microsoft Windows、AmigaOS和OpenVMS。Unix系统,无论是免费的还是专有的,经常提供与操作系统捆绑在一起的Emacs。

  • Emacs服务器架构允许多个客户端附加到同一个Emacs实例并共享缓冲区列表、杀死环、撤消历史记录和其他状态。

  • 具有动态记录的键绑定、功能和命令的普遍在线帮助系统。

  • 可扩展和可定制的Lisp编程语言变体(Emacs Lisp),其功能包括:

  • 强大且可扩展的文件管理器(dired)、集成调试器以及大量开发和其他工具。

  • 让每个命令都是Emacs Lisp函数,通过以编程方式响应过去的操作和文档状态,可以将命令发送到DWIM(Do What I Mean)。例如,开关或拆分窗口命令可以切换到另一个窗口(如果存在),或者在需要时创建一个。这减少了用户必须记住的击键次数和命令。

  • “操作系统中的操作系统”。Emacs Lisp使Emacs的编程功能远远超出了编辑功能。即使是基本安装也包含几十个应用程序,包括两个网络浏览器、新闻阅读器、多个邮件代理、四个IRC客户端、一个版本的ELIZA和各种游戏。所有这些应用程序都可以在Emacs运行的任何地方使用,具有相同的用户交互界面和功能。从第24版开始,Emacs包括一个包管理器,可以轻松安装其他应用程序,包括备用网络浏览器、EMMS(Emacs多媒体系统)等。也有许多用于编程的包,包括一些针对特定语言/库组合或编码风格的包。

类似vi编辑器的好处

  • 编辑命令是可组合的
  • Vi有一个模态接口(Emacs可以模拟)
  • 从历史上看,vi的加载速度比Emacs快。
  • 虽然与UNIX传统密切相关,但它可以在所有可以实现标准C库的系统上运行,包括UNIX,Linux,AmigaOS,DOS,Windows,Mac,BeOS,OpenVMS,IRIX,AIX,HP-用户体验,BSD和POSIX兼容系统。
  • 可通过Vim脚本或API进行扩展和自定义,适用于Python、Ruby、Perl和Lua等解释型语言
  • 无处不在。基本上所有Unix和类Unix系统都内置了vi(或变体)。Vi(和ex,但不是vim)在POSIX标准中指定。
  • 系统救援环境、嵌入式系统(特别是那些带有busybox的)和其他受限环境通常包括vi,但不包括emacs。

来源:https://en.wikipedia.org/wiki/Editor_war

我是Emacs的粉丝,但鼓励其他开发人员学习VI,因为:

  1. 您可以使用VI来编辑emacs makefile。
  2. VI包括ed命令,每个UNIX用户都应该知道ed和ses。

我注意到一些关于VIM启动速度比emacs快的评论。如果你真的关心这一点,请在服务器模式下运行emacs,并将'emacs'别名为'emacsclient'。客户端非常快,因为它所做的只是点击服务器的肩膀并告诉它要编辑哪个文件。在MacOSX上,emacsclient仅33K而emacs287M。

我不确定这些在现代硬件上是否必要。在我的MacBook Pro(2013 Retina)上,当我从shell运行它时,emacs几乎是即时加载的。我根本没有检测到暂停。当我运行Emacs.app(GUI版本)时,它可能需要3秒钟。

我听到的大多数关于emacs的抱怨似乎来自于人们对emacs的误解。我从1982年开始同时使用vi和emacs,我清楚地记得有一段时间emacs的加载速度比vi慢得多,并且在我早期的UNIX机器中使用了大部分物理内存,但情况不再如此,至少15到20年没有这样做。

我承认的一个抱怨是“emacs小指”。我年轻的时候,这从来没有困扰过我。现在我58岁了,我的小指确实会因为反复访问emacs合唱的Control键而有点酸痛。在MacBook Pro键盘上尤其如此,其中Control向右移动了一个位置,为“fn”键腾出空间。当Control是左下角的键时,它几乎没有那么烦人。

我在生产/研究环境中使用Spacemacs大约2年,使用neovim大约1年。Spacemacs是emacs,具有一些不错的额外功能,如图层等。neovim是vim的一个分支,具有一些额外的功能。

就经验而言,我对他们两个都很不满意。我仍然在寻找一个长期的解决方案来满足我的文本编辑需求。

这里有一个简单的比较:

  • Neovim,vim,emacs,spaceemacs等所有这些编辑器与大多数编辑器相比消耗的资源更少。

  • Neovim/vim比emacs稍微快一点,明显快于spaceemacs。

  • 在编辑体验方面。我可以很容易地说emacs包感觉优越。我认为那是因为它们与emacs的核心融合得更好。

  • Vimcript很好,在vim生态系统中当然也有很棒的项目。好消息是它们比我迄今为止看到的大多数emacs项目都有更好的文档记录。

  • 两者都可能出现故障,具体取决于您使用的包。Spacemacs倾向于冻结,而neovim倾向于显示可怕的错误消息,因此请在那里选择您的毒药。

  • vim中的模态编辑不是一个直观的概念,但是一旦你习惯了它,你就会想要它。两个编辑器都提供了这一点。

我首先是vim的用户,然后我切换到emacs,然后是vim,现在我再次尝试使用emacs。

  • 他们都是伟大的编辑。
  • 今天两者都非常可扩展
  • 两者都有很棒的插件和社区

作为开发人员,我们输入了很多,最后对我来说,在缓冲区和文件中移动是最大的重复性任务,所以我想要一个可以快速移动的编辑器!

再次尝试使用emacs的动机是我觉得Ctrl铅键绑定比vim更快,更容易推理。

在vim中,你有模式,你有插入模式,视觉模式,正常模式,当你按下某些东西时会发生什么取决于你的模式,是编辑的状态。你移动,进入插入模式,编辑,退出插入模式然后再次移动。如果我错过了ESC按下或类似的东西,我经常会失去自我。

在emacs中没有模式,基本上你用粉红色按下Ctrl并输入击键,比如C-x C-f、C-x C-s、C-x C-c。有键绑定,你需要释放ctrl键,我讨厌这个,总是用按下控件的键替换它们。

我认为emacs的方法思考和输入更快,但是vim有另一个优势,to。它的命令是可组合的,它们通常有一种格式。例如,要删除一行,你可以使用dd,删除一个单词dw。插件利用了这种感觉,使用vim-surround插件,你可以删除带有ds"(删除环绕")的引号,删除到下一个/dt/。删除到上一个/:dT/等等。所以只要你学会了移动的东西就开始变得非常有趣。

总结一下,今天我觉得emacs键绑定在宏编辑方面更快,vim命令在微编辑方面更强大

过去五年我一直在使用vim,所以我主要编辑关于单词、线条、周围、块等的思考。删除这一行,删除引号,替换引号,删除光标中的单词,我正在尝试查找emacs的移动

作为最后一句话,我想说,我更关心fzf而不是emacs或vim,我希望有一个完全基于fzf的编辑器