Vim 希望你掌控,VSCode 希望你消费
摘要
本文对比了 Vim 通过可编程定制侧重用户控制与 VSCode 强调通过更繁重的插件开发进行消费的不同。
<p>七月份的通讯更新断断续续,因为要参加两场婚礼、两次会议(还有两次不同的演讲!),以及完成 <a href="https://logicforprogrammers.com" target="_blank"><em>Logic for Programmers</em></a>。非常感谢所有购买了一本的人,也感谢大家对日程安排的耐心。本文末尾还有一些播客出镜、会议演讲和书籍促销信息。</p>
<p>八月份的通讯更新也会断断续续,因为我刚在 <a href="https://antithesis.com/" target="_blank">Antithesis</a> 开始开发者教育者的工作。我写文章的时间会减少,因为每周工作40小时,其中大约8小时是实际工作,其余32小时都在和 <a href="https://nixos.org/" target="_blank">NixOS</a> 较劲。</p>
<p>NixOS 是公司的标准开发者操作系统。它也是一个出了名难学的发行版,即使对 Linux 老手来说也是如此,而我来自 Windows。我想要进步的唯一方法就是全力以赴,完全投身于 NixOS 的理念。<sup id="fnref:quitters"><a class="footnote-ref" href="#fn:quitters">1</a></sup> 例如,我在测试没有我惯用的2000行 Neovim 配置能坚持多久。</p>
<p>这立刻引出了一个<em>为什么</em>我有2000行 Neovim 配置的问题。那是因为 Vim<sup id="fnref:vim"><a class="footnote-ref" href="#fn:vim">2</a></sup>(和 Emacs)对配置的思考方式与更流行的编辑器大不相同。</p>
<h2>控制与消费</h2>
<p>假设我们想让 <code>ctrl+n</code> 保存当前文件。在 VSCode 中,你将这段代码放在 <code>keybindings.json</code> 里:</p>
<div class="codehilite"><pre><span></span><code><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ctrl+n"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"workbench.action.files.save"</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">]</span>
</code></pre></div>
<p>在 Neovim 中,你将这段代码放在 <code>init.lua</code> 里:</p>
<div class="codehilite"><pre><span></span><code><span class="nv">vim</span><span class="p">.</span><span class="py">keymap</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="s1">'n'</span><span class="p">,</span><span class="w"> </span><span class="s1">'<c-n>'</span><span class="p">,</span><span class="w"> </span><span class="kr">function</span><span class="p">()</span><span class="w"> </span><span class="nv">vim</span><span class="p">.</span><span class="py">cmd</span><span class="p">.</span><span class="nf">write</span><span class="p">()</span><span class="w"> </span><span class="kr">end</span><span class="p">)</span>
</code></pre></div>
<p>现在,来看几个不同点。首先,VSCode 示例调用的是固定的内置命令,而 Neovim 可以绑定任意函数。其次,在 VSCode 中你编辑的是静态配置文件,里面是静态数据,而在 Neovim 中你执行的是一个命令,该命令会编辑正在运行的编辑器状态。实际上,它甚至不需要放在配置文件里:你可以直接从命令行添加新的键映射。不过,你可能更愿意用原始的 Vim 方式来执行那个命令:</p>
<div class="codehilite"><pre><span></span><code>map <span class="p"><</span><span class="k">c</span><span class="p">-</span><span class="k">n</span><span class="p">></span> :<span class="k">w</span><span class="p"><</span>CR<span class="p">></span>
</code></pre></div>
<p>这与函数做不同的事情:它让按下 <code>ctrl+n</code> 的意思是“执行输入 <code>:w</code> 并按回车键时会做的任何事情”。在默认的 Vim 中,这与保存文件相同,但如果你将 <code>:</code> 重新映射为 <code>o</code>,那么它将相当于执行 <code>ow<cr></code>,即在单独一行输入字符 <code>w</code>。<sup id="fnref:nnoremap"><a class="footnote-ref" href="#fn:nnoremap">3</a></sup></p>
<p>换句话说,Vim 给予你对编辑器状态的惊人可编程控制。想让输入 <code>;r</code> 从剪贴板粘贴?简单。想在普通模式和插入模式中设置不同的选项?尽管去做。想让“保存文件”在满月时做些不同的事?如果你愿意,可以做到。<sup id="fnref:bufwrite"><a class="footnote-ref" href="#fn:bufwrite">4</a></sup></p>
<p>现在,你可以在 VSCode 中进行一些定制,尤其是使用多命令,但对于大多数复杂的功能,你需要编写插件。而在 VSCode 中制作插件比在 Neo/Vim 中制作要繁重得多。<a href="https://github.com/microsoft/vscode-wordcount" target="_blank">如果你想制作一个打印字数的命令</a>,你必须 1) 学习 TypeScript,2) <a href="https://www.npmjs.com/package/generator-code" target="_blank">搭建一个特殊的 VSCode 扩展项目</a>,3) 定义一个 <code>wordcount</code> 函数,4) 注册 <code>mycode.wordcount</code> 命令,5) 在扩展清单中将 <code>mycode.wordcount</code> 添加为 <code>contributes</code> 记录,6) 打包或发布你的扩展,以及 7) 导入扩展。很明显,插件系统<em>不是</em>让你微调一点功能,而是让专家为其他开发者制作完整的插件来消费。由于 VSCode 的许多高级功能只能通过插件实现,这限制了普通用户对其环境的控制。</p>
<p>Neovim 也有插件,但它们不能做任何你在默认配置中无法做到的事情。诚然,某些 API 是专门为插件专家设计的,但它们仍然有文档并可用于你的个人配置。你永远不知道别人需要什么!</p>
<p>总结:</p>
<ul>
<li>VSCode 有一个双层系统,插件制作者制作插件供用户消费。插件比用户拥有更多权力。大多数用户并不期望自己制作扩展。</li>
</ul>
<ul>
<li>Vim 有一个单层系统:用户可以做插件能做的任何事情。每个人都能扩展系统并拥有他们想要的控制权。</li>
</ul>
<h2>大多数人应该是消费者</h2>
<div class="subscribe-form"></div>
<p>坦白说:这有点无意中引战。“消费者”在软件中是个贬义词。消费者是任由生产者决定摆布的人。我认为“消费者”甚至带有被动性的含义。这有点开始倾向于道德评判:开发者应该使用 Neovim <em>因为它</em>给予他们控制。</p>
<p>但是,这<em>有意</em>有点引战,情况恰恰相反。大多数开发者最好坚持消费者模式,除非他们真的、真的想切换到控制型编辑器。<sup id="fnref:minimalism"><a class="footnote-ref" href="#fn:minimalism">5</a></sup></p>
<p>首先,学习配置和扩展 Vim 很难。我花了很长时间才适应制作基本脚本。即使我习惯了折腾 Vim,我仍然需要消费他人的插件来获得现代的开发者体验。我可不是从头编写自己的 treesitter 集成!<sup id="fnref:taskrunner"><a class="footnote-ref" href="#fn:taskrunner">6</a></sup></p>
<p>其次,虽然在 VSCode 上开发插件的体验更差,但消费插件的体验要好得多:</p>
<ul>
<li>所有插件的安装、设置和使用方式都相同。当我安装一个新插件时,不需要花十分钟阅读文档才能让它工作。</li>
</ul>
<ul>
<
查看缓存全文
缓存时间: 2026/08/19 03:32
# Vim 想要你掌控,VSCode 想要你消费
来源:https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to
七月份的通讯更新时断时续,因为参加了两场婚礼、两个会议(准备了两个不同的演讲!),并且完成了《程序员逻辑指南》(https://logicforprogrammers.com/)。非常感谢所有购买了这本书的读者,也感谢你们对更新进度的耐心等待。文末有一些播客访谈、会议演讲和书籍促销信息。
八月份的通讯更新也会不太定期,因为我刚刚开始了在 Antithesis (https://antithesis.com/) 的开发者教育者工作。由于每周要工作40小时(其中约8小时是实际工作,其余32小时则是在与 NixOS (https://nixos.org/) 搏斗),我的写作时间会减少。NixOS 是公司的标准开发者操作系统。即使对于 Linux 老手来说,它也是出了名的难学,而我又是从 Windows 转过来的。我唯一能适应的方法就是全身心投入,完全信奉 NixOS 的理念。¹ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:quitters)
首先,我在尝试看看能坚持多久不依赖我那通常长达2000行的 Neovim 配置。这立刻引出了一个问题:**为什么我需要2000行 Neovim 配置?** 因为 Vim² (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:vim)(和 Emacs)思考配置的方式与更流行的编辑器非常不同。
## 掌控与消费
假设我们想设置 `ctrl+n` 来保存当前文件。在 VSCode 中,你将此配置放在 `keybindings.json` 中:
```json
[
{
"key": "ctrl+n",
"command": "workbench.action.files.save"
}
]
```
在 Neovim 中,你将其放在 `init.lua` 中:
```lua
vim.keymap.set('n', '<C-n>', function() vim.cmd.write() end)
```
现在,来看几个区别。首先,VSCode 示例调用的是一个固定的、内置的命令,而 Neovim 可以绑定任意函数。其次,在 VSCode 中你编辑一个包含静态数据的静态配置文件,而在 Neovim 中你执行的是一个会修改运行时编辑器状态的命令。实际上,它甚至不需要在配置文件中:你可以直接从命令行添加新的键映射。不过你可能更愿意用原始 Vim 的方式来做那个命令:
`:map <C-n> :w<CR>`
这和函数的作用不同:它让按下 `ctrl+n` 等同于“执行输入 `:w` 并按下回车键所做的任何事情”。在默认的 Vim 中,这和保存文件是一样的,但如果你把 `:` 映射成了 `o`,那么它就会相当于执行 `ow`,这会输入字符 `w` 并换行。³ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:nnoremap)
换句话说,Vim 让你对编辑器状态拥有惊人的编程控制权。想让输入 `;r` 从剪贴板粘贴?很简单。想在普通模式和插入模式下使用不同的设置选项?没问题。想让“写文件”在满月时做些别的?如果你愿意,完全可以。⁴ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:bufwrite)
当然,你在 VSCode 中也能进行一定程度的定制,尤其是通过多命令(multicommands),但对于大多数复杂功能,你需要编写插件。而在 VSCode 中创建插件比在 Neo/Vim 中创建要繁重得多。如果你想制作一个统计字数的命令 (https://github.com/microsoft/vscode-wordcount),你需要:1) 学习 TypeScript,2) 搭建一个特殊的 VSCode 扩展项目 (https://www.npmjs.com/package/generator-code),3) 定义一个 `wordcount` 函数,4) 注册 `mycode.wordcount` 命令,5) 在扩展清单中将 `mycode.wordcount` 添加为 `contributes` 记录,6) 打包或发布你的扩展,7) 导入该扩展。很明显,插件系统**并非**旨在让你微调一点功能,而是让专业人士为其他开发者制作完整的插件。由于 VSCode 的许多高级功能只能通过插件实现,这限制了普通用户对其环境的控制。
Neovim 也有插件,但它们无法做到你默认配置中做不到的事情。诚然,某些 API 部分是专门面向插件专家的,但它们仍然有文档记录且可供个人配置使用。你永远不知道别人需要什么!
总结一下:
- VSCode 采用两层体系:插件制造者制作插件,用户消费插件。插件比用户拥有更多权力。大多数用户并不被期望自己创建扩展。
- Vim 采用单层体系:用户可以做任何插件能做的事情。每个人都可以扩展系统,并拥有他们想要的任何控制权。
## 大多数人应该是消费者
坦白说,这些内容无意中带有一点引战意味。“消费者”在软件领域是个贬义词。消费者是受制于生产者决策的人。我认为成为消费者甚至带有一种被动的内涵。这逐渐引向了一种道德判断:开发者**应该**使用 Neovim,**因为**它给予他们控制权。但是——这里**有意**带点引战——情况恰恰相反。大多数开发者最好坚持使用消费者模型,只有在他们真的、真的想要时才切换到控制型编辑器。⁵ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:minimalism)
首先,学习配置和扩展 Vim 是很难的。我花了很长时间才熟练编写基本脚本。即使我熟悉修改 Vim,如果我想要现代化的开发者体验,我仍然需要使用别人的插件。我可不会从头开始编写自己的 treesitter 集成。⁶
其次,虽然在 VSCode 上开发插件的体验更差,但消费插件的体验却好得多,甚至好得多:
- 所有插件的安装、设置和使用方式都相同。当我安装一个新插件时,不需要花十分钟阅读文档才能让它工作。
- 我可以阅读扩展添加的所有新命令、键绑定和配置选项列表。我可以在相同的设置 UI 中编辑任何配置选项,该 UI 具有全局搜索和输入验证等功能。
- 我可以在不更改启动脚本的情况下启用和禁用扩展,并且可以仅为特定工作区启用扩展。
- 如果一个插件添加的键绑定与我的自定义键绑定(或另一个插件的键绑定)冲突,VSCode 会**告诉我**,而不是静默覆盖旧的绑定。
- 我无法通过启动时运行的奇怪脚本或安装另一个插件来破坏一个插件。
- 一个插件也无法破坏**我的**启动过程。
所有这些之所以可能,恰恰是因为 VSCode 的插件系统如此重量级且不灵活,并且一切都通过静态 JSON 文件进行配置。要弄清楚一个 Neovim 扩展有哪些配置选项,简直相当于解决停机问题。(这里更广泛的原则是**能力-保证权衡**。⁷ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:tradeoff) 一个 VSCode 扩展能做的事情比 Vim 扩展少,因此我们对它实际能做什么有更多的保证。探索能力-保证权衡是《程序员逻辑指南》的一个贯穿主题。)
消费范式在很多方面不如控制范式,但它在这个特定、**极其重要**的方面好得多,以至于对大多数开发者来说它是正确的选择。在某种程度上,我怀疑偏好控制更多是一种性格特质,而非深思熟虑的权衡。当我无法将某些软件调整到我满意的样子时,我会**不开心**,某样东西不对劲却无法修复,这真的让我很烦扰。如果明天我醒来,不再为这些事情烦恼,我还会更喜欢 Neovim 而不是 VSCode 吗?我不知道。也许在 Nix 体验的过程中我会找到答案。
---
现在,设计空间中还有第三点我没有谈论:如果编辑器**同时**限制你的控制和消费呢?例如,Helix (https://helix-editor.com/) 允许添加 LSP 服务器和 treesitter 语法,但不允许任何其他类型的插件。⁸ (https://buttondown.com/hillelwayne/archive/vim-wants-you-to-control-vscode-wants-you-to#fn:plugins) 它还有一种静态且非常有限的配置语言。你甚至无法为不同的文件类型设置不同的键绑定。这在我看来简直疯了!但似乎很多人喜欢它,而且我对 Kakoune 风格的模态编辑 (https://kakoune.org/why-kakoune/why-kakoune.html#_improving_on_the_editing_model) 感兴趣已经有一段时间了。所以现在我正在将 Helix 作为我的主要终端编辑器。我不知道我是否会坚持使用它;我觉得我最终会渴望一个更可修改的编辑器。但至少到那时,在尝试导入我那数千行的 Neovim 配置之前,我对 Nix 会更熟悉了。
---
## 出场活动等
这次有三项:
- 我做客了《实用工程师》播客 (https://podcasts.apple.com/us/podcast/formal-methods-with-hillel-wayne/id1769051199?i=1000778935586),谈论数学、形式化方法、AI 和 Crossover 项目。如果你喜欢听“like”这个词,可以听听,也可以观看视频 (https://www.youtube.com/watch?v=KSkcgIYQy0U&list=PLzwJJv8h-iciW53inSOkQA4mkG8TuQAUh&index=2) 看疯狂的 Stan 手势 (https://youtu.be/QgRIXntFhww?si=CbiXylqFpPoegh7F&t=6478)。
- 我还做客了 Leanpub 发布会 (https://youtu.be/27IJacqgHSU),宣传《程序员逻辑指南》(配套博客 (https://leanpub.com/blog/leanpub-book-launch-logic-for-programmers-by-hillel-wayne/))。
- 上个月我参加了首届 *软件应该有效* 会议 (https://softwareshould.work/),做了一个关于形式化方法实用想法的常规演讲。但不知为何我的电脑无法连接音频/视频设备,并且**没有任何**工作人员有 PowerPoint,演讲的大部分内容在 Keynote 上根本**无法正常运行**。请观看我在这里在地震中走钢丝跳小步舞 (https://www.youtube.com/watch?v=zSZkLyD9ILI)。不知怎么的,我挺过来了。
哦,另外,Amazon 不知为何正在以 75 折销售《程序员逻辑指南》(https://www.amazon.com/dp/B0HBLP4B26)。我确认无论怎样我获得的版税都一样,所以,嘿,更便宜且没有坏处。我不知道这个促销会持续多久。
相似文章
@pierceboggan:VS Code已被数百万开发者用于智能体编程。然而,编辑器布局传统上一直……
VS Code 引入了新的'Agents'功能,允许开发者跨多个项目与多个智能体协作,将其能力扩展到单一任务工作流之外。
@DivyanshT91162: VS Code 改变了编码方式。Eclipse Theia 改变了谁控制编辑器。无遥测数据。无企业锁定。无“微软决定未来”。只是一个完全开放的框架……
本文推荐 Eclipse Theia 作为 VS Code 的开源替代方案,它具有无遥测数据、提供更多控制权以及与 VS Code 扩展兼容等特点。
没有地方比得上 $HOME:从 Vim 到 VS Code 再回到 Vim 的十年之旅
关于十年间使用 Vim、切换到 VS Code 再回归 Vim 的个人反思,探讨终端编辑器与 IDE 之间的权衡。
microsoft/vscode
这篇文章描述了Visual Studio Code的GitHub仓库,它是一个由微软开发的开源代码编辑器,详细介绍了如何贡献以及访问路线图和文档等资源。
Vim中的Lisp(2019)
详细比较了Slimv和Vlime这两个用于交互式Lisp编程的Vim插件,涵盖安装、功能及推荐。