我为什么从 Vim 叛逃到了 Emacs

发布于 2025-03-02 22:42:26 字数 7111 浏览 10 评论 0

我最开始用 GNU/Linux 时,Vim 和 Emacs 都是接触过的。当时觉得 Vim 看起来很直观,而且它的按键也特别有效率,Emacs 则看起来不容易学习,而且它的按键也有点反人类。

我通过 在 Stack Overflow 的这篇帖子 比较了 Vim 和 Emacs 的优缺点。其中有个用户说你永远都不会对你的 Emacs 配置感到满意,你会不断地调整你的配置,而且你还不能直接用别人的配置。

基于这些考虑,我选择了用 Vim,而且成为了 Vim 的忠实信徒。

然而,随着时间的推移,我逐渐发现我的工作流效率并不高,而且我使用终端,编辑器,IDE 的方式也不够高效。于是我开始寻找解决之法,接着我发现 Emacs 能解决所有这些问题. 然而,由于我已经很熟悉 Vim 了,而且也没有那么多时间去修改配置文件,所以我一直在犹豫是否要使用 Emacs。

最终,我对工作中的瓶颈已经忍无可忍了,刚好又 看到了这个视频 , 这个视频完全改变了我对 Emacs 的看法。在视频中,演讲者提到 Vimer 通过 Spacemacs 可以近乎无缝地从 Vim 迁移到 Emacs 中来。于是我试了一下,然后就被迷住了。

下面我会告诉你基于 Vim 的工作流到底低效在哪里,以及为什么我会使用 Emacs.
需要说明的是,我使用的是 Spacemacs,它有很多普通 Emacs 不具备的功能. 而且我在下面的阐述也是基于 Spacemacs 来说的。
但是理论上,我所说的这些东西是与发行版无关的,任何人都能将之应用到自己的 Emacs 配置中,只是需要花点时间自己配置而已。

Reasons why I switched

I didn’t have to stop using Vim

是的,严格来说我也不算是切换到 Emacs 了. 我在 Emacs 中应用的依然是 Vim 的那一套按键设置。有多种途径都能让你在 Emacs 中使用 Vim 的那一套按键 (Evil mode, Spacemacs, 也许还有其他的?)而且在我看来,只有疯子才会长期使用 Emacs 的原生按键设置呢。
‘Emacs pinky’可不是开玩笑的(不过貌似确实很多人都不把它当成一回事)。

在我考虑是否要切换到 Emacs 那会儿,我的关节疼得很厉害(不是 Vim 的锅),所以对我来说,一款编辑器是否符合人体工程学是很重要的考量因素。
Spacemacs 不仅保留了 Vim 的那一套高效按键设置,还添加了颇多强大的功能。

Copying/yanking and paste from one window into another

在 Spacemacs 中使用 Vim 按键真实太爽了。
你不仅可以用 Vim 按键写代码,你可以在 Emacs 的任何地方都使用 Vim 按键,包括编辑 shell. 真是难以想象的舒爽。
举个例子,假设你输出一条 shell 命令时,本来想输的是

  rm /home/user/folder1/folder2/folder3/folder4/folder5/some-file.txt

结果错误地输成了

  rn /home/user/folder1/folder1/folder3/folder4/folder5/some-file.txt

这里有两个错误, rm 写成了 rn , folder2 写成了 folder1 .
若你是在普通的终端模拟器上操作,则需要先按 上箭头 取回输错的命令,然后用 左箭头Ctrl-Home 将光标移到行首,修改 rnrm , 再按 右箭头 到第二个 folder1 处进行修改。

而在 Emacs 下就没那么复杂了,你只需要取回上一条错误的命令,然后按下 0 跳到行首,将 rn 改为 rm , 在用 / 搜索到第二个数字 1 处(也可以按 f1f1 跳转过去),用 r 命令将它修改正确。

用 Vim 的方式操作终端,用 Emacs 就是这么任性。

