本文最初发布于phaazon.net网站,经原作者授权由InfoQ中文站翻译并分享。
最近,我一直在尝试各种编辑器,花了不少时间配置和使用它们。主要有:
本文主要谈论个人对这些编辑器和该领域现状的看法(不喜勿喷)。我使用vim,尤其是neovim已有十多年。首先,我会解释一下自己目前的工作流程、我对编辑器看重哪些方面。当然,文章仅是一家之言,不代表其他人的情况。
我是法国人。我用的键盘布局可以快速输入法语并进行编程。其实,我用英语输入的次数更多,也许应该选择其他键盘布局,但现在用的这个体验很不错,所以一直用它。
这个键盘布局叫bépo。它要求我用所有手指打字,并且键盘上的每个键都被分配了一个指头。这样可以加强肌肉记忆并减轻手腕疼痛(当我在键盘上打字时手腕几乎不动)。打字准确和舒适的附加好处就是打字很快(我的打字速度为每分钟120到130个单词)。
不过,我认为编程时,速度并不重要,所以这里最重要的部分是舒适度:无论输入速度如何,手腕都不会动。
模态编辑器之所以这么好用是有很多原因的。
首先,我很讨厌被迫使用鼠标来完成某些明明用键盘就能搞定的事。例如,我在自己的机器上运行应用程序只需用alt d
,程序名称(自动完成会补足程序名称)并按回车。所有这些全都用键盘完成。这种方法是针对firefox、kdenlive等程序的。至于终端应用程序,我只需要在终端中输入并自动完成即可。
简言之,我认为用鼠标在编辑器中的光标周围移动太麻烦了,尤其是我们大多数时间都在写代码(即敲键盘),因此,用鼠标移动意味着要多次在键盘和鼠标之间切换。也许你不在乎,这对你来说很酷,但对我而言,这确实是很可怕的体验。
另外,非模态的现代编辑器通常使用箭头键来移动光标,但这些箭头键要么在你键盘很远的位置,要么就没有单独的按键,而要用组合键来代替。
这就是模态编辑器的第一个好处。它们更聪明地使用键盘来实现简单而常用的功能,例如四处移动。
第二个好处是它们还有非模态编辑器的模式(即正常模式),你会有一个完整的键盘/很多按键来绑定常用的许多鼠标动作。你可以将编辑器划分为几个缓冲区、在缓冲区间移动、跳转到段落开头、搜索和替换、将动作注册为宏并重播它们,等等。
所有这些甚至都不用挪动手腕。如果你习惯用鼠标,那么这里的学习曲线会很陡峭,但一旦你克服了心理障碍,我觉得再回去用鼠标就会非常不适应了。
程序员在编程时有几种风格:
h j k l
移动,看光标在文档中的移动方式就能看出来。通常他们会按住一个键,直到光标到达目标行,然后再按下另一个键,直到光标到达给目标列,最后再细调光标位置。$
(转到行尾)、f
(转到在f之后键入的下一个字符的第一个匹配项,例如f
(将使光标移至下一个(上)、%
(转到匹配的定界符)或w
(转到下一个单词的开头)/b
(转到上一个单词的开头)等,在一个代码行上快速移动(这种方法也可以跨行工作)。绝大多数程序员都属于这几种风格之一,但实际上,我自己是个异类。我使用h j k l
和第三组中描述的vim的所有动作(我用的动作还要多很多),但这都取决于我需要移动的距离。如果我的光标位于一个单词上,并且我想移至与我的光标在同一行上非常接近的另一个单词的开头,那么如果相隔三个单词,我将只输入www
(或者3w)。如果距离较长,我会使用一个名为[EasyMotion]的工具。
Easymotion确实是一个很棒的工具。它有几种模式,具体取决于你要执行的移动类型:
我习惯的做法是将三种模式映射到<leader>l
、<leader>w>
和<leader>c
上。
在我的当前缓冲区中键入SPC l
会发生:
键入任何高亮显示的字符将使我的光标跳至该字符。对于单词也是如此,命令是SPC w
:
对于字符模式,输入SPC c后我必须按另一个字符(我想跳到的字符)。假设我们要跳转到一个#(不是单词的一部分),则输入:SPC c #:
这种移动方式初看上去并不直观,但一旦习惯就离不开它了。
对模态编辑而言,以下是我希望编辑器具备的功能列表,当然不止这些:
C-i
和C-o
:这些使我可以跳转到缓冲区中的某个文件/某个位置,然后返回到C-o
之前我所在的位置,或者输入C-i
再跳过去。tyi
在t
寄存器中添加一些行("是动作触发,t
是寄存器编号,y
和i
是首尾字母,(
是匹配值),然后用"tp
剪切这部分内容。宏可以通过指定按键来实现更强大的编辑控制,q
关键字是触发键(例如qa
会将之后的按键动作注册到a
宏上),然后使用@a
重播该宏即可。d
(删除)、y
(复制)、c
(更改),t
(转到要搜索的字符之前的字符),%
(转到另一个定界符),等等。以及更复杂的文本操作,例如“让我们更改此函数参数列表中的内容,并用(
定界”:ci(
。总之,编辑代码时我们需要模态功能。
下面就具体讲讲前面提到的那些编辑器。我会对它们发表自己的看法,根据我的编程习惯给出它们的优缺点评价。
我目前使用neovim的TUI版本,因为到目前为止,这带给我最稳定、最快、最简单的neovim体验。我尝试过多个GUI版本,但没有找到想要的东西——主要原因是它们几乎都使用Web™技术,这对我来说是不可接受的。我应该详细说明一下最后一点的原因。
为什么不使用Web技术:
:profile
进行分析以获得这个数值)。而coc.nvim大约需要12ms。这里,我介绍用的几个插件。我认为大家应该了解这些知识,不要还是把vim/neovim当成是过时的编辑器。事实并非如此。
fzf
作为后端,因此你会得到非常酷的模糊搜索体验(其他编辑器很少有这么棒的搜索——例如,你可以键入一些内容,然后放一个空格并再次输入,就能快速匹配结果了)。
:help
页面。我认为没有其他软件可以提供如此出色的帮助页面。真的,请尝试一下。你想知道如何配置coc.nvim吗?只需键入:help coc-nvim
即可。这个编辑器,我只能简单谈一谈,因为我才开始在工作中使用它(社区版)。我用的是原始版本,几乎没有修改。我只用它编辑Java。
它对Java的支持确实很完美。它能为你做很多事情,其中一些真的给我留下深刻印象:
这个编辑器是很重要的,因为它是微软的编辑工具。大家似乎都很喜欢VS Code,我也能感同身受。它的UI流畅、快速——要知道这可是基于Web的编辑器。LSP支持显然是很专业而完美的。它有很多社区插件、主题和集成。就算它是基于Web的,总的来说,我也一直很喜欢它。
我最近一直在使用emacs(原始版本),因为我看到一位同事在使用DOOM emacs,就开始尝试了。这两款编辑器放在一起介绍,因为它们非常像。在我看来,emacs和DOOM emacs的关系可以用一个词来概括:团结。我不知道他们是怎么做到的,但是所有插件互相之间都融合得很好。我使用ivy界面做自动完成和模糊搜索,一切都做得很好。UI非常漂亮,主题很棒(我喜欢默认的深色主题DOOM One),编辑器非常快——当然还是比neovim慢,尤其是在滚动时,但总比基于Web的编辑器快得多。
最后来谈GitHub的编辑器atom。我记得我首次运行atom时的第一反应是:“这个编辑器真漂亮。”默认的颜色方案One是大家都熟悉的通用颜色方案。在许多不同的编辑器中都有这个方案的fork。
对我来说,atom看起来很像VS Code,但是前者的UI比较漂亮——与VS Code相比,我更喜欢atom的UI。它的UI流畅且非常干净。从LSP集成到Markdown预览和Vim模式,你都可以找到许多扩展/插件/主题。
alt-gr
上有一个怪异的错误(他们在配置中称其为altgraph
),无法正确识别它。有时它可以工作,但我从不记得要解决此问题所必须采取的步骤,而且在大多数情况下,我花了很多时间只为这么一个非常基础的功能而已。当开始编程时,我记得见过有人谈论IDE/编辑器之战。如今,由于我尝试了许多编辑器,因此可以说并不存在所谓的编辑器战争。所有编辑器都有自己的缺点,选择合适的编辑器往往取决于个人习惯和经验。我是键盘爱好者(我自己做键盘),而且我真的很喜欢打字——不一定是代码,因此emacs和vim在那时是很明显的选项(我实际上是从emacs开始编码的)。几年后,我开始使用vim和neovim。一年前,我又开始尝试emacs,想要看看它发生了什么变化。结果我发现它多出来这么多有趣的事情!
我喜欢测试编辑器,是因为每个编辑器都至少有一个同行没有的杀手级功能:
在所有这些编辑器上花了几周时间后,我对vim/neovim有了一些新看法:我觉得并不一定就要用它们,尤其是我用上了emacs/DOOM emacs的Evil模式。在我看来,一个好的Neovim客户端可能是像emacs这样的gtk应用程序:流畅、统一、具有出色的默认设置和对neovim功能的全面支持,以及对gtk浮动窗口和弹出窗口的支持(因为它是neovim原生支持的,在TUI中感觉有点麻烦)。我们有了很多不错的插件,可用于git(fugitive/vim-gitgutter)、自动完成和语法高亮显示(coc.nvim/vim-lsp/vim-treesitter)。我唯一缺少的是一个出色的GUI,它可以利用我们在TUI中要做的“hacks”来提供弹窗、“气泡”之类的东西。一旦有了好用的Neovim GUI,我想这就会是我最喜欢的编辑器了。
在那之前,我会一直坚持使用neovim TUI,因为它与我想要的东西非常接近。我希望本文能对vim/neovim爱好者提供一些参考,帮助大家了解现代编辑器的方方面面。这里我说的是Vim爱好者,但不是所有人。
我们寻觅的东西都是不一样的,而这个美好的世界有这么多编辑器可供选择,这才是关键。
它们并不适合每个人,但每个人都有自己的最佳选项。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货