Emacs和Vim的区别

791

Emacs和Vim之间有哪些实际的、客观的区别? 例如,其中一个可以做到但另一个却无法做到(或者使用其中一个更容易)?我该了解哪些信息才能选择学习其中之一?


6
如果你使用Mac(OSX)操作系统,你会发现许多基本的Emacs光标移动命令在几乎任何地方都能正常工作。(例如,它们在我正在键入此评论的网页中起作用。)因此,对于Mac用户来说,学习至少以下Emacs子集有全系统的好处:^A ^B ^D ^E ^F ^K ^L ^N ^O ^P ^T ^V ^Y。 - Matt
2
@JamesAnderson:根据我的经验,恰恰相反。我已经使用 vim 2.5 年了,然后转用了 emacs。Emacs 的用户大多只是无所谓……“只要对你有效就好”。在 #emacs 中, ,销售话术 是这样说的 <fsbot> 我们不会撒谎。Emacs 不好用。我们中的一些人能忍受它,但我们不能告诉你你是否能够。试试看,自己判断吧。 - Silex
6
Emacs 绝对是一个伟大的操作系统,但只缺少一个像样的编辑器。 - technical_difficulty
3
不,它使用系统上的当前分页程序。如果你运行 PAGER=cat man,那么 man 将直接在屏幕上显示文本。 - S.S. Anne
2
猜测当初提出这个问题时,“基本上是主观性的”警察还不存在;-) 哦,那更简单的时代...... 我要说的一件事是,有一次读了一本有关emacs的书,并尝试使用它,我认为它非常好。 三周的假期后,我发现我完全忘记了所有的按键。 另一方面,vim并不是我特别擅长的东西,但在需要时,我可以可靠地半自动操作,只用i,esc,wq即可。 - JL Peyret
显示剩余3条评论
30个回答

14
有很多关于这两个编辑器的评论,但我只想加上我的五分钱。这两个编辑器都很出色,你无论选择哪一个都不会错。
我使用vi/vim已经有15年了。我曾尝试过转向emacs几次,但每次都发现vim实际上可以直接完成所需的功能,而不需要编写lisp扩展或安装其他东西。
对我来说,编辑器的主要区别在于vim让你使用环境/操作系统,而emacs试图封装或替代它。例如,你可以通过在vim中输入:r!date来在文本中添加日期,或者通过:r!cal 1 2014来添加日历,甚至可以用十六进制替换缓冲区的内容。例如::%!xxd,编辑十六进制,然后用:%!xxd -r恢复,还有很多其他用途,比如内置的grep、sed等。
另一个例子是与jq和gron一起使用。例如,将JSON数据粘贴到编辑器中,然后进行转换操作:
:r!curl -s http://interesting/api/v1/get/stuff
:%!gron | grep 'interesting' | gron -u

或者

:%!jq .path.to.stuff

上面的每个管道命令都可以通过:%!<command>单独运行,其中%表示整个文档,但也可以在选择、选定的行等上运行。在这里,gron的output可以用作jq路径。
您还可以获得EX批量编辑功能,例如替换特定单词、重新格式化代码、将dos->unix换行字符转换、一次在100个文件上运行宏等。这些都可以很容易地通过ex完成。我不确定emacs是否有类似的功能。
换句话说,在我看来,vim更接近Unix哲学。它通常更简单、更小巧,但如果您了解自己的操作系统和工具,您可能不需要比vim提供的更多。我从来没有需要过。
此外,vi是任何Unix/Linux系统的事实标准,为什么要学习使用两个做同样事情的工具呢?当然,有些系统提供mg或类似的工具,但肯定不是所有系统都有。Unix + Vi <3。
好吧,这只是我的个人意见。

