基础
移动
- h:左
- j:下
- k:上
- l:右
- e:移动到单词的结尾
- b:移动到上一个单词的开头
- w:移动到单词的开头
- ge:移动到上一个单词的结尾
行相关移动
行首
- 0:移动到行首
- ^:移动到非 blank 字符的位置
行尾
- $:移动到行尾
- g_:本行最后一个不是不包含 blank 字符的位置
改键
"vim.normalModeKeyBindings": [
{
"before": ["H"],
"after": ["^"]
},
{
"before": ["L"],
"after": ["g", "_"]
}
],
输入
- i:光标前
- a:光标后
- A:行后输入
- I:行首输入
- O:行前输入
- o:行后输入
文本操作
- yy:复制当前行
- p:粘贴
- dd:删除
Vim 语法
操作符➕动作
-
操作符
- d:删除
- c:删除并进入 insert 模式
- y:复制
-
组合
- dL:删除到行尾
- dH:删除到行首
- dgg:删除以上的文本
- dG:删除以下的文本
- cw:删除当前的单词
- ea:在当前结尾处添加
处理单字符
- x:删除当前光标的字符
- X:删除当前光标前面的一个字符
- s:删除当前光标的字符并进入 insert 模式
- S 删除当前光标所在行并进入 insert 模式(常用)
- r:替换一个字符
- R:替换多个字符
- 撤销:进入插入模式开始,直到返回普通模式,这期间的都是一次修改
- u:撤销
- C-r:恢复
可视化模式
- v:字符
- V:行
- 块:Ctrl + v
- o:切换可视化区域的光标位置
- gv:回到上一次选择的区域
跨多行编辑
利用可视化区域的能力以及插入操作,可以进行跨多行编辑
- 选中多行按下 A,可以在多行末尾操作
- 选中多行按下 I,可以在多行行首操作
文本对象
-
操作符 +(内部/外部)+ 文本对象
-
可视化模式 +(内部/外部)+ 文本对象
-
内部:i
-
外部:a
对象
- w:一个单词
- (:括号
[: 中括号- {:花括号
- <:尖括号
- t:xml 标签
- ":引号
- s:一个句子
- p:一个段落
组合
- ciw:删除一个单词并进入编辑模式
- ci(:删除括号内的内容并进入编辑模式
- ca(:删除整个括号的内容并进入编辑模式
vim-textobj-arguments
- ia:不包含分隔符
- aa:包含分隔符
使用:
- daa:删除第一个参数
- cia:修改一个参数
vim-textobj-entire
- ae:删除当前文本所有内容
- ie:删除当前文本所有内容,但是不包含前面和后面的空格
滚动
- zz:当前行置于屏幕的中央
- zt:当前行置于屏幕的最上方
- zb:当前行置于屏幕的底部
- gg:跳到文件首
- G:跳到文件尾
- 行数+gg:跳到指定行
- 行数+G:跳到指定行
滚动一屏
- C-f:向下
- C-b:向上
半屏幕
{
"before": [
"J"
],
"after": [
"5",
"j"
]
},
{
"before": [
"K"
],
"after": [
"5",
"k"
]
}
搜索
- f:(行内)正向移动到下一个查找字符的所在之处
- F:(行内)反向移动到上一个查找字符的所在之处
- t:(行内)正向移动到下一个查找字符的所在之处的前一个字符
- T:(行内)反向移动到下一个查找字符的所在之处的后一个字符
- /:(全局):向前查找
- ?:(全局):向后查找
- n/N:下一个/上一个全局查找的内容
- /+方向键:查看搜索历史
- /#:向上查,严格匹配,在搜索后按下#号
- /*:向下查,严格匹配
- ;:在指定查找的状态下,可以切换到下一个查找的字符
- ,:在指定查找的状态下,可以切换到上一个查找的字符
flashVim快速搜索移动
基础使用
f+搜索的字符+label
支持操作符
例如:v+f,直接选中到某个 label
上一次的搜索
f+回车
配置
开启
"vim.flash.flash": true
忽略大小写
"vim.flash.ignorecase": false,
设置 label 的背景色
"vim.flash.backgroundColor": “#ccff88”,
文件跳转
-
m+小写字母:单文件(标记)
-
m+大写字母:多文件(标记)
-
'm/M:跳转到标记
-
`m/M:更精准跳转
-
gd:跳转到定义的地方
-
l:展开和收缩
-
h:跳转到当前的定义条
-
C-i:向前跳转
-
C-o:向后跳转
包裹字符的符号
- 改变现在的符号:cs+符号+替换后的
- 添加符号ys+符号+范围(例如 ys + iw + { 当前单词加上花括号)
- 删除符号:ds + 符号
字符替换
语法: :范围s/要被替换的字符/替换后的字符/flag(可选)
范围:$行尾,% 全局。number,number 行范围
flag:g 全局
例如:
- :%s/node/nnnn,全文的node 替换成 nnnn
悬浮显示/大小写/注释
- gh:悬浮显示
- gu:小写
- gU:大写(gUiw单词变为大写)
- gc:单行注释
- gC:多行注释
窗口管理
需要先按 C-w 才能进入窗口管理模式
新建窗口
- v:左右
- s:上下
窗口切换
- hjkl
关闭窗口
- c
只保留当前窗口关闭其他的窗口
- o
利用vscode改键完成移动
修改 keybinds.json
{
"key": "shift+left",
"command": "vim.remap",
"when": "vim.mode == 'Normal'",
"args": {
"after": ["<c-w>", "h"]
}
},
{
"key": "shift+right",
"command": "vim.remap",
"when": "vim.mode == 'Normal'",
"args": {
"after": ["<c-w>", "l"]
}
},
{
"key": "shift+up",
"command": "vim.remap",
"when": "vim.mode == 'Normal'",
"args": {
"after": ["<c-w>", "k"]
}
},
{
"key": "shift+down",
"command": "vim.remap",
"when": "vim.mode == 'Normal'",
"args": {
"after": ["<c-w>", "j"]
}
},
vscode 命令
格式化文档和重命名
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["<Leader>", "f", "d"],
"commands": ["editor.action.formatDocument"]
},
{
"before": ["<Leader>", "r", "n"],
"commands": ["editor.action.rename"]
},
],
折叠和展开
{
"before": ["<Leader>", "]"],
"commands": [{
"key": "alt+cmd+]",
"command": "editor.unfold",
"when": "editorTextFocus && foldingEnabled"
}]
},
{
"before": ["<Leader>", "["],
"commands": [
{
"command": "editor.fold"
},
{
"command": "vim.remap",
"args": {
"after": ["$", "%"]
}
}
]
}
Vscode相关快捷键
{
"key": "ctrl+;",
"command": "workbench.action.terminal.new",
"when": "terminalProcessSupported || terminalWebExtensionContributedProfile"
},
{
"key": "ctrl+'",
"command": "workbench.action.focusFirstEditorGroup"
},
{
"key": "f",
"command": "explorer.newFile",
"when": "filesExplorerFocus && !inputFocus"
},
{
"key": "shift+f",
"command": "explorer.newFolder",
"when": "filesExplorerFocus && !inputFocus"
},
{
"key": "r",
"command": "renameFile",
"when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
},
{
"key": "d",
"command": "deleteFile",
"when": "filesExplorerFocus && foldersViewVisible && !explorerResourceReadonly && !inputFocus"
}