Emacs和Vim之间的差异

Differences between Emacs and Vim

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

在一场火焰大战开始之前:我不是在问哪一个更好,而是在问两者之间的区别。我想要一个客观的比较。


(以下文字是我的意见,不应视为事实或侮辱)

有了Emacs,你可以24/7打开它,生活在程序中,从那里你可以做几乎所有的事情。您可以编写自己的扩展名,用于记笔记、组织、游戏、编程、shell访问、文件访问、听音乐、网页浏览。这需要几周的时间,直到你对它感到满意,然后你会一直学习新东西。当你没有权限访问它并不断地更改配置时,你会很生气。您将无法轻松使用其他人的Emacs版本,而且它不会只是安装。它使用Lisp,这很好。你可以把它做成你想要的任何东西。(什么都有)

对于VIM,它几乎总是预先安装的。它很快。打开一个文件,快速编辑,然后退出。如果你在别人的机器上,你可以使用基本设置。它不太可编辑,但比大多数文本编辑器要好得多。它认识到,大多数时候你在阅读/编辑而不是打字,这部分的速度更快。你不会患上Emacs小指。不是那么让人恼火。学习起来容易些。

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


Vim不是贝壳。而且它与子流程的通信也不好。这几乎是通过设计实现的,而在Emacs中,这些元素是通过设计实现的。这意味着一些东西,比如嵌入调试器或解释器(生成一种IDE),在VIM中是很困难的。

此外,emacs快捷方式主要通过修饰符访问,显然vim接口是众所周知的模式,允许访问大量用于操作的直接键。

Emacs曾经是这两个程序中唯一可编程的编辑器,尽管Vim的可编程性有很多奇怪的层次,但是通过添加python和ruby绑定(我忘记了还有更多),Vim也可以以您所关心的大多数方式进行编程。

我用VIM,我对它相当满意。


Vim:

  • 更像一个简单的编辑器(简单任务所需的键更少)
  • 更活跃的脚本社区-内部语言:vimscript
  • 一个包含脚本、插件、配色方案等的中央存储库…
  • 也可以在python、ruby中扩展
  • 可移植(Emacs有一些问题)

Emacs:

  • 默认情况下是非模态的(今天的大多数编辑都采用这种方法)。尽管有模仿VIM行为的邪恶模式。
  • 扩展它的更强大的语言(elisp是一种成熟的语言,在emacs中,您实际上可以重新定义所有东西;而在vim中,您不能重新定义编辑器的内置函数。不利的是,vimscript与当今的动态语言相对类似,而elisp与之不太相似)
  • 更可扩展
  • 对GNU工具的出色支持(其中的一组)

就我个人而言,我更喜欢Vim——它很小,做它应该做的事情,当我希望一个全面的IDE时,我打开了与Emacs相比,作为一个想要成为一个IDE(或者我应该说,一个OS)的编辑的方法,但并不完全是imho,过时了。在过去,有一个电子邮件客户端,ftp客户端,俄罗斯方块,…一个包(emacs)中没有什么意义…如今,它已经不复存在了。

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