12
"Vim更贴近Unix哲学" -- 这里所指的哲学是关于从你的shell中使用的工具。然而,shell本身就是一个巨大的聚合体,包含内置命令、历史记录、通配符、进程控制、可编程性等等。Emacs明显更接近于Unix shell的哲学:提供高度可定制的环境,使工具可以一起使用,并且使用户能够在工作时轻松扩展自己的代码片段集。我认为我们可以看到,both Emacs和Vim都深深植根于Unix传统中。 - Matt
1
感谢您的评论。我绝不是想在这里引发编辑器之争,也不是要冒犯_emacs_用户。相比于编写复杂的扩展来封装_emacs_中的功能,我只是觉得从shell(或编辑器内部)调用实际命令更容易、更便携。然而,这些扩展取决于用户的偏好,可以完成,但绝不会被任何一个编辑器强制执行。所以我同意您关于_emacs_和_vi(m)_在UNIX传统中的地位。 - Alex
2
只是为了继续非战争,我希望能清楚地表明我并不反对你的比喻“vim更像一个Unix工具”。只是我突然想到这个直觉可以扩展为“而emacs更像一个Unix shell”。 :-) - Matt
1
@Matt:我喜欢这个比喻。完全同意。 ;) - Alex
3
你可以在Emacs中做你提到的所有事情,并且还可以做更多的事情(例如hexl-mode可直接进入十六进制编辑模式,带有ascii预览)。我也很熟悉VI,但是在Emacs中创建宏会更容易和更灵活,而且它能做的事情甚至比大多数现代化的VIM实现都要多。这就是学习Emacs的原因,因为Emacs几乎无处不在,可以提供真正的文本编辑助力。 - Kendall Helmstetter Gelner
显示剩余5条评论

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

许多经常同时使用vi和Emacs的人往往用它们来处理不同的事情,并且发现了同时掌握两种工具的价值。

通常来说,vi最适合处理小型任务——快速回复邮件、对系统配置进行简单调整等。当你在使用一个新系统(或者远程连接到网络上的某个系统)而没有你的Emacs自定义文件时,它特别有用。

在需要处理复杂任务、修改多个文件并在会话期间使用其他程序结果的扩展编辑会话中,Emacs能够充分发挥作用。对于使用控制台上的X界面(这在现代Unix系统上很普遍)的程序员来说,通常会在登录后不久启动一个大窗口的Emacs,并永久地保持运行状态,可能会访问数十个文件,甚至在多个Emacs子窗口中运行程序。

我真正想强调的是: "许多人发现同时掌握两种工具很有价值"。

这可能已经过时了。我认为那些年代Emacs内置的浏览器、SSH、音乐播放器和慢系统阻止了其他应用程序的启动,使人们相信最好打开一个应用程序并坚持使用它? - Nishant
1
好消息是:它并没有过时!你可以在Emacs之外使用浏览器、音乐播放器等,但Emacs真正带来的是相同良好的界面和一种扩展所有这些功能的方式(Elisp)。 - Andrii Tykhonov
1
根据我的看法,TAUP对Emacs的看法已经过时了,因为那些日子Emacs是一个优势,因为它是一个单一的应用程序,可以同时完成多个任务,比如irc、音乐、远程编辑等。然而,今天你有每个目的都有优秀的应用程序,而且内存也不再是问题...想象一下在Emacs中阅读Gmail——我的意思是Gmail界面真的有很棒的内置键绑定,将其定制为Emacs邮件客户端需要相当长的时间,可能不如原始的Gmail界面好等等。 - Nishant
它并不过时! :) - Andrii Tykhonov
哇,Emacs正在积极开发中!:) 它永远不会过时!:) - Andrii Tykhonov
显示剩余4条评论

10

对我来说,Emacs 的优点如下:

  • tramp-mode 允许您像本地文件一样通过 ssh 编辑远程文件。
  • tramp-mode + dired = 功能齐全的 sftp 客户端
  • 支持您将来可能需要的每一种语言。
  • 内置终端仿真器(term-mode),因此我可以在不切换应用程序的情况下继续编码。
  • 可扩展性 - 您可以使用 Lisp 更改任何您不喜欢的东西。

13
值得一提的是:vim基本上拥有前三个功能(尽管名称不同。“tramp-mode”在vim中被称为“netrw”)。vim用户通常认为第四个功能是一个bug而非特性。如果你将“elisp”(最糟糕的lisp方言,我的Emacs爱好者朋友告诉我)替换为python/mzscheme/perl/ruby/tcl/vimscript,第五个功能在vim中也是成立的。 - Laurence Gonsalves
3
你能否对 #4 为什么是个bug发表评论? - Hamza Yerlikaya
2
看看Vim插件中的Conque,可以在Vim中嵌入一个shell。 - intuited
我其实很好奇为什么还没有人制作出一种变体的emacs,其中elisp被例如ecl(真正的common lisp)所取代。 - BitTickler

