Vim 常用基本操作,与 VsCode 的强强联合

2,842 阅读11分钟

工欲善其事,必先利其器。器欲尽其能,必先得其法。vim 的鼎鼎大名,相信大家早已耳闻,但其繁琐的配置和一系列命令总是令初学者忘而却步。本文旨在总结出常用 vim 基本操作,并将其与 vscode 结合使用,帮助初学者快速上手。如果您不习惯 vs,其它主流编辑器也同样拥用 vim 插件,配置大同小异。

工具没有好坏之分,适合自己的,便是最好。

基本的模式切换

vim 操作分四种模式:普通模式(命令模式)、输入模式、视图模式、底线命令模式,普通模式是用得最多的模式,而其它三种模式之间的切换则以普通模式为跳板。

  1. 普通模式->输入模式:
   a/A: 字符后/行尾插入
   o/O: 下/上另起一行插入
   i/I: 字符前/行首插入
   s/S: 删除单个字符并进入插入模式/删除整行并进入插入模式
   c: 配合文本对象进行替换, 文本对象可以理解为一个单词(cw, ciw, caw, 这里 w 就是用来控制单词选择的),一个句子。
   C: 删除当前行光标所在位置往后的字符
  1. 普通模式->视图模式:
   v/V: 选中当前字符/选中当前行
   ctrl+v: 方块选择(win 中注意会和系统粘贴有冲突)
  1. 普通模式->底线命令模式: 格式(冒号 + command)
   :reg: 查看所有寄存器内容
   :set num: 设置行号
   ...略
  1. 其它模式->普通模式:
   Esc/Ctrl+[

插入模式下

   ctrl+h 删除上一个字符
   ctrl+w 删除上一个单词
   ctrl+u 删除当前行

注意:以上三个操作都是不可恢复的

命令模式下

  1. 光标移动:
   hjkl 上下左右移动,nh 向左移动 n 个字符,其它依次类推,也可以配合 gh,Gh 进行跳转
   w/b/e 跳转至下一个非空白符分隔的单词,下一个首部/上一个首部/下一个尾部
   W/B/E 跳转至下一个空白符分隔的单词,同上
   f/F + 字符 当前行查找单个字符,分号进入下一匹配,
   t/T + 字符 是查找到 f,F 的前一个字符,一般用的较少,f 用得较多
   # 向上查找,n/N 键进入下(上)一匹配, *键向下查找
   0w 快速移动到当行字符第一个单词首部(适应于有缩进的行)
   \$ 行尾,0 行首,^ 句首
   () 句子间移动,一般由英文断句分隔,
   {} 段落间移动, 一般由空行分隔
   % 匹配的括号之间来回跳转
   H,M,L 快速跳转到当前视图开头,中间,结尾
   gg/G 快速跳转到最开始和最末尾
   ctrl+o 快速返回跳转前的位置
   gi 快速跳转到最后一次编辑的地方
  1. 删除操作:
   dd 删除整行,d$删除到行尾,d0删除到行首, dw删除到单词尾部, db删除到单词首部
   ndj向下删除n+1行,ndk向上删除n+1行, ndd向下删除n行
   D 向左删除
   x 删除字符
   X 向左删除
   n+d,n+x 删除 n 行或者 n 个字符
   iw: inner word 光标在单词里面任何位置操作单词, diw, di' 删除光标所在单词,或者引号间的单词。
   aw: around word 它会选中当前单词及当前单词之后的空格。 daw,da' 删除光标所在包括后面空格的单词。

文本对象: 单词(iw,aw),句子都可以称为文本对象,常用配合文本对象的操作是删除和修改,diw,daw,ciw,caw

  1. 修改:
   r/R 替换单个字符或向右依次替换并进入插入模式
   c 配合文本对象进行修改,cw,C,ciw,caw 并进入插入模式
   s,S 替换并进入插入模式
   ~ 大小写切换
  1. 查找:
   除开上述的 f/F/t/T/\*/#号外, /或者?进行向前或反向搜索,n/N 向前或向后匹配
  1. 复制粘贴:
   yy 复制一行
   nyy 复制 n 行
   yw,ye 向后复制一个单词,
   yb 向前复制一个单词,
   "9y 复制内容到 9 号寄存器中(注意前面的双引号)
   p 粘贴,"9p 从 9 号寄存器中粘贴(注意前面的引号)
   寄存器:剪切版'+',当前文件名'%',上次插入文本'.'

寄存器概念:vim 内置很多寄存器,比如 0-9,+-等,0 是默认(无名)寄存器,通常如删除复制操作(d, dd, s, S)等都会将内容存在 0 这个寄存器中,而系统 ctrl+c 的内容会存在+这个寄存器中(vscode 中显示*也存了,可通过底线命令:reg查看。所以在没有相关 vim 配置的情况下,通过 p 操作(默认操作 0 寄存器)无法直接得到系统剪切版的内容,需要通过"+p这个操作才可以。具体配置可参考文章最后。

  1. 常用其它操作:
   . 重复上一步操作
   u 类似于 系统 ctrl + z
   ctrl+r撤销 u 操作
   ctrl+d向下
   ctrl+u向上
   gd:跳转到定义,用的较多
   gh:查看光标所在处错误信息
   af: 视图模式下扩展当前块级视图(用的较少)
  1. 宏命令:
   q{register} + action + q 记录宏, qa^i"q,(a 表示宏的 register, ^i"表示一个 action,在当行首部添加一个引号)
   @{register}执行宏, @a,将上述记录的宏在当行执行
   '<,'> normal @{register} 视图模式执行宏
  1. 窗口:
   ctrl+w-h/l/j/k 切换窗口
   :vs 竖向分隔窗口
   :sp 横向分隔窗口

插件

  1. gcc 插件注释(vscode 中默认集成):
   gcc 快速注释当前行, gc2j 注释以下三行, VISUAL 模式 gc 可快速注释选中行
   gC VISUAL 模式使用块级注释
  1. easymotion(vscode 中默认集成,但是需要手动打开):

需要先设置 leader 键,一般是逗号

{
  "vim.easymotion": true,
  "vim.leader": ","
}
   <leader><leader> w/b 向前/向后到达可见范围内任何单词的开头
   <leader><leader> e/ge 向前/向后到达可见范围内任何单词的结尾
   <leader><leader> k/j 向前/向后到达可见范围内任何行的行首

底部命令模式

以下命令一般在命令行 vim 编辑器中常用或作为基础配置,在 vscode 中很多已经被 vscode 默认取代了。

   :set 查询可用参数
   :set nu 行号
   :set hls 高亮
   :set incsearch 增亮搜索
   :syntax on 语法高亮
   :help ( 查找'('相关帮助信息
   :set clipboard=unnamed 系统剪切版为当前寄存器
   :reg 查看寄存器
   :colorscheme ctrl+d {theme} 切换查看当前主题

引申-终端中常用的命令编辑快捷键(和 vim 有些相似)

   ctrl + h 删除上一个字符
   ctrl + w 删除上一个单词
   ctrl + u 删除一行
   ctrl + a 移到开始
   ctrl + e 移到末尾
   ctrl + b 前移
   ctrl + f 往后移

附自己的一份 vscode 有关 vim 配置

首先要在 vscode 应用商店中下载 vim
配置可直接添加到 vscode 的配置 json 文件中
vim 中的键映射:用习惯的命令或操作来替换或增强系统命令,或者添加特殊操作,可根据个人编码习惯进行配置

萝卜青菜,各有所爱,不是么

{
   "vim.easymotion"true,
   "vim.leader"",",
   // 是否采用vim的ctrl键,该配置的原因是使用者可能更偏向vim的ctrl
   "vim.useCtrlKeys"true,
   // 使用系统剪切板,实质是将默认寄存器的内容拷贝到剪切版中
   "vim.useSystemClipboard"true,
   // vim普通模式下的键位映射
   "vim.normalModeKeyBindingsNonRecursive": [
      {
         "before": ["z"";"],
         "after": ["$""a"";""<Esc>"// 当行尾部快速添加分号
      },
      {
         "before": [",""j"],
         "after": ["1""0""j"// 光标向下移动10行
      },
      {
         "before": [",""k"],
         "after": ["1""0""k"// 光标向上移动10行
      },
      // 以下映射是将普通模式下由d,s,c,x操作产生的存在默认寄存器中的
      // 内容转移到'_'这一无用的寄存器中
      // 因为系统d,s,c,x操作的内容会默认保存,以上配置就是为了避免这种情况,可根据个人习惯配置
      {
         "before": ["d"],
         "after": ["\"""_""d"]
      },
      {
         "before": ["d""d"],
         "after": ["\"""_""d""d"]
      },
      {
         "before": ["D"],
         "after": ["\"""_""D"]
      },
      {
         "before": ["x"],
         "after": ["\"""_""x"]
      },
      {
         "before": ["X"],
         "after": ["\"""_""X"]
      },
      {
         "before": ["s"],
         "after": ["\"""_""s"]
      },
      {
         "before": ["S"],
         "after": ["\"""_""S"]
      },
      {
         "before": ["c"],
         "after": ["\"""_""c"]
      },
      {
         "before": ["C"],
         "after": ["\"""_""C"]
      }
   ],
   // vim视图模式下的键位映射
   "vim.visualModeKeyBindings": [
      // 不保存s,x产生的内容
      // 也就是说在视图模式下由c,d产生的内容会被存到默认寄存器中
      {
         "before": ["s"],
         "after": ["\"""_""s"]
      },
      {
         "before": ["S"],
         "after": ["\"""_""S"]
      },
      {
         "before": ["x"],
         "after": ["\"""_""x"]
      },
      {
         "before": ["X"],
         "after": ["\"""_""X"]
      },
      // 以下操作是在视图模式下在选中的两端快速添加,(),[],{},'',"",<>,``
      {
         "before": ["z""("],
         "after": ["c""("")""<Esc>""h""p"]
      },
      {
         "before": ["z""{"],
         "after": ["c""{""}""<Esc>""h""p"]
      },
      {
         "before": ["z""["],
         "after": ["c""[""]""<Esc>""h""p"]
      },
      {
         "before": ["z""'"],
         "after": ["c""'""'""<Esc>""h""p"]
      },
      {
         "before": ["z""\""],
         "after": ["c""\"""\"""<Esc>""h""p"]
      },
      {
         "before": ["z""<"],
         "after": ["c""<"">""<Esc>""h""p"]
      },
      {
         "before": ["z""`"],
         "after": ["c""`""`""<Esc>""h""p"]
      }
   ],
   // 避免vim生效的组合键,以vscode为主
   // 全选,查找,复制,粘贴是常用操作,用vscode组合可能会更加符合操作习惯
   "vim.handleKeys": {
      "<C-a>"false,
      "<C-f>"false,
      "<C-c>"false,
      "<C-v>"false
   }
}

结语

以上便是涵盖了在主流编辑器中可用的 vim 基本操作,而这部分内容,在日常 code 中已足够使用。当然,万事开头难,只需要坚持一周,你就会开始享受它带来的快感。其实 vim 本身功能远不止这些,vim 有自身的文件管理系统,窗口等,配合其它插件,可以在终端中实现不输 IDE 的功能,大放异彩,执着于键盘的灵动、喜欢折腾的同学不妨深入了解。