我之前用 Vim 时,使用 'Terminator' 作为我的终端模拟器,我常常需要开 4,5 个窗口来打开各式各样的 shell 和文件。
当我需要把一条命令在终端与文件之间相互拷贝时,需要先用鼠标选中要拷贝的文本,然后按下 Ctrl-Shift-c 将文本拷贝到粘贴板,在切到新窗口,按下 Ctrl-Shift-v 将文本从粘贴板粘贴回来。
而用 spacemacs,一切都变得非常简单. 你只需要定位到 shell 所在的 window,然后按下 yy 复制你想要的行,然后切回代码所在的 window 按 p 进行粘贴。
而且在 Spacemacs 中切换 window 本身也很容易,按下 SPC-N 就能切换到第 N 个 window 了. 所有这些操作无需鼠标就能搞定了。

Trying to use Vim as an IDE

有一阵子,我使用 Vim 来编辑代码,但是在 RStudio 或 PyCharm 这样的 IDE 中调试代码。
虽说这些 IDE 也支持 Vim 按键,但是要在代码,终端,IDE 之间不断切来切去也挺烦的. 而且我常常在一个项目中要用到多种编程语言,这样就需要打开多个特定语言的 IDE,简直不能再烦了。
有鉴于此,我尝试过用 NerdTreeAirline 等插件将 Vim 打造成一款 IDE 来用. 然而我从来没有成功地在 Vim 调试过(网上有人说搞定了,但是他们的解决方法在我这就是不行).

有人可能会争论说,Emacs 也不是个全功能的 IDE 啊,不过对我来说,它已经足够好用了。
比如,借助 Emacs Speaks Statistics (ESS) package 可以让 Emacs 变身成一个 R IDE。
我可以编辑代码,一行行地调试代码,使用 R-dired 来查看变量,甚至输出终端命令,所有这些都能在一个 frame 中搞定。
它比那些 IDE 定制性更强. Emacs 可不仅仅是个编辑器而已,它甚至远远超出了 IDE 的范畴,有些人甚至把它看成是一个操作系统!

Duplicating my setup

我希望在多台机器上保持相同的工作方式. 而且我对我的配置也非常的挑剔。
要把我的 Vim 配置复制到新机器简直就是个噩梦:我需要安装 Vim,将 .vimrc 从 Github 上 clone 下来,然后创建一个软连接成为 ~/.vimrc , 然后还需要下载那些我喜欢的 Vim 主题,安装 Vundle ,然后用 Vundle 安装一堆的插件。

对 Emacs,情况就简单多了(不过还是需要一些手工操作); 我只需要安装好 Emacs,从 Github 上 clone 下来 .spacemacs ,然后创建一个软链接,成为 ~/.spacemacs . 然后启动 Emacs, 就 OK 了,Emacs 会自动为我安装好所有的东西,包括主题。
我不需要手工安装像 Vundle 这样的包管理器,不需要手工下载主题文件(当然,我承认可以用 shell 脚本来实现自动化,但是依然比 Emacs 要麻烦)
总体来说,安装 Emacs 插件要方便得多。

Philosophical approach

有些人不喜欢 Free Software Foundation(FSF) 的那种理念(FSF 的创立者和主管是 Richard Stallman,他恰好就是 Emacs 的创造者), 但是我是很赞同 FSF 所提倡的那种精神的。
我一再强调,我是一个理想主义的学者. 然而令人讽刺的是,虽然大多数学者都在公立机构中任职,但我很少见有学者参与到自由软件的开发(使用 Emacs 不算) 中来。
也就是说,Emacs 所代表的 FSF 及其理念和我作为学则的理念是吻合的(我使用 Arch Linux 可能违背了 FSF 的意愿,但是它确实要比 ubuntu 好用)

Community

Vim/Emacs 之争非常的激烈,但是就我看来,Emacs 用于要更有激情一些. 全国各地都有大量的 Emacs 聚会,人们分享自己的配置,演示有用的技巧。
也许 Vim 也有类似的聚会吧,但是感觉没有 Emacs 那么常见。
Vim 是一款非常有用的工具,而 Emacs 是一种生活方式。

Vim doesn’t have Tetris

Emacs 可以玩俄罗斯方块而 Vim 不能玩. 争论至此休。

这当然只是个玩笑了,不过若你和我以前一样,总是围绕着终端,编辑器和 IDE 转的话,那么我现在要告诉你一个关于 Emacs 的巨大秘密 - 你可以用它来所有的事情。
下面列出一些我在 Emacs 中能做而 Vim 不能做的事情:

  • 使用终端(借助于 eshell)
  • 查看天气情况(使用 forecast.io/dark sky API)
  • Google 搜 (使用 helm-google)
  • 收发 email
  • 写学术论文(使用 org-mode)
  • 跟踪我的待办列表和日程安排(使用 org-mode)

