vim

vim 是一种在部分情况下更加强大的输入方式。如果你是 linux user,vim 是基本功;但如果是 windows user,我觉得没必要一定学习 vim,可以先看看 #总结。

vim 操作学习

for beginner

如果您没有学习 vim 并碰到需要使用 vim 的场景,这两条规则会很有帮助:

  1. a or i 开启编辑。
  2. <ESC>:wq 保存并退出。

常用组合键

vscode vim 特有:

VSCodeVim

由于我主要使用 VSCode 作为编辑器,所以基本上都在用 VSCodeVim。也有使用 neovim 完全替换 vscode 的尝试(见下文),不过最终都宣告失败。

首先我必须说,VSCodeVim 的开发者根本不懂中文和输入法,issue 区里积攒了一大堆的 IME issue 都没人去解决,PR 也都晾着。我实在是受不了了,直接进行了一个 fork:lxl66566/VSCodeVim,修了很多 bug,还实现了 easymotion 的 pinyin。

我的配置:

懒狗选择

vim 有着各种各样的分支(就像 linux core 和各种 distro 一样),自然也有一些无需折腾,配置简单的 vim 系 IDE,有兴趣可以尝试。

当然我喜欢折腾,所以还是自己玩自定义程度最高的 neovim,见下文。

设置(neovim 一期)

2023.06 是我第一次尝试入坑 neovim,不过浅尝一阵以后立刻跑路 vscode 了,这是我的一些心得。

在折腾了大段配置后,我决定使用 lazy.vim 代替 packer 进行插件管理。于是懒狗的我直接使用 lazyvim,该仓库使用 lazy.vim 并预设了许多插件和 keybindings,非常方便。因此我就在此基础上再进行自定义。

archived

这里有一些插件推荐,能够使 neovim 接近 vscode(笑)

我的配置存放在 github 仓库,直接替换 ~/.config/nvim 然后启动 nvim 就能使用。首次启动会黑屏一阵,不要 Ctrl+c 终止,否则需要清理缓存重新配置。

  1. 迁移我原先的 keymaps。
  2. 禁用 Telescope 及其衍生插件,改为使用 Neotree.nvim。

首先基础设置我是照着 external 2. 来的。这篇文章确实讲的还行。后续冲浪时也看到一篇写得很好的文章,见 external 3.,有空的话去试吧。

然后进入到了自定义环节:

基础设置

侧边栏

俗话说 neovim 人都在为了逼近 vscode 而努力,折腾侧边栏这事也不例外。

在尝试了多个插件(opener.nvim, Telescope, NerdTree)后,最终我使用的插件是 Neo-tree。Neo-tree 可以算是使用手感最好,最贴近我的需求的侧边栏了。

  1. 在 lua/plugin.lua 中添加:
    lua
    use {
      "nvim-neo-tree/neo-tree.nvim",
      branch = "v3.x",
      requires = {
        "nvim-lua/plenary.nvim",
        "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
        "MunifTanjim/nui.nvim",
      }
    }
  2. 快捷键(lua/keymaps.lua):
    lua
    vim.keymap.set('n', '<C-o>', ':Neotree<CR>', opts)
  3. 其他设置(init.lua):
    lua
    require('neo-tree').setup {
      filesystem = {
        filtered_items = {
          visible = true,
          hide_dotfiles = false,
          hide_gitignored = true,
        },
      }
    }

但是 neo-tree 仍然有许多问题,比如它核心都是 lua 写的,众所周知 lua 的字符串处理就是一坨屎,用多了很容易写出 bug,事实上我随便扫一下就能扫出 one command execution;包括 lua 核心用来做这种需要大量 fs 操作的东西,性能又非常差,我打开 nvim 体感要卡好几秒,基本都是 neo-tree 在卡。

我的插件

设置(neovim 二期)

2026.08.26,时隔三年,我看着越来越臃肿、越来越难用的 vscode 陷入沉思。刚好这段时间舍友在折腾 WSL,学习与配置 neovim,我闲得无聊也一起来玩玩。

2026 年折腾东西的一大好处就是有 AI,曾今望而却步的 lua 现在已经不成阻碍,曾今网上到处翻找的疑难杂症现在也能轻易解决。然而从开发到产品经理的转变也丧失了许多乐趣,不禁让我怀念起年轻气盛的……扯远了。总之,基于第一期的残废 neovim 配置,我开始了第二次的折腾。具体的提示词啥的先不说,这里随便记录一些经验之谈吧。

