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个回答

583

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

使用Emacs时,你需要24/7保持它开启并在程序内运行,几乎所有的操作都可以在其中完成。你可以编写自己的扩展、用它来记笔记、组织文件、玩游戏、编程、访问shell、访问文件、听音乐、浏览网页。你需要花费数周的时间才能学会并满意使用它,之后你将不断学习新的技能。当你无法访问它时,你会感到烦恼并不断更改配置。你无法轻松地使用其他人的 Emacs 版本,并且它不会自动安装。它使用 Lisp 语言,这很棒。你可以将它变成任何你想要的东西。(任何东西,完全取决于你)。

对于 Vim 来说,它几乎总是预先安装好的。它非常快速。你只需打开一个文件,进行快速编辑,然后退出即可。如果你在别人的计算机上工作,你可以直接使用基本设置。它的可编辑性不如 Emacs,但仍远超大多数文本编辑器。Vim 知道大多数时候你是阅读/编辑而不是打字,因此更快。你不会遭受 emacs pinkie 的困扰,而且它比较容易学习。

尽管我整天使用 Emacs(并且喜欢它),但除非你打算在所选的程序中花费大量时间,否则我会选择 Vim。


179
关于不可用的问题:我建议将你的 .emacs 和 .emacs.d 存储于源代码控制库中,这样你就可以通过 checkout 命令轻松获得你完美的 Emacs 设置。 - Duncan Bayne
12
Emacs 和 Vim 都有可能遭受上述情况的困扰:它们都可以被配置到与它们的原始形式相比无法辨认。此外,我也赞同使用版本控制系统(vcs)。 - Alexej Magura
12
@Radu,你在哪些系统上工作?我从未见过2010年代的现实生活中有真正的vi系统,而不是别名为vim - ELLIOTTCABLE
13
也许Vim比Emacs更容易学习,但是如果你没有任何使用经验,在第一次启动它时会感到非常困惑!我不得不使用谷歌才能把它关闭,并且仍然尝试了几次才能做对。 - HelloGoodbye
12
永远不要低估 VIM 的“预安装”优势:无论你身在何处,它几乎总是可用的,并且可以使用很少或没有自定义。当我通过 ssh 连接到其他机器时,我经常使用它。这就是为什么我首先学习它的原因——还有因为我的朋友们知道 VIM 并能够帮助我。(也不要低估朋友的支持!) - jvriesem
显示剩余16条评论

168

Vim不是一个shell,并且与子进程的通信能力不太强。这几乎是出于设计考虑,而在Emacs中,这些元素则是设计上的一部分。这意味着一些东西,例如嵌入调试器或解释器(产生一种IDE),在Vim中会很困难。

此外,Emacs快捷键主要通过修改键访问,而Vim界面显然是漂亮的模态界面,提供了大量直接操作的按键。

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

我使用Vim,并且相当满意。


11
小更新:自从Vim 8.0版本以后,它支持与子进程更好地通信,甚至在8.1版本中还引入了终端缓冲区,因此在这方面它正在变得更接近Emacs。 - DarkWiiPlayer

133

Vim:

  • 更适合作为简单编辑器(对于简单任务,需要较少的按键)
  • 更活跃的脚本社区 - 内置语言:vimscript
  • 一个中央脚本、插件、颜色方案等资源库
  • 也可以通过python、ruby进行扩展
  • 可移植性更强(emacs在这方面存在一些问题)

Emacs:

  • 默认情况下非模态编辑器(大多数现代编辑器都采用了这种方法)。虽然有evil-mode来模拟vim的行为。
  • 更强大的语言来扩展它(elisp是一种完整的语言,在emacs中你几乎可以重新定义所有东西;而在vim中你不能重新定义内置函数。缺点是,与今天的动态语言相比,vimscript相对类似,而elisp几乎不像任何语言)
  • 更可扩展
  • 对GNU工具(各种工具的捆绑包)提供卓越支持

就个人而言,我更喜欢vim——它体积小,功能齐全,当我需要一个完整的IDE时,我打开VS。Emacs试图成为一个编辑器和IDE(或者说是操作系统),但它不太能实现这个目标,这在我的观点里已经过时了。在旧日里,将邮件客户端、FTP客户端、俄罗斯方块等放入一个软件包(emacs)中还有一定意义……而现在已不再如此。

