Vim模式
- 普通模式(Normal mode) - 默认模式,用于导航和操作文本
- 插入模式(Insert mode) - 用于输入文本
- 可视模式(Visual mode) - 用于选择文本
- 命令行模式(Command-line mode) - 用于执行命令
模式切换
-
普通模式 -> 插入模式
i- 在光标前进入插入模式I- 在行首进入插入模式a- 在光标后进入插入模式A- 在行尾进入插入模式o- 在当前行下方新建一行并进入插入模式O- 在当前行上方新建一行并进入插入模式c- 删除选中字符并插入cc- 删除当前行并插入C- 删除到行尾并插入s- 删除当前/选中字符并插入,删除当前字符并进入插入模式时等价于clS- 等价于cc
-
普通模式 -> 可视模式
v- 进入字符可视模式V- 进入行可视模式Ctrl+v- 进入块可视模式
-
普通模式 -> 命令行模式
:- 进入命令行模式- 执行外部命令(原生)
:!<cmd>- 执行shell命令:r !<cmd>- 插入命令输出:r <file>- 插入文件内容
- 选项设置(原生)
:set all- 查看所有选项:set <option>- 开启选项:set no<option>- 关闭选项:set <option>?- 查看选项值:set <option>=<value>- 设置选项值
-
其余模式 -> 普通模式
ESC- 返回普通模式
移动操作
基本移动
j- 下移J- 将两行文本连接成一行k- 上移l- 右移h- 左移w- 移动到下一个词开头W- 移动到下一词开头(以空格划分词)e- 移动到下一个词末尾E- 移动到下一个词末尾(以空格划分词)b- 移动到上一个词开头B- 移动到上一个词开头(以空格划分词)
行内移动
0- 移动到行首$- 移动到行尾^- 移动到行首第一个非空白字符%- 移动到配对的字符处f<char>- 移动到当前行下一个<char>字符F<char>- 移动到当前行上一个<char>字符t<char>- 移动到当前行下一个<char>字符前T<char>- 移动到当前行上一个<char>字符后;- 重复上次f/F/t/T命令,- 反向重复上次f/F/t/T命令- 折行内移动
gj- 移动折行视觉上的下一行gk- 移动到折行视觉上的上一行g0- 移动到折行视觉上的开头g$- 移动到折行视觉上的末尾g^- 移动到折行视觉上的第一个非空字符
跨行移动
gg- 移动到文件开头g,- 移动到最近一次编辑位置(原生)G- 移动到文件末尾<num>G- 移动到指定行号,是:<num>的快捷键H- 移动到屏幕顶部M- 移动到屏幕中间L- 移动到屏幕底部}- 移动到下一个段落{- 移动到上一个段落]]- 移动到下一个函数/代码块[[- 移动到上一个函数/代码块
视图调整
Ctrl+y- 向上一行Ctrl+e- 向下一行Ctrl+f- 向下翻页Ctrl+b- 向上翻页Ctrl+u- 向上半页Ctrl+d- 向下半页zz- 聚焦光标
标记定位
m<letter>- 设置标记'<letter>- 跳转到标记行首:marks- 查看当前文件所有标记:delmarks <letter>- 删除对应标记
编辑操作
文本缩进
>>- 普通模式下向右缩进当前行>- 可视模式下向右缩进当前行<<- 普通模式下向左缩进当前行<- 可视模式下向左缩进当前行
文本折叠(原生)
zf- 对选中行创建折叠zd- 删除选中行的折叠zo- 打开折叠zc- 关闭折叠zj- 移动到下一个折叠zk- 移动到上一个折叠:mkview- 保存折叠:loadview- 加载折叠
文本剪切
x- 剪切当前字符,等价于dlX- 剪切前一个字符d- 剪切选定内容dd- 普通模式下剪切当前行D- 剪切到当前行结尾
复制粘贴
y- 复制选中内容yy- 普通模式下复制整行Y- 等价于yy(历史原因不是复制到行尾)p- 在光标后粘贴P- 在光标前粘贴"<reg>y- 复制到指定寄存器"<reg>p- 从指定寄存器粘贴
重复、撤销&重做
.- 重复上次编辑操作u- 撤销Ctrl+r- 重做
查找替换
/<pattern>- 向下查找<pattern>?<pattern>- 向上查找<pattern>n- 重复上次查找N- 反向重复上次查找u/U- 切换选中的文本为小写/大写~- 切换当前字符大小写- 替换命令,其中分隔符可以是
/、.或|:s|old|new- 替换当前行第一个匹配:s|old|new|g- 替换当前行所有匹配:'<,'>s|old|new|g- 替换当前选中行所有匹配:'<,'>s|old|new|gc- 交互式替换当前选中行匹配:%s|old|new|g- 替换整个文件所有匹配:%s|old|new|gc- 交互式替换整个文件匹配
批量操作
组合命令
- 重复操作:
<num>+<operation>3j- 向下移动3行5dd- 删除5行10x- 删除10个字符2p- 粘贴2次
- 文本对象操作:
<operator>+<number>+<i/a>+<文本对象>,其中常见的文本对象有单词w,句子s,段落p,引号"/',括号()/[]/{}/<>,标签tdaw- 删除一个单词(包括周围空格)d2w- 删除两个单词di(- 删除括号内内容ci"- 修改引号内内容yit- 复制HTML标签内容
宏&寄存器
q<reg>- 开始录制到寄存器q- 停止录制@<reg>- 执行寄存器中的宏@@- 重复上次执行的宏"<reg>- 指定寄存器:reg- 查看寄存器内容:reg <reg>- 查看特定寄存器内容
文件操作
信息统计
Ctrl+g- 显示光标位置状态(原生)
保存退出
:w- 保存文件:w <file>- 另存为:x- 保存并退出,是:wq的快捷键:q- 退出:q!- 强制退出不保存
文件跳转
:e- 创建缓存文件(原生)tab- 提示与补全当前目录下的文件(夹),左右选择当前目录下的文件,上下选择上/下一级目录:ls- 查看缓存文件:b+<编号>- 切换缓存文件:bp/bn- 上下切换缓存文件:bd- 删除当前缓存文件:<编号>+bd- 删除对应编号缓存文件
Ctrl+o- 跳转到上一个文件中Ctrl+i- 跳转到下一个文件中gd- 跳转到局部定义gD- 跳转到全局定义Ctrl+z- 挂起vim,返回终端中(通过在终端中用fg命令返回)- 当有多个任务被挂起,通过
jobs在终端查看任务编号n - 通过
fg %n返回
- 当有多个任务被挂起,通过
窗口分割(原生)
:vs- 垂直分割窗口:sp- 水平分割窗口Ctrl+w h/j/k/l- 在窗口间移动Ctrl+w w- 切换到下一个窗口Ctrl+w c- 关闭当前窗口Ctrl+w o- 关闭其他窗口Ctrl+w r- 交换窗口位置- 窗口宽度/高度调整
Ctrl+w >- 增加窗口宽度Ctrl+w <- 减少窗口宽度Ctrl+w +- 增加窗口高度Ctrl+w -- 减少窗口高度
- 窗口宽度/高度最大化/回归默认
Ctrl+w |- 最大化当前窗口宽度Ctrl+w _- 最大化当前窗口高度Ctrl+w =- 均衡窗口大小
标签页管理(原生)
:tabe <file>- 新建标签页:tabc- 关闭当前标签页:tabo- 关闭其他标签页gt- 下一个标签页gT- 上一个标签页ngt- 切换到第n个标签页:a- 全选所有标签页
Vim配置
打开文件时,所有配置都会在默认配置的基础上执行。而在配置文件中用:so的时候,则是在当前配置的基础上执行。
基本配置
vimscript
" 设置行号
set number
" 设置<leader>
nnoremap <Space> <Nop>
let mapleader = " "
" 在视觉行移动
nnoremap j gj
nnoremap k gk
nnoremap 0 g0
nnoremap $ g$
nnoremap ^ g^
" 让复制粘贴使用系统剪切板
vnoremap y "+y
vnoremap x "+x
nnoremap p "+p
nnoremap <leader>p ""p
" 全选
nnoremap <C-a> ggVG
" 保存
nnoremap <C-s> :w<CR>
" 窗口间移动
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" 取消高亮
nnoremap <silent><Esc> :nohl<CR>
" 消除^M
nnoremap <C-m> :%s.\r..g<CR>