工欲善其事,必先利其器。器欲尽其能,必先得其法。vim 的鼎鼎大名,相信大家早已耳闻,但其繁琐的配置和一系列命令总是令初学者忘而却步。本文旨在总结出常用 vim 基本操作,并将其与 vscode 结合使用,帮助初学者快速上手。如果您不习惯 vs,其它主流编辑器也同样拥用 vim 插件,配置大同小异。
工具没有好坏之分,适合自己的,便是最好。
基本的模式切换
vim 操作分四种模式:普通模式(命令模式)、输入模式、视图模式、底线命令模式,普通模式是用得最多的模式,而其它三种模式之间的切换则以普通模式为跳板。
- 普通模式->输入模式:
a/A: 字符后/行尾插入
o/O: 下/上另起一行插入
i/I: 字符前/行首插入
s/S: 删除单个字符并进入插入模式/删除整行并进入插入模式
c: 配合文本对象进行替换, 文本对象可以理解为一个单词(cw, ciw, caw, 这里 w 就是用来控制单词选择的),一个句子。
C: 删除当前行光标所在位置往后的字符
- 普通模式->视图模式:
v/V: 选中当前字符/选中当前行
ctrl+v: 方块选择(win 中注意会和系统粘贴有冲突)
- 普通模式->底线命令模式: 格式(冒号 + command)
:reg: 查看所有寄存器内容
:set num: 设置行号
...略
- 其它模式->普通模式:
Esc/Ctrl+[
插入模式下
ctrl+h 删除上一个字符
ctrl+w 删除上一个单词
ctrl+u 删除当前行
注意:以上三个操作都是不可恢复的
命令模式下
- 光标移动:
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 快速跳转到最后一次编辑的地方
- 删除操作:
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
- 修改:
r/R 替换单个字符或向右依次替换并进入插入模式
c 配合文本对象进行修改,cw,C,ciw,caw 并进入插入模式
s,S 替换并进入插入模式
~ 大小写切换
- 查找:
除开上述的 f/F/t/T/\*/#号外, /或者?进行向前或反向搜索,n/N 向前或向后匹配
- 复制粘贴:
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这个操作才可以。具体配置可参考文章最后。
- 常用其它操作:
. 重复上一步操作
u 类似于 系统 ctrl + z
ctrl+r撤销 u 操作
ctrl+d向下
ctrl+u向上
gd:跳转到定义,用的较多
gh:查看光标所在处错误信息
af: 视图模式下扩展当前块级视图(用的较少)
- 宏命令:
q{register} + action + q 记录宏, qa^i"q,(a 表示宏的 register, ^i"表示一个 action,在当行首部添加一个引号)
@{register}执行宏, @a,将上述记录的宏在当行执行
'<,'> normal @{register} 视图模式执行宏
- 窗口:
ctrl+w-h/l/j/k 切换窗口
:vs 竖向分隔窗口
:sp 横向分隔窗口
插件
- gcc 插件注释(vscode 中默认集成):
gcc 快速注释当前行, gc2j 注释以下三行, VISUAL 模式 gc 可快速注释选中行
gC VISUAL 模式使用块级注释
- 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 的功能,大放异彩,执着于键盘的灵动、喜欢折腾的同学不妨深入了解。