然而,这两款编辑器都是程序员和超级用户社区用户之间宗教性讨论的话题,在这方面,如果将它们放在同一句或问题中,它们都非常适合引发争论。


48
“更好的编辑”这个说法相当模糊。我很想看到其中的原因。 - Allen
47
@Allen - 这个陈述有什么含糊不清的地方吗?我很少遇到既使用vim又使用emacs的用户对此有异议。即使是极端的emacs用户通常也会认同这一事实。你用过这两个编辑器吗?我相信显然vim在文本编辑功能方面具有优势。 - Rook
40
我难以相信有人会把那当作事实接受。作为长期使用Emacs和纯VI的用户,我曾经用过几次Vim——但是如果没有其他原因,仅仅因为有更广泛的主要和次要模式可在打字时帮助使用者,我认为"更好的编辑器"应该归给Emacs。 - Kendall Helmstetter Gelner
67
根据我的经验,Vim 是更好的编辑器,因为文本操作需要的手指移动较少,比 emacs 更方便。 - StackedCrooked
8
除此之外,实际上 vim 更适合用于编辑:行号、可视模式、操作等。http://wint1.kaist.ac.kr/files/attach/images/59/450/vi-vim-cheat-sheet.gif 。我曾经很难让 emacs 滚动一行。 - Rook
显示剩余12条评论