如果你想对两位编辑都进行客观的分析,那就看看他们的起源以及他们各自设计背后的哲学。想一想,哪一个更适合你并学习它(学习它并学习它,因为在你发现它真正的实用性之前需要时间来对抗任何IDE)。Bill Joy和Mark Horton写了一篇关于使用vi进行显示编辑的介绍,他解释了为什么他选择模式设计和各种按键笔画的基本原理(这有助于我记住,ctrl-w+w(将切换到下一个窗口,而ctrl w+ctrl w的模式设计和基本原理将相同,以防您长时间使用ctrl键。

这里有一个到Emacs时间表的链接,并参考了Multics Emacs论文。这是关于emacs的rms文件,在这里我看到的压力是在可编程的文本编辑器上(甚至在1981年和之前)。

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

编辑:我忘了提一下,读这两篇论文需要耐心和想象力,因为读这两篇论文需要时间。但它是值得的。


  • Vim的启动速度总是比Emacs快。我是说,在任何机器上,即时安装VIM的启动速度都比即时安装Emacs的启动速度快。我倾向于认为,在对两者进行适度的定制之后,Vim的启动速度仍然会比Emacs快。

  • 在那之后,另一个实际的区别是Emacs的模式。在编辑XML、C/C++/爪哇/任何东西、胶乳和最流行的语言时,它们会使您的生活变得更加轻松。它们使您希望在长时间的会话和工作中保持编辑器的打开状态。

  • 总而言之,我要说的是,Vim会把你拉到它上面进行短时间、快速的编辑工作;而Emacs鼓励你投入到长时间的工作中去。


    vi一直都是可用的,并且将运行在最残缺的单用户模式、损坏的图形、没有键映射、慢速链接机器上-因此,只需为系统管理任务了解如何编辑其中的简单文件是值得的。

    Emacs是一个完整的编辑器用户界面。这个想法是当你启动机器时启动Emacs,永远不要离开它。有可能有成千上万的会议。

    学习Emacs的功能是否值得与使用GUI编辑器/IDE以及使用诸如python/awk/etc之类的工具执行额外任务相比,这取决于您自己。


    我是一个成熟的Emacs迷,但我早在认识Emacs之前就认识Vi了。也就是说,我让我所有的人都学习vi,因为它在任何地方都是可用的。他们中的任何一个都不会出错。


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

    剪贴的事最近一直困扰着我。在vim中剪切和粘贴比在emacs、iirc中执行更多的步骤。从say浏览器粘贴到终端窗口是令人恼火的,除非你做了一些我不喜欢做的花哨的事情,所以我忍受了奇怪的缩进。我认为,在Emacs中编辑多个文件更容易。如果在屏幕上同时显示两个文件,至少可以从一个文件跳到下一个文件。

    我没有玩过vi或emacs的花哨功能,因为我只想从事编码业务。我只需要漂亮的颜色和合适的标签到空间的转换(尤其是在Python中)。

    我认为这完全取决于你是否想用:wqCtrl-x Ctrl-s来保存一个文件,如果你不在乎那些花哨的东西。

    @MGB是正确的。我在一个月或两个月前在Debian发行版上使用了最低限度的Linux来修复某些问题。vi是唯一可用的编辑。


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

    另一方面,emacs与大多数编辑器/文字处理器等更为接近。您有一个具有高度可编程接口的工作区。这就是为什么你看到像电子邮件、IRC、shell等东西的原因。作为一个程序员,你很容易想到这样的话:"记下我所在的行号,用这些信息做一些事情"。离开编辑器的愿望变少了,因为不必退出,打开一些其他的应用程序/语言,在一些文本上做一些事情,您有Emacs,您可以在编辑器的范围内做这些事情。

    这两种观点不一定是对立的,但它们只是揭示了两种不同的焦点。我个人使用Emacs,但我见过非常了解Vim的人,他们诚实地说,你选择哪一个并不重要。我先试了Vim,但Emacs最终还是支持我。事实上,无论你选择什么,你至少应该对VIM有点精通,因为它确实总是可用的。


    在日常级别上有一个巨大的区别——vim(或任何vi变量)是固有的模式(您进入命令模式时无法编辑),emacs(以及大多数其他编辑器)则不是。

    当然,使用菜单之类的工具,您不必在VIM中实际地进入命令模式。但要使用维姆的一小部分力量,你会的。这是VIM/EMAC辩论的核心。

    就个人而言,我还认为emacs的可扩展性要高得多。你可以找到很多东西的elisp包。

    不过,我很好奇,为什么您要考虑通过更传统的IDE来学习其中的一个。你想学这些东西的目的是什么?


    对我来说,Emacs的专业人士是,

    • Tramp模式允许您通过ssh编辑远程文件。就像本地文件一样。
    • 不定期模式+直接模式=全功能SFTP客户端
    • 支持你需要的每一种语言。
    • 内置终端仿真器(term模式),这样我可以在应用程序之间不切换的情况下保持编码。
    • 扩展性任何您不喜欢的东西都可以使用Lisp进行更改。


    关于这两位编辑有很多话要说,但我只有5便士要加。两位编辑都很出色,你不能对他们中的任何一位出错。

    我现在是vi/vim用户大约15年了。我试过几次转换为Emacs,但每次都发现Vim实际上可以在不需要编写Lisp扩展或安装任何东西的情况下完成开箱即用的丢失的事情。

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

    您还可以获得批量编辑功能,例如替换某些单词、重新格式化代码、转换DOS->Unix换行符、一次对100个文件运行宏。这是很容易做到与前。我不确定是否Emacs有类似的东西。

    换句话说,imho-vim更接近于unix的哲学。它通常更简单和更小,但是如果你知道你的操作系统和你的工具,你可能不会比它(vim)提供的更多。我从来没有这样做过。

    除了vi是任何UNIX/Linux系统上的defacto标准之外,为什么还要学习使用两种执行相同操作的工具呢?当然,有些系统提供MG或类似产品,但肯定不是所有系统都提供。UNIX+VI<3。

    好吧,就我5便士。


    我想在这里引用"Unix编程艺术"一书中的一句话:

    Many people who regularly use both vi and Emacs tend to use them for
    different things, and find it valuable to know both.

    In general, vi is best for small jobs – quick replies to mail, simple
    tweaks to system configuration, and the like. It is especially useful
    when you’re using a new system (or a remote one over a network) and
    don’t have your Emacs customization files handy.

    Emacs comes into its own for extended editing sessions in which you
    have to handle complex tasks, modify multiple files, and use results
    from other programs during the session. For programmers using X on
    their console (which is typical on modern Unixes), it’s normal to
    start up Emacs shortly after login time in a large window and leave it
    running forever, possibly visiting dozens of files and even running
    programs in multiple Emacs subwindows.

    我真正想强调的是:?很多人认为了解两者都很有价值。?


    Emacs的好处

    • Emacs具有非模态接口(默认情况下)和模态接口(例如,它可以通过Evil、Viper或Vimpulse模拟Vim和Vi)。

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

    • Emacs服务器体系结构允许多个客户机附加到同一个Emacs实例,并共享缓冲区列表、终止环、撤消历史记录和其他状态。

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

    • 可扩展和可定制的Lisp编程语言变体(Emacs Lisp),具有以下功能:

    • 一个功能强大、可扩展的文件管理器(dired)、集成的调试器以及一系列开发和其他工具。

    • 让每个命令都是一个emacs lisp函数,可以通过编程方式对过去的操作和文档状态作出响应,从而实现对dwim的命令(按我的意思执行)。例如,switch或split window命令可以切换到另一个窗口(如果存在),或者根据需要创建一个窗口。这样可以减少用户必须记住的击键次数和命令。

    • "操作系统内部的操作系统"。EmacsLisp使Emacs的编程远远超出了编辑功能。即使是基本安装也包含几十个应用程序,包括两个Web浏览器、新闻阅读器、几个邮件代理、四个IRC客户端、一个eLiza版本和各种游戏。所有这些应用程序都可以在Emacs运行的任何地方使用,具有相同的用户界面和功能。从版本24开始,Emacs包括一个包管理器,使安装其他应用程序变得容易,包括备用Web浏览器、Emms(Emacs多媒体系统)等等。还提供了许多用于编程的包,包括一些针对特定语言/库组合或编码样式的包。

    类vi编辑器的好处

    • 编辑命令是可组合的
    • vi有一个模式接口(Emacs可以模拟)
    • 历史上,vi的加载速度比emacs快。
    • 虽然与Unix传统有着深刻的联系,但它运行在所有能够实现标准C库的系统上,包括Unix、Linux、AmigaOS、DOS、Windows、Mac、BEOS、OpenVMS、IRIX、AIX、HP-UX、BSD和POSIX兼容系统。
    • 通过vim脚本或解释语言(如python、ruby、perl和lua)的API进行扩展和定制
    • 无处不在的。基本上,所有类似Unix和Unix的系统都有内置的vi(或变体)。vi(和ex,但不是vim)在posix标准中指定。
    • 系统救援环境、嵌入式系统(尤其是带有busybox的系统)和其他受限环境通常包括vi,但不包括emacs。

    资料来源:https://en.wikipedia.org/wiki/editor_War


    现在你甚至不需要考虑这两者之间的区别,因为太空Mac。它是由社区驱动的Emacs分发。

    正如它所说的,

    The best editor is neither Emacs nor vim, It's Emacs and Vim.

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

    它还有一个像样的标志。

    ></P><P>请参见下面的屏幕截图,</P><P>http://spacemacs.org/doc/img/spacemacs-python.png</P></p>
<div class=


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

    • Cedet(C/C++)
    • Xrefactory(C/C++/Java)
    • 粘液(普通口齿不清)
    • JDE(Java)
    • ECB(代码浏览器)
    • GDB支持
    • NXML(XML)

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


    Emacs有Viper模式,因此在某种意义上,它提供了一组功能(除了Viper和Vimpulse的Emacs中缺少哪些Vim功能中描述的功能之外?).

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


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

    我使用vim是因为它速度快,很笨拙,而且非常擅长处理文本。它有一个可组合的自然键绑定,可以使您的开发任务真正协调。VIM基于一个简单的"尼克斯-菲利普斯",即文本操作。

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

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


    黄疸的观点:

    vi(而不是vim)是专业的必需品。你总是有某种形式的vi容易获得,无论环境如何。你可以在六区在Emacs中,您可以在vi中在UnixLand中构建bash命令。

    即使是microquish也必须支持vi(尽管他们在隐藏它)因为政府和企业遵守标准。

    在我看来,如果你是在一个忙碌的环境中从事实际工作——而不是一种温室花,限定在一个开发区的一个花哨的花架上。环境,或者学术界——了解一个花哨的编辑是一项工作残障。不要学习VIM或EMAC中的所有花式技巧,也不要开发一系列宏,使编辑环境符合您的意愿。这是一个巨大的时间沉淀,当你注意到不同的机器,你可能无法在工厂证明环境。

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


    Emacs实际上更像是一个无所不能的程序,而vi(m)实际上只是一个编辑器。如果您正在编辑文本,它们都很好,但我更喜欢emacs,因为我必须将一个从主行中移走,并在命令模式下不断输入错误的内容。我你没有这个问题,维(M)可能是你的编辑。


    如果你经常从一个站点迁移到另一个站点,或者你的工作涉及到登录到生产系统,那么VIM就是你要做的事情。

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

    大多数系统管理员喜欢将ksh作为默认shell。ksh使用vi(或emacs)命令击键搜索历史记录并编辑命令行。

    如果您对vi不太了解,那么当您使用标准配置登录到一个Unix设备时,您会遇到严重的障碍。

    仅仅因为这个原因,我会推荐Vim作为你的日常编辑。我见过Emacs的粉丝们为了修改一个简单的Unix服务器上的配置文件而大发雷霆。


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

    Emacs是一个"操作系统",假装成一个编辑器,您可以使用cx1〔0〕代码来更改它的行为,并根据您的需要扩展它。在emacs上接收/发送电子邮件的mode就像操作系统上的电子邮件软件。

    当进行简单的编辑时,例如,修改配置文件时,我使用VIM。

    否则,我永远不会离开Emacs。


    我认为主要的区别是设计目标。VIM是作为一个工作编辑器在Unix中使用的。Emacs是针对GNU和Lisp黑客的,因此它有一些混合的设计元素。

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


    我在太空Macs工作了大约2年,Neovim在生产/研究环境中工作了大约一年。spacemacs是一个Emacs,有一些很好的额外功能,比如图层等,Neovim又是vim的一个分支,有一些额外的功能。

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

    下面是一个简单的比较:

    • Neovim、Vim、Emacs、Spacemacs等所有这些编辑器消耗的资源都比其他大多数编辑器少。

    • neovim/vim比emacs稍快,明显快于spacemacs。

    • 在编辑经验方面。我可以很容易地说,Emacs软件包感觉更优越。我认为这是因为它们与Emacs的核心更好地融合在一起。

    • Vimscript很不错,而且在Vim生态系统中也有很多伟大的项目。好的是,它们比我迄今为止看到的大多数Emacs项目都有更好的文档记录。

    • 根据您使用的软件包的不同,两者都可能会出现故障。太空巨无霸趋向于冻结,而新维姆倾向于显示可怕的错误信息,所以在那里选择你的毒药。

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


    在您的问题中,您没有提到您希望它在Lisp中编程!但正如您一直在评论您的答案,我理解您实际上需要一个Lisp编程接口。

    对于这项精确的任务,只需忘记vi.emacs与lisp的集成就可以了!你应该用黏液。然后,您将能够与repl完美集成,能够将cx1〔0〕函数、缓冲区或文件直接导入Emacs缓冲区中正在运行的解释器,等等……


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

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


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

  • 可以使用vi编辑Emacs生成文件。
  • vi包含ed命令,每个UNIX用户都应该知道ed和sed。
  • 我注意到一些关于vim比emacs启动更快的评论。如果您真的关心这个问题,请在服务器模式下运行emacs,并将"emacs"别名为"emacsclient"。客户机非常快,因为它所做的就是轻敲服务器的肩膀,告诉它您要编辑哪个文件。在Macosx上,EmacClient只有3300万,而Emacs只有287万。

    我不确定这在现代硬件上是否有必要。在我的MacBookPro(2013 Retina)上,当我从外壳运行Emacs时,它几乎瞬间加载。我发现根本没有停顿。当我运行emacs.app(GUI版本)时,可能需要3秒钟。

    我听到的关于emacs的大多数抱怨似乎来自于人们对emacs的误解。自从1982年开始使用vi和emacs之后,我肯定记得有一段时间emacs的加载速度比vi慢得多,并且在我早期的Unix系统中使用了大部分物理内存,但现在已经不是这样了,而且至少15-20年没有了。

    我承认的一个抱怨是"Emacs小指"。在我年轻的时候,这一点都不困扰我。现在我已经58岁了,我的小拇指确实有点疼,因为我不断地访问emacs合唱的控制键。这在MacBookPro键盘上尤其如此,在这里,控件向右移动一个位置,为"FN"键腾出空间。当控制键是左下角的键时,它几乎没有那么烦人。


    首先,vi(原始实现)今天没有使用。你说的是一些VIM推导。

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

    Emacs在自身(Viper模式)中具有VIM。

    Emacs通常需要手动安装,vim通常预先安装在所有与Unix类似的操作系统上(但如果您具有对主机tramp模式win vim的ssh访问权)。

    如果你尝试vim你讨厌emacs,那么首先从emacs开始。

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

    在hxxpp://en.wikipedia.org/wiki/editor_War中搜索