在 VS Code 中流畅的使用 vim(持续更新)

5,722 阅读11分钟

image.png 最近在学习使用 vim,希望可以通过vim来提升自己的开发效率。因此特地总结一些平时开发中常用的快捷键,因为我一般在VS Code中使用vim快捷键,所以需要在VS Code中进行一些配置,才可以完整的使用本文中的快捷键。
配置文件我会放到文章的最后,直接我的配置文件复制到VS Code的settings.json文件当中,就可以使用下面所有的快捷键。当然,有兴趣的朋友可以研究一下如何在VS Code中添加更多的vim快捷键。

vim 模式

  • normal 模式(默认)

  • insert 模式(输入模式)

    • 按下 i,输入位置会落在当前光标选中位置的前面
    • 按下 a,输入位置在落在当前光标选中位置的后面
  • visual模式(可视化模式)

    • v 进入可视化模式(基于字符进行操作)
    • V 进入可视化模式(基于行进行操作)

通常用来选择多行或代码块

  • control + v 进入可视化模式(基于块进行操作)

通常用来同时操作多行的字符

退出当前模式

  • escj+k(需添加配置)
  • control + [
  • v 退出可视化模式(字符)
  • V 退出可视化模式(行)

移动

  • k/j/h/l 向上/下/左/右移动

  • shift + k/j/h/l 快速向上/下/左/右移动(需要配置 + 搜狗输入法)

  • 移动到行首:

    • 数字键0
    • ^ 移动到本行第一个不是 blank 字符的位置 (配置后可用H

blank 字符:空格、tab、换行、回车

  • 移动到行尾:
    • $
    • g+_ 移动到本行最后一个不是 blank 字符的位置(配置后可用L

在 vim 中快速移动(shift+k/j/h/l

defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false              # For VS Code
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false      # For VS Code Insider
defaults write com.visualstudio.code.oss ApplePressAndHoldEnabled -bool false         # For VS Codium
defaults write com.microsoft.VSCodeExploration ApplePressAndHoldEnabled -bool false   # For VS Codium Exploration users
defaults delete -g ApplePressAndHoldEnabled
  • 调整键盘灵活度,设置 => 键盘 ,按键重复和重复前延迟都跳到最右边(Mac)
  • 在搜狗输入法的 ABC 模式下,就可以实现快速移动(点击shift切换搜狗中英文模式)

添加 vim 配置

在 vim 中按下操作符,会进入 pending 模式(添加配置后使用H/L向左/右移动)

  • y +shift + h复制光标到行前的全部内容
  • d + shift + l 删除光标到行尾的全部内容

以单词为单位进行移动

  • e 移动到下一个单词的结尾(从左到右)
  • w 移动到下一个单词的开头(从左到右)
  • b 移动到上一个单词的开头(从右到左,反向操作)
  • g + e 移动到上一个单词的结尾(从右到左,反向操作)

一个符号就是一个单词,如:[

以字符串为单位的移动

字符串:多个单词和符号的组合(通常以空格进行分割)

  • E 移动到下一个字符串的结尾(从左到右)
  • W 移动到下一个字符串的开头(从左到右)
  • B 移动到上一个字符串的开头(从右到左,反向操作)
  • G + E 移动到上一个字符串的结尾(从右到左,反向操作)

vim 删除单个字符

  • x 删除光标所在的字符
  • X 删除光标前的字符
  • s 删除当前光标的字符并进入insert模式
  • S 删除当前光标所在行并进入insert模式

vim 替换单个字符

  • r 替换一个字符
  • R 替换多个字符

vim 移动光标

  • z + z 将当前行置于屏幕中央
  • z + t 将当前行置于屏幕顶部
  • z + b 将当前行置于屏幕底部
  • g + g 调到文件首部
  • G 调到文件尾部
  • 行数 + g + g 调到指定行
  • 行数 + G 调到指定行

vim 滚动

  • control + f 向下滚动一屏
  • control + b 向上滚动一屏
  • control + d 向下滚动半屏
  • control + u 向上滚动半屏
  • control + e 向下滚动一行(光标不会移动)
  • control + y 向上滚动一行(光标不会移动)

vim 快速移动 5 行(需配置J/K

  • J5 + j向下移动
  • K5 + k 向上移动

vim 高效移动

vim-easymotion(需在setting.json文件添加配置)

在 vim 中使用 easymotion 需要先开启,还可以在 vim 中修改<leader>对应的键位

基于单词的移动

  • <leader> + <leader> + w 快速移动到单词的头部(向光标下面进行移动)
  • <leader> + <leader> + b 快速移动到单词的尾部(向光标上面进行移动)
  • <leader> + <leader> + e 快速移动到字符的尾部(向光标下面进行移动)
  • <leader> + <leader> + g + e 快速移动到字符的尾部(向光标上面进行移动)

基于行的移动

  • <leader> + <leader> + j 快速移动到某行(向光标下面进行移动)
  • <leader> + <leader> + k 快速移动到某行(向光标上面进行移动)
  • <leader> + <leader> + h 快速移动到某行开头、结尾、大小写、_,#(向光标上面进行移动)
  • <leader> + <leader> + l 快速移动到某行开头、结尾、大小写、_,#(向光标下面进行移动)
  • <leader> + <leader> + <leader> + j 快速移动到某行(向光标上下任意进行移动)

vim搜索(需配置f/Fs/S

需要在配置文件中开启使用 sneak:

单行内搜索

  • t+单个字符+回车 正向移动到下一个字符所在之处的前一个字符上
  • T +单个字符+回车反向移动到上一个字符所在之处的后一个字符上
  • f +单个字符+回车正向移动到下一个字符所在之处
  • F +单个字符+回车反向移动到上一个字符所在之处

快速移动时用 f,结合修饰符(cd)时用t

基于全局进行跳转(基于两个字符进行跳转)

  • s + 两个字符 全局查找(和f查找类似,向下查找)
  • S + 两个字符 全局查找(向上查找)

s/S的功能添加到f/F(需添加配置)

  • f 替换 s
  • F 替换 S

这样F ,f可以同时搜索一个字符和两个字符

  • ; 重复上次的字符查找命令(跳转到下一个字符的位置)
  • , 反转方向查找上次的字符查找命令(跳转到上一个字符的位置)

s/S添加新的功能(需添加配置)

  • s 删除当前字符
  • C 删除从当前光标到行尾的字符
  • S 删除本行字符并进入 Insert 模式

vim 全局搜索(和VS Code中的搜索功能类似)

  • / 向后查找
  • ? 向前查找
  • n/N 调到下一个/上一个要查找的词的位置
  • / + 上下左右 查看搜索历史
  • 输入单词的前几个字符进行搜索就可以
  • / + # 向上查找(精确匹配)
  • / + * 向下查找(精确匹配)

处理包裹字符的符号(vim-surround)

  • c + s + 要添加的符号 + 当前的符号使用新符号替换现在字符两端的符号,例如`cs"``
  • y + s + 要添加的符号 + 当前的符号 在字符两端添加符号,例如:ysiw"

ysiwt + 标签名 可以使用标签包裹单词

  • d + s + 当前的符号 删除字符两端的符号
  • S + 要添加的符号 给选中字符的两端添加符号(可视化模式下使用)

vim 常用的组合

  • cw 删除当前单词(重命名变量名)
  • ea 在当前单词结尾插入

vim 插入

  • I 在行首插入
  • A 在行尾插入
  • O 在行前插入(另起一行)
  • o 在行后插入(另起一行)

vim 操作(复制,新增,删除)

操作符

  • d 删除
  • c 删除并且进入 insert 模式
  • y 复制

vim 快捷操作

  • yy 复制当前行
  • p 粘贴
  • dd 删除当前行

这里的复制粘贴与默认的command + ccommand + v不冲突

vim 撤销和取消撤销

  • u 撤销刚才的操作
  • ctrl + r 取消刚才的撤销

这两个操作都是基于vim的可撤销块去进行操作的,可撤销块是指进入插入模式后,每一次的插入或删除内容都会被当成一次修改。

可视化模式结合 k/j/h/l 进行范围操作

  • v + e 选中当前单词
  • o 切换可视区的光标位置
  • g + v 回到上一次选择的选择区域

可视化模式下:选中 + 操作(增删改)

可视化模式常用的开发技巧

  • 多行同时编辑:全部选中(control + v)后使用AI
  • 复制粘贴:系统的剪切板(command + c/v)和 vim 的剪切板(yy/p)同时使用
  • 尽量少用可视化模式(用最少的按键完成操作)

操作符 + 快速移动(需配置)

在 vim 中按下操作符,会进入 pending 模式,配置后可以用H/L进行左右移动

  • 例如:d + shift + l 删除光标到行尾的全部内容

操作符结合数字使用

  • 数字 + operator + 动作(范围)
  • operator + 数字 + 动作(范围)

示例:d + 3 + w 删除三个单词

点(.

功能:重复上一次的修改

  • 刚才进行的更新(增删改)
  • 离开 insert 模式之前的全部按键操作记录

删除一个单词的命令如何选择(光标在单词尾部)

  • d + i + w

优先选择可以使用.进行重复操作的命令,如d+i+w

一键移动 一键操作

  • 快速在尾部加;
    • j + L + a + ;
    • j + A + ; 然后就可以使用j + . + j 来一直自动跳转到下一行的尾部并进入 insert 模式

查找手动替换

  1. / + 要查找的词
  2. cw + 要替换的词
  3. n 切换到下一个位置
  4. . 替换

能够重复就不要使用次数(数字)=> 执行

vim 编辑文件

  • vim test 有 test 文件则进入 test 文件,没有则创建 test 文件并进入
  • :wq 写入内容并退出
  • cat test.txt 查看当前 test 文件的内容
  • :q! 强制退出(不保存当前对文件的修改)

选中函数

  • v + a + I 选中当前整个函数
  • v + a + i 选中当前整个函数(不包含最后一个括号)
  • v + i + i 选中当前函数中的内容

上面这三个快捷键组合都是基于缩进进行选择,可以先格式化代码再选择

悬浮显示

g + h 悬浮显示(一般用于查看报错的代码提示信息)

大小写

  • normal 模式: g + u 变为小写,g + U 变为大写 ,例如:gUiw 把当前单词全部变成大写
  • 可视化模式:u 变成小写,U 变成大写,例如:veU 把当前单词全部变成大写
  • 大小写切换: ~ normal 模式和可视化模式都可以使用
  • v + e 选中单词,shift + ~ 把单词每个字母都变成大写

注释

  • g + c 单行注释
  • g + C 多行注释

normal 模式和可视化模式都可以使用

vim 调用 VS Code 的命令

格式化文档

  • shift + alt + f<leader> + f + d

重命名(函数或变量)

f2<leader>+r+n

折叠代码

Mac: alt + command + [
windows: ctrl + shift + [

vim: <leader>+ [

展示代码

Mac: alt + command + ]
windows: ctrl + shift + ]

vim: <leader> + ]

窗口管理

使用一下vim快捷键时记得提前设置一下VS Code的按键,避免冲突

新建窗口

  • ctrl + w v 左右
  • ctrl + w s 上下

窗口切换

  • ctrl + w h/j/k/l
  • ctrl + w w

关闭窗口

  • ctrl + w c

只保留当前窗口,关闭其他所有的窗口

  • ctrl + w o

新建文件/文件夹

在 keybindings.json 中添加按键配置

切换 files explorer 区域

  • shift + ctrl + h vim
  • ctrl + ;  vscode

切换 editor 区域

  • shift + ctrl + i vim
  • ctrl + '  vscode

创建文件

  • 在 files explorer 中:a (推荐)
  • 在 editor 中:leader + n + f vim (推荐)
  • vscode command + n
  • 使用插件 file Utils

创建文件夹

  • 在 files explorer 中:A (推荐)
  • 在 editor 中:leader + n + d vim (推荐)
  • 使用插件 file Utils

vim 多文件之间的跳转

标记

  • m + 小写字母 例如:mm 对单文件进行标记
  • m + 大写字母 例如:mM 对多文件进行标记

跳转

  • ' 例如:'m 跳转到标记的行
  • ``` + 之前标记的字符 例如:``m` 跳转到标记的行和列(更精准)

jump to definition

  • g + d 查找定义的变量并进行快速跳转(单文件和多文件都可以查找)
    • l 跳转 / 打开目录
    • h 回到目录
    • esc 退出选择的模式

跳转

任何大于一个单词或超过当前行导航的移动都是一个跳转(跳转记录也会被记录到 vim 中)

vim-sneak 的跳转只记录一次

  • ctrl + i 向后跳转
  • ctrl + o 向前跳转

常用操作:
g + d 查看当前变量的引用,ctrl + o 返回之前查看的位置

记录跳转

vim 保留了移动前位置的记录,可以使用:jumps查看

命令

  • { 跳转上一个段落
  • } 跳转下一个段落

vim 文本对象

文本是结构化的,可以快速选择

vim 文本对象用法

  • 操作符(operator) + (内部i / 外部a) + 文本对象
  • 可视化模式 + (内部i / 外部a)+ 文本对象

vim 文本对象

  • w 一个单词
  • () 一对()
  • b 一对()
  • [] 一对[]
  • {} 一对{}
  • B 一对块{}
  • <> 一对<>
  • t XML 标签
  • ' 一对'
  • " 一对"
  • ```一对`
  • s 一个句子(以.!?结尾的语句)
  • p 一个段落

vim 文本对象实践示例

  • v + i + b 选中括号里面的内容
  • v + i + ( 选中括号里面的内容(包含括号)
  • d + i + b 删除括号里面的内容
  • v + i + w 选中当前单词

vim-textobj-arguments

  • i + a 不包含分隔符
  • a + a 包含分隔符

实践技巧

  • d + a + a 删除一个参数
  • c + i + a 修改一个参数

vim-textobj-entire

  • d + a + e 删除当前文本所有内容
  • d + i + e 删除当前文本所有内容,但是不包含前面和后面的空格

vim 在 VS Code 中操作git

显示侧边代码控制面板

  • ctrl + shift + g
  • 空格 + g + g

git 添加到缓存区(git add .)

  • 空格 + g + s

git 提交(git commit)

  • 空格 + g + c

git 查看差异(git diff)

  • 空格 + g + d + f

git 取消add

  • 空格 + g + u

git 取消对文件的修改

  • 空格 + g + c + l

vim 在 VS Code 中重构

重构按键

  • ctrl + shift + r 只展示重构代码相关操作
  • ctrl + . 展示重构代码和其他选项

vim 选中函数中所有代码

  • v + i + i

提炼为一个函数

  • 选中要提炼的代码
  • ctrl + . 选中提炼成一个函数
  • 也可以提炼成一个内联的函数

提炼为一个变量

  • 和提炼为函数操作基本一致
  • 选中变量名,ctrl + . 提炼为一个变量

插件

语法报错的话需要先修改语法错误才可以进行重构操作

hocus pocus(vscode 插件)

  • 先使用变量/函数,再创建变量/函数
  • <Space> +f + f创建函数
  • <Space> +v + v创建变量

这是我的配置文件链接:github.com/MambaNeverO…
文件中大部分地方我添加了注释,后续如果有新的实用按键,我也会持续添加到本文中,配置文件也会持续更新,有兴趣的小伙伴可以点赞收藏一下。