与在终端中运行 Vim 打开文件来编辑不同, Emacs 从不退出,用 Emacs 打开的文件会在各个 buffer 中显示。有些人会抱怨 Emacs 的启动速度好慢,不过对我来说不是什么问题。我的工作是以 Emacs 为中心的,我几乎从不关它。

Org mode

Org-mode 绝对是个神器. 有些人使用 Emacs 的目的就是为了用 org-mode, 甚至有很多非程序员也在用。我最开始是通过这个 视频 来学习用 org-mode 来写作的,不过 这些 视频 都是学习 org-mode 好起点。

Org-mode 可以用来写作,编写大纲,管理日程,等等其他好多工作. 事实上,这篇文章就是用 Spacemacs/org-mode 来写得,然后再导成 html。

Emacs is fun to learn

我只有实在没办法的情况下才会去学习 Vimscript,大多数的使用的 Vimscript 都是从网上拷贝过来的. 我对写 Vimscript 感到很反感。
而 Emacs 就不一样了。配置 Emacs 的过程很有趣。我甚至对学习 Emacs-Lisp 跃跃欲试,我觉得学习 Emacs-Lisp 要比学习 Vimscript 有意义的多。
学习 Emacs 总能给我带来新的惊喜,我也一直在尝试用它来改进我的工作流程。

Conclusion

从 Vim 转换到 Emacs 后,我总结出了一条结论: Vim 并不是一个具体的编辑器,它其实指的是一系列的按键。
你当然可以把它当成一个编辑器来用(而且我偶尔也还会用一下),但 Vim 的最大贡献是它的按键设置,它的这套按键设置可以说是最好的一套方案,我现在已经完全离不开这套方案了(我甚至在浏览器中都使用这套按键)。

Emacs 严格来说也不能算是一个编辑器. 我越用就 Emacs,就越觉得它实际上就是个操作系统。
你可以把它当成是编辑器、IDE、终端、email 客户端,字处理器,日程安排软件,代办事件列表,甚至是 life organizer。
Spacemacs 的 motto 说的好:最好的编辑器既不是 Emacs 也不是 Vim,而是两者合一!Emacs 与 Vim 两者本身是不相斥的. 事实上,他们双剑合璧,无敌于世。

不过,Spacemacs/Emacs 也不是说就完美了,还是有少许障碍的:

  • 我至今尚未发现一款完全满意的 Emacs 终端;也可能我理想中的终端根本就尚不存在。
    Eshell 能满足我 95%的需求(它也是我最常用的终端),可惜缺少 IO 重定向功能。
    当我需要用到 IO 重定向功能时,我只能用 terminator 来代替。
    当使用 ansiterm 和 multiterm 时,缺少 Vim 按键让我很苦恼,总体来说,这些模拟器都挺难用的。
  • 我还不太会用 org-agenda,因此目前我主要用 Google calendar 来安排任务。
  • Email 时常以 HTML 为内容(而我并不知道如何让 Emacs 渲染这些 HTML),所以我经常要用 web 版的客户端。
  • 在 Emacs 中使用 Mongo Shell (MongoDB) , Psql (PostgreSQL) 这一类的交互式 shell 经常会有一些问题,而且有些这类项目已经不再维护了。
  • 使用 Emacs 的人不多,因此当要与人合作时就比较麻烦了. 需要花额外的时间来将之转换成符合工业标准的格式。
    例如,我经常要跟同事分享手稿,而 Emacs 与工业标准的字处理程序(我不会告诉你是哪个程序的) 之间的转换并不理想。
    有鉴于此,现在我要把手稿发给同事前都需要先把 org 文件转换成 libreOffice 文档(这个转换效果还不错),再发给他们。
    我听说网上有人已经解决这个问题了,但是我还不知道怎么搞定它。
  • Emacs 作为 web 浏览器还不够理想。

我觉得所有这些问题终会被解决的. 总体来说,我对现在基于 Emacs 的工作流程更加满意. 如果你有一些关于使用 Emacs 的建议的话,欢迎告诉我!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

明媚殇

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文