9

Emacs的好处

  • Emacs具有非模态界面(默认情况下)和模态界面(例如,它可以通过Evil、Viper或Vimpulse来模拟vim和vi)。

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

  • Emacs服务器体系结构允许多个客户端连接到同一个Emacs实例并共享缓冲区列表、kill ring、撤消历史记录和其他状态。

  • 普遍存在的在线帮助系统,可实时记录键绑定、函数和命令。

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

  • 强大而可扩展的文件管理器(dired)、集成调试器和大量开发工具等。

  • 每个命令都是一个Emacs Lisp函数,使得命令能够DWIM(根据过去的操作和文档状态自动响应),例如,一个切换或拆分窗口命令可以在存在其他窗口时切换到另一个窗口,或者在需要时创建一个新窗口。这减少了用户需要记住的按键次数和命令数量。

  • “OS内部的OS”。Emacs Lisp使得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


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

8

我选择使用emacs而不是vim的最大区别在于emacs内置了对gdb的支持。Vim在其默认发行版中没有这个功能,因此将gdb与vim集成的项目几乎无法在MacVim上实现。


1
我使用Vim进行编辑,使用Xcode进行调试,虽然不是最理想的选择,但也可以应付。 - StackedCrooked

7
现在,由于Spacemacs,您甚至不需要考虑这两者之间的区别。它是一个社区驱动的Emacs发行版。
正如它所说,

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

Spacemacs结合了Emacs和Vim的优点,使您的生活和工作更加轻松。
请参见下面的屏幕截图, (来源:spacemacs.org)

3
这是作弊……这只是一些花哨的配置的Emacs ;) 实际上有相当多的配置。 - Alex
4
这很好——当它能够正常工作时。但是,如果你不会 elisp 和 emacs,或者找不到 gitter 聊天中的核心贡献者,通常就会陷入困境。(有时删除 .emacs 中的 melpa 目录可以解决问题,不过......) - Russia Must Remove Putin
1
虽然Spacemacs比我需要的功能多得多,但我真的很满意。我在github上有我的dotfiles,所以我可以轻松/快速地设置新机器,而且由于我使用evil(vim键绑定),当我不得不在无法安装我的spacemacs配置的机器上工作时,我有足够的技能来应对。 - anr78

5
就像苹果和橙子一样。它们有不同的设计和哲学。 Vim是一个文本编辑器,而Emacs是一个Lisp解释器,用于文本编辑。
我使用Vim,因为它快速、简洁,非常擅长处理文本。它具有可组合的自然键绑定,可以使您的开发任务变得更加和谐。 Vim基于简单的Unix哲学,只做一件事情 - 即文本操作。
通常使用bash/zsh和tmux扩展Vim很容易,并且允许您学习很多东西。在我看来,这是一个很好的学习曲线。关键是学会如何集成这些内容,以获得更大的工作应用程序。对于Vim,您需要学习集成,因为它不会自然地集成,除非您告诉它如何操作。另一个值得推荐的扩展是Tig。它是一个基于ncurses的Git前端。我只需绑定一个快捷键就可以无声地打开Tig,然后在那里完成所有Git操作。
最终用户决定什么最好。Emacs和Vim经过时间考验,证明了它们的价值。最终,一个好的程序员只需要一支笔和一张纸就可以创造出好的算法。好的算法不需要编辑器来支持它们。因此,尝试它们并看看哪个使您更有生产力。从这两款软件中学习设计模式,因为有很多东西值得学习和发现!

4
< p > Emacs拥有蝎子模式,因此从某种意义上说,它提供了功能的超集(除了在这里描述的那些Vim功能)。

vi(和我所知道的VIM)更轻量级(可以直接编辑文件),但提供的功能较少(子进程通信、扩展语言等)。


3

Emacs实际上是一个做 所有事情 的程序,而vi(m)只是一个编辑器。如果你正在编辑文本,它们都很好用,但我更喜欢emacs,仅仅因为我必须将一个手指移开主键区才能移动光标,并且在命令模式下经常输入错误的内容。如果你没有这个问题,vi(m)可能是适合你的编辑器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接