基本使用

vim 哲学

  • 摆脱对视觉控制的依赖,使用键盘快捷键来进行光标定位和文本操作。
  • 利用模式切换来区分不同的编辑状态,如普通模式、插入模式、命令模式等。
  • 遵循 Unix 哲学,将 Vim 作为一个小而美的工具,通过插件和外部命令来扩展其功能。
  • 保持简洁和一致性,避免过度定制和复杂化。

所以基于 Vim, 将要打造的是一套全键盘, 而少用鼠标的生态

neovim 是 vim 的一个分支, 具有以下特点:

  • ✨ 在 vim9.0 之前, 基本做到了完全兼容
  • 💤 neovim 去掉部分 vim 历史遗留的兼容问题, 默认配置更加友好
  • ⚒️ 嵌入了最快的脚本语言: luajit, 启动的效率进一步改善
    • 🔅lua相比vimscript, 语法更加可读, 可配置性更高

以下如果无特别说明, 以 vim 代替 vim/neovim

模式

上面提到 vim 的设计哲学之一

利用模式切换来区分不同的编辑状态,如普通模式、插入模式、命令模式等。

在我这段时间的使用看来, vim 的操作最重要的就是围绕 vim 定义的几种模式来展开, 所以这里我也以 vim 的模式来展开

前置知识: vim 的各种模式快捷键完全分离, 所以每一种模式下, 你都可以设置相应的快捷键 即使多种模式下,设定了同一种快捷键, 一般也不会发生冲突

常用的模式

  • 🟢 Insert Mode(插入模式) 顾名思义, 这是所以编辑模式中最基本的功能, 这个功能下, 同其他编辑器一样, 会正常接受所有用户输入的字符, 并且显示到屏幕上 但是在 vim 里, 所有操作都是键盘快捷键驱动的, 我认为在这个模式下, 你需要注意的是:

    • 即使是 Insert Mode 下, 你仍然可以映射普通的按键

      例如: inoremap ( ()<left> " 简单的自动括号, 就可以简单实现一个自动括号匹配 (其中"vimscript的注释, 可见语法可读性多堪忧)

  • 🔵 Normal Mode(普通模式) 在这个模式下, 你的a-z将不再为输入字符, 而是 vim 的快捷键映射

    例如: kjhl 键分别对应为光标的上下左右移动 在之后使用 vim 的大部分时间里, 你最常处于的模式, 应该就是 Normal Mode

  • 🟡 Visual Mode(可视模式) 注意: 虽然看上去, 和其他编辑器里的选中模式类似, 但是实际上并不相同, 主要体现在:

    • Visual Mode 下, 你输入字符, 将被处理为 vim 定义的快捷键, 这与其他编辑器将此解析为删除选中的文本并替换并不相同

    • Visual Mode 作为一个单独的模式, 同样拥有自己的快捷键定义, 甚至拥有延伸的模式

      • Visual Block Mode(可视块模式) 如果你向选中的部分, 不是连续的文本, 而是一个矩形的区域, 那么这个模式就是为这时候准备的
      • Visual Line Mode(可视行模式) 同Visual Block Mode一样, 这个模式是为了需要按行为单位选中区域操作而诞生的
  • 🟣Command Mode(命令模式) 类似与 Vscode,输入命令一样, 这是 Vim 的命令模式, 在这个模式下, 你可以输入一些 Vim 的命令, 他们可以是内置的, 也可以是插件定义的, 甚至你也可以自己定义 在 Vim 下, 你想到的一切, 基本留给你了充足的可配置空间, 这样能最大化提高 Vim 的上限, 但是提高了 Vim 的配置门槛

    命令模式下, 你也同样可以定义快捷键, 但是一般定义的快捷键, 是方便你更好的输入命令 比如帮助快速移动光标到输入框的行首或者行为

  • Operator Pending Mode(操作符追加模式) 这是一个强大的模式,意味这你可以将映射看成一个操作,并且将他们进行组合 一般是按下一个键, 等待下一个键按下的时候的映射


一些更特殊的模式

  • 🟠 Select Mode(选择模式) > 说实话, 在很长一段时间呢, 我都不知道有这么一个模式, 当我第一次知道这个模式, 是我在编写插件时, 想知道为什么补全插件可以选中文本,然后我随便输入什么就替换了我选中的文本 之前介绍 Vim 的 Visual Mode 是不同于其他编辑器的选中模式, 而这个模式, 就是对标的其他编辑器的选中模式了 在这个模式下, 输入的文本字符, 都会作为实际的文本用于替换选中的文本(看介绍貌似是为了帮助习惯其他编辑器用户更好的迁移到 vim) 同样, 在这个模式下, 你也可以定义相应的映射, 来改变 Vim 内置的行为
  • ⚫ Terminal Mode(终端模式) 在 Neovim 中, 是自带有终端的, 而在终端下, 这个模式, 就是在 Vim 内置终端里, 所执行的映射 使用场景比较有限, 所以这里介绍比较少,我是在使用 Terminal 插件时,定义了从终端回到编辑区而不关闭终端窗口的映射时用到
  • 🟤 Others 等我想到了再补充吧

模式切换

约定:

/ 代表被划去

-> Mode 代表需要先经过[Mode]再转换

[abcd]代表按下 abcd 键均可以

From \ to Insert Normal Visual Command Select
Insert / [<Esc><C-[>] ->Normal ->Normal ->Visual
Normal [iIoOaA] / [vV] : ->Visual
Visual [IA] <Esc> / : <C-g>
Command ->Normal <Esc> <Esc> / ->Visual

快捷键

怎样快速得到一组真随机序列? 让从未使用 vim 的人退出 vim

虽然这是一个笑话, 但是也反应了 vim 的一部分问题 大量的快捷键让 vim 的能力无比强大, 完全取代了鼠标, 但是也让 Vim 的使用变得难以理解, 初学者会对这样一个屏幕无从下手

对此, 我并不想做过多介绍 Vim 的各种模式下的操作, 因为互联网上对此的介绍实在是太多了

如果你对此还不熟悉, 你可以尝试以下步骤:

  1. 选择你一个你喜欢的搜索引擎或者视频网站
  2. 搜索 Vim 的使用方式, 你会得到大量的教学文章
  3. 选择最受欢迎的, 看一遍即可
  4. 看完感觉到困难是正常的,但是如果你慢慢向此迁移, 最后你会感受到全键盘流带来的舒适

最后, 我在这里贴一张 Vim 快捷键的速记图,

1
但是请记住: 快捷键是使用过程中记忆的, 不是全部记忆了再去使用

我的打算将文章的重点放在配置一个属于你自己的, 舒适的快捷键工作流上, 而不是告诉你使用快捷键, 如果你需要知道任何快捷键的作用,搜索引擎是你最好的帮手