62
如果你正在寻找对编辑器的客观分析,那么看看它们的起源和各自设计背后的哲学。想想看,哪一个更适合你,然后学习它(并且学习它、学习它,因为在发现它真正的效用之前需要时间,而不是任何IDE)。“An Introduction to Display Editing with Vi”由比尔·乔伊(Bill Joy)和马克·霍顿(Mark Horton)编写,解释了他为什么选择模态设计以及各种键盘快捷键的理由(这有助于我记住CTRL-W + W(将切换到下一个窗口,对于CTRL W + CTRL W也是如此,以防万一您按住CTRL键的时间更长)。
这里是一个链接到Emacs timeline,其中包含有关Multics Emacs论文的参考资料。RMS在Emacs中的论文中,我看到重点是可编程文本编辑器(即使在1981年及之前也是如此)。
我没有读过emacs的论文,但已经多次阅读过比尔·乔伊的vi论文。两者都很古老,但仍然能够传达出哲学,你可能会选择使用当前的工具(vim 7.x或emacs 25?) 编辑:我忘记提到阅读这两篇论文需要耐心和想象力,因为它会带你回到过去。但这是值得的。

55
  1. Vim启动速度始终比Emacs快。我想说的是,在任何机器上,Vim开箱即用的安装都会比Emacs更快地启动。而且在对两者进行适度的自定义后,我倾向于认为Vim仍然比Emacs启动更快。

  2. 此外,另一个实际差别在于Emacs的模式。当您编辑XML、C/C++/Java/及大多数您可以想到的流行语言、LaTeX时,这些模式会极大地方便您的工作。它们让您想要长时间保持编辑器打开并进行工作。

总的来说,我会说Vim适合用于短时间的快速编辑任务;而Emacs则鼓励您进行长时间的深入编辑。


1
我认为模式并不能使生活变得更容易,相反地。而且Larry Tesler也有同样的看法 - Eliran Malka
2
Emacs的模式如何帮助编码?(我是新手...) - jvriesem
6
很久以前,我从vi转换到emacs有四个原因:(a)单击即可跳转到下一个编译器错误,(b)gdb集成,(c)grep和find-grep。现在,vim是否可以做到这些事情? - uuu777
"Vim启动速度始终比Emacs快" -- 如果您一直运行emacs服务器,则启动emacs-client非常快。我有脚本可以在所有机器上复制(使用git)。 (实际上,我也使用vim;这总是取决于我的位置和任务是什么) - Jay
“Vim启动速度一直比Emacs快” - 而且,使用use-package和它的:defer选项后,我的Emacs几乎可以立即打开。我甚至放弃了使用emacsclient。 - Jay

45

VI是一种始终可用的编辑器,即使在单用户模式、严重损坏的图形界面、没有键映射、慢速连接的机器上也能运行 - 因此,对于系统管理员任务而言,了解如何在其中编辑简单文件是值得的。

Emacs则是一个完整的用户界面和编辑器。其理念是开机后启动Emacs并永不离开它。它可以保留数千个会话。

无论学习Emacs的功能是否比使用GUI编辑器/集成开发环境以及使用类似Python/Awk等额外工具来处理任务更有价值,这都取决于您自己。


2
我知道VI的原因,但现在你在UNIX系统上几乎不可能遇到没有基本EMACS安装的情况,而且它可以使一个糟糕的Shell环境更加容易忍受。 - Kendall Helmstetter Gelner
3
或者,将busybox压缩到initrd中并对启动设备的破损存储驱动程序进行调试,在init进程的早期阶段,您只拥有初始ram磁盘,但您仍然有一个编辑器--vi。 - smcameron
2
用 vi 一段时间后,你的手指记住了动作 - 但是你可能记不起实际按的键是哪些! - Martin Beckett
13
我以为是ed“始终可用,并可以在最受限制的单用户模式、破损的图形界面、没有键映射、低速连接的机器上运行。” 等等,等等,现在是哪一年?(叹气——ed,我永远不会忘记你。) - belacqua
2
@Kendall:当前的Ubuntu Linux系统没有预装Emacs。 - intuited
显示剩余5条评论

39

我是一个彻头彻尾的 Emacs 粉丝,但在接触 Emacs 之前我早就认识 VI 了。话虽如此,我让所有人都学习 VI,因为无论何时何地都可以使用它。两者都不会错。


3
这也是我的经历... Emacs或uEmacs从未出现过。 我的第一个编辑器是uEmacs(在Amiga上),但自从我学会了vim后,它就太方便了,随时都能用。 - Marius
1
这基本上也是我的经验。Vi 随处可见,并且通常作为 Unix 系统上默认的 $EDITOR 安装,因此如果你在使用 Unix,你必须要知道它。话虽如此,我每天都使用 Emacs 进行文本编辑,我非常喜欢它。 - Fergie
如果有人让我学习vim,我会放弃。 - Jürgen A. Erhard

19

看起来似乎已经有一个答案被选定了,但对我来说,最大的区别始终是模态与非模态。Vim 是模态的,这意味着它根据特定的使用模式进行优化。至少我一直都是这么看的。这使得使用 Vim 的体验不同,因为你并不是在一个工作区中打代码,而是在告诉一个环境来处理文本。这就是为什么人们说用 Vim 就真的在学习一门语言。:wq 和 :s/foo/bar 都是一个类似 shell 的环境中编辑和读取文本的一部分。

另一方面,Emacs 更接近于今天大多数编辑器/文字处理器等。你有一个高度可编程的界面的工作空间。这就是为什么你会看到像电子邮件、irc、shell 等东西。作为程序员,很容易想象说“拿到我当前所在行号并对此信息做些事情”。离开编辑器的欲望变得较小,因为你可以在 Emacs 中完成这些操作,而不必退出,打开其他应用程序/语言,并在某些文本上进行操作。

这两个想法并不一定对立,它们只是揭示了两种不同的关注点。个人而言,我使用 Emacs,但我见过那些很熟悉 Vim 的人,可以诚实地说无论你选择哪个都没关系。我先尝试了 Vim,但最终还是选择了 Emacs。无论你选择什么,都应该至少在 Vim 上有一定的熟练程度,因为它真的是随时可用的。


17

我一开始用vi,然后换成了emacs,再变成了vim。最近我一直在考虑试试Emacs,看看过去五年里都发生了什么。(说到IDE,我曾经使用过eclipse一段时间,但我更喜欢我的终端窗口连接我自己的mac和我(丈夫的)linux电脑)。

最近剪切和粘贴的问题一直困扰着我。在Vim中,剪切和粘贴需要比Emacs更多的步骤,如果我没有记错的话。从浏览器复制到终端窗口粘贴很烦人,除非你做一些麻烦的事情,我不想这样做,所以我忍受奇怪的缩进。我认为,在Emacs中编辑多个文件更容易。至少如果你同时打开两个文件,跳转到另一个文件就更容易。

我没有玩过vi或emacs的高级功能,因为我只想开始编码。我只需要漂亮的颜色和正确的制表符转换(特别是在Python中非常重要)。

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

@mgb是正确的。在一个Debian发行版中,我最近仅使用了最基本的Linux功能。只有vi是可用的编辑器。


1
这仍然不是一劳永逸的解决方案,但它比调整所有会破坏终端粘贴的设置要容易得多。使用:set paste命令,然后粘贴您的文本,完成后使用:set nopaste命令将返回正常模式。还有一个:set pastetoggle=<F2>命令,可以使用您选择的键组合切换此功能。 - hbar
在缩进模式下,您可以使用“^R^P+”从剪贴板粘贴并保留当前缩进。 “^R^O+”将删除缩进。 “^R+”将插入它,就像您已经键入它一样。有关更多信息,请参阅“:help i_^R^P”。 - intuited
4
我认为使用 yyp 命令复制/粘贴操作并不比其他方式更难。此外,您可以参考这里,在不同的窗口之间进行复制和粘贴操作:https://dev59.com/fWoy5IYBdhLWcg3wHqiB#8757876。 - puk
@puk - 在Emacs中,Ctrl-k(yank)/ Ctrl-y(put)与Vim中同样容易。在Emacs中,您还可以有多个寄存器(a-z),可以将文本或当前位置保存到其中... - Kendall Helmstetter Gelner
3
Vim具有多个寄存器。 - TamaMcGlinn
我总是从我的发行版中获取vim,所以我认为它没有正确编译以支持从应该工作的任何寄存器访问X剪贴板。我的解决方法使用xsel。我定义了一个宏,将我选择的键组合绑定到“:r!xsel --clipboard<RET>”。 - Jim Vargo

16

日常使用上有很大的区别 - Vim(或任何vi变种)本质上是模态的(您进入命令模式,无法编辑),而Emacs(以及大多数其他编辑器)则不是。

当然,使用菜单等可以在Vim中不必实际进入命令模式 - 起初如此。但要使用Vim的微小部分功能,您将需要这样做。这是Vim / Emacs争论的核心。

就个人而言,我认为Emacs更具可扩展性。您可以找到许多Elisp包。

但我很好奇,您为什么想要学习其中之一而不是更传统的IDE。您想要学习其中之一的原因是什么?


8
老实说,我只是想学一下它,看看它是否能够达到所吹嘘的效果。我已经看到它们两个有多么灵活,我也看过专家在它们上面做了一些非常疯狂的事情,我想看看它是否值得花费学习曲线。另外,我的 IDE 不支持 Lisp。 - Sasha Chedygov
3
问题在于Emacs太庞大了,但我仍然放弃其他集成开发环境来使用Emacs,是因为我可以利用宏录制自动化复杂的重复任务。例如,你可以将当前单词或表达式复制到一个“缓冲区”(类似于剪切/粘贴,但可以有多个),然后进入另一个文件,在部分使用已复制的值和另一个先前已复制的值的文本之后,移动光标、保存位置并返回到第一个缓冲区...然后对原始文件的下一行重复此过程。 - Kendall Helmstetter Gelner
1
我在vi和Emacs中都广泛使用了宏。你所缺少的是Emacs拥有更多的方法来访问使用宏时,以及即使在搜索词条中间,你也可以随处使用剪贴板这一事实。请告诉我你会如何编写一个宏,它基于正则表达式选择一个表达式中的单词,取得找到的术语,在另一个文档上搜索该术语,然后在其周围进行替换? - Kendall Helmstetter Gelner
2
@kendall-helmstetter-gelner - 这是通过vimscript实现的,或者使用vim绑定的语言(如ruby/vim/tcl/perl)来实现。您可以从脚本语言中访问所有vim的功能和编辑器缓冲区。 - segy
1
这很令人印象深刻,但在Emacs中做同样的事情只需要使用我已经知道的按键来形成一个复杂的宏,而不是手写它。对于任何熟悉Emacs的人来说,制作执行该任务的宏都很容易,但我认为没有多少VI用户能够在没有大量研究的情况下构建您所列出的宏。 - Kendall Helmstetter Gelner
显示剩余3条评论

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