第二次折腾我仍然使用 lazyvim,框架本身还行,不过仍然有一些问题:

snack 的问题也不少。snack 是 lazyvim 作者搞的一个工具包,提供了许多功能,但是有些默认设置比较垃圾,必须要改:

有一些 lazyvim 键位也需要熟悉一下:

多光标一般使用 jake-stewart/multicursor.nvim。进入多光标模式后,默认按 a/i 插入是不会像 vscode 那样所有光标同时输入,其只会在当前光标上输入,只有输入结束按 esc 后会把所有操作应用到其他位置上。包括多光标键位有很多也需要手动绑一下的。由于 <C-d> 比较重要,我就绑了 <C-n>。

关于 resolve conflict:

我其实还是习惯用 vscode 那种左右下三栏的 merge 界面(之前见过 idea 那种左中右的狗屎三栏感觉真难用)。因此还是打算在 neovim 里复刻这个。简单用 git-conflict.nvim 和 diffview.nvim 写了点。

最终我的 Neovim 还是没能取代 VSCode。

中文用户专栏

vim 也有很多缺点。

最大的缺点是它没有考虑到中文用户 —— 1. 输入法跟 vim 天生就不搭,2. 在中文段落里想要定位也不是一件简单的事情。也难怪 vim 在国人这里流行不起来了,有时候切换输入法去做一些操作可能还真不如把手移到鼠标上操作来得快。包括我是 windows 用户,平常切个窗口、操作些浏览器都是需要动鼠标的,我的手也经常离开键盘,因此对 vim 没有太多的感觉。vim 还是比较适合只用 WM 的 linux user,只有配合 WM 才能尽可能减少鼠标的使用。

关于切换输入法

业界其实有一个 im-select 的方案,并且 vscode vim 也提供了一些配置用于切换输入法。

但是,im-select 已经很久不维护了,并且没有一个公认的优秀 fork;而 vscode vim 目前的切换方案是切换系统输入法,这跟我的理念不合,我希望切换的是 rime 内部的中英文开关,而不是系统的英文键盘。然而我调研许久,目前还没有任何外部切换 rime 中英文模式的方法。

所以目前看来,用户必须接受系统输入法的切换。接受输入法切换的话就简单了,使用上面的 im-select-imm:

json
"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "1033-513",
"vim.autoSwitchInputMethod.obtainIMCmd": "C:/run/im-select-imm.exe",
"vim.autoSwitchInputMethod.switchIMCmd": "C:/run/im-select-imm.exe {im}",

注意:这里的两个 Cmd 必须使用 .exe 的绝对路径,而不能只是 im-select-imm 这样的 bin name,否则无法完成切换。我估计是 vscode vim 是 split 命令后直接 spawn 这个进程,而不是在终端里执行。

关于中文跳转

一般来说,vim 内进行复杂的跳转可以使用 easymotion,这玩意 vscode vim 是自带的,只要一行 "vim.easymotion": true, 就能开。不过还是建议使用下面的 keybindings 简化 easymotion 的激活。

json
"vim.normalModeKeyBindings": [
  {
    "before": ["s"],
    "after": ["<leader>", "<leader>", "s"],
  },
]

但是 easymotion 并不能解决中文跳转问题,它还是只能支持英文。尝试寻找一些其他方案:

然后我看了眼 vscodevim 的 easymotion 实现,发现核心部分也没几行,直接 vibe 了一个能搜中文全拼前缀的 vim-lxl66566 fork。于是问题解决。至于要不好给上游提 PR,我感觉为了一个比较小众的功能去给所有 VSCodeVim user 引入一个 tiny-pinyin 依赖不一定能过,因此还是暂时先不提。

总结

我个人并不遵循 「vim 之禅」(指能用更少键实现的操作就不会用更多的键)。这跟输入法的原理一样,需要平衡效率和记忆量,而我选择了折中。

其他类似的编辑方式还有 emacs, helix 等。但是我不太建议去使用这些编辑方式,emacs 比较扭曲(对小拇指来说),helix 虽然吹自己键位更自然,但是其实没有好多少,都离不开死记硬背,而且功能还没 vim 丰富(至少对我常用的 vim 功能,helix 的支持堪忧)。

external

  1. Vim 实用技巧,进阶阅读
  2. 从零开始配置 Neovim(Nvim)(踩坑配置教程)
  3. Neovim 使用体验
  4. Emacs 101 新手求生指南(知己知彼)