一、常用操作
1.移动
以字(符)为单位
| 功能 | 按键 |
|---|---|
| 上 | k |
| 下 | j |
| 左 | h |
| 右 | l |
以单词为单位
| 功能 | 按键 |
|---|---|
| 前一个单词尾 | ge |
| 后一个单词首 | w |
| 本单词首(已在本词首则跳到前一单词首) | b |
| 本单词尾(已在本词尾则跳到后一单词尾) | e |
以屏幕为单位
| 功能 | 按键 |
|---|---|
| 向下翻页 | CTRL-f |
| 向上翻页 | CTRL-b |
| 向下翻半页 | CTRL-d |
| 向上翻半页 | CTRL-u |
| 向上一行 | CTRL-y |
| 向下一行 | CTRL-e |
| 光标移到屏幕上方 | H |
| 光标移到屏幕中间 | M |
| 光标移到屏幕下方 | L |
| 光标所在位置移到屏幕上方 | zt |
| 光标所在位置移到屏幕中间 | zz |
| 光标所在位置移到屏幕下方 | zb |
行号
| 功能 | 按键 |
|---|---|
| 跳到第 num 行 | :num 或 numG 或 numgg |
文件
| 功能 | 按键 |
|---|---|
| 跳到文件头 | gg |
| 跳到文件尾 | G |
2.编辑
复制
| 功能 | 按键 |
|---|---|
| 复制光标所在单词 | yiw |
| 复制光标所在行 | yy |
粘贴
| 功能 | 按键 |
|---|---|
| 在光标之后粘贴 | p |
| 在光标之前粘贴 | P |
剪切
| 功能 | 按键 |
|---|---|
| 剪切选中区域 | d |
| 剪切光标所在行 | dd |
替换
| 功能 | 按键 |
|---|---|
| 将全文中的 str1 替换为 str1 | :%s/str1/str2/g |
| 将 1 到 5 行中的 str1 替换为 str2 | :1,5/str1/str2/g |
大小写
| 功能 | 按键 |
|---|---|
| 将选中内容大小写互换 | ~ |
| 将选中内容全转为小写 | gu |
| 将选中内容全转为大写 | gU |
| 将当前行变成小写 | guu |
| 将当前行变成大写 | gUU |
3.选择
| 功能 | 按键 |
|---|---|
| 选中上一次选择的区域 | gv |
| 选中括号内区域 | vi{、vi[、vi( |
搜索
| 功能 | 按键 |
|---|---|
| 向下查找字符串 | /str |
| 向上查找字符串 | ?str |
| 查找下一个 | n |
| 查找上一个 | N |
| 向下查找光标所在单词 | * |
| 向下查找光标所在单词 | # |
正则表达式
| 功能 | 按键 |
|---|---|
| 匹配单词左边界 | \< |
| 匹配单词右边界 | \> |
| 去重 | :g/^\(.*\)$\n\1/d |
常用
| 功能 | 按键 |
|---|---|
| 删除空行 | :g/^$/d |
| 撤销/UNDO | u |
| 重做/REDO | C-r |
| 统计行/单词/字符/字节数 | g C-g |
全局
| 功能 | 按键 |
|---|---|
| 退出 | :q |
| 强制执行 | ! |
| 执行外部命令 | :! |
3.文件操作
| 功能 | 按键 |
|---|---|
| 打开 | :e |
| 打开文件对话框 | :bro e |
| 保存 | :w |
| 另存为对话框 | :bro w |
| 查看历史文件列表 | :ol |
| 查看并打开历史文件 | :bro ol |
| 重命名当前文件 | :f filename |
vimdiff
| 功能 | 按键 |
|---|---|
| 移动到上一个不同处 | [c |
| 移动到下一个不同处 | ]c |
| 该差异点使用当前文件的 | dp |
| 该差异点使用其它文件的 | do |
| 手动刷新重新比较 | :diffupdate |
Buffer
| 功能 | 按键 |
|---|---|
| 查看 Buffer 列表 | :ls |
| 转到 Buffer 列表中的下一个 Buffer | :bn |
| 转到 Buffer 列表中的上一个 Buffer | :bp |
| 转到 Buffer 列表中的 num 号 Buffer | :bnum |
| 你之前待过的一个 Buffer | :b# |
| 从 Buffer 列表中删除 num 号 Buffer | :bdnum |
4.组合命令
可以使用 | 来组合命令,比如 cmd1 | cmd2。
代码
| 功能 | 按键 |
|---|---|
| 格式化代码 | gg=G |
| 去除 1-20 行首的行号 | :1,20s/^\\s\*[0-9]\*\\s\*//g |
| 展开全部折叠 | zR |
| 展开当前层级折叠 | zr |
| 全部折叠 | zM |
| 当前层级折叠 | zm |
| 切换折叠/展开 | za |
| 递归折叠/展开当前大区块 | zA |
| 折叠当前区块 | zc |
| 递归折叠当前大区块 | zC |
| 展开当前区块 | zo |
| 递归展开当前大区块 | zO |
| 格式化 json 数据 | :%!python -m json.tool |
| 缩进当前行 | >> |
| 反缩进当前行 | << |
5.插件
CtrlP
基础按键 C-p
| 功能 | 按键 |
|---|---|
| 刷新列表 | F5 |
| 切换文件/缓冲区/MRU | C-f/b |
| 切换全路径搜索/文件名搜索 | C-d |
| 切换正则表达式模式 | C-r |
| 上/下一个选项 | C-k/j |
| 在新标签/垂直分割/水平分割打开文件 | C-t/v/x |
| 历史选择记录的上/下一条 | C-p/n |
| 创建文件和它的父路径 | C-y |
| 标记并打开多个文件 | C-z C-o |
| 退出 CtrlP | C-c |
LeaderF
| 功能 | 按键 |
|---|---|
| 打开文件 | Leader-f |
| 打开缓冲区 | Leader-b |
| 打开 MRU | Leader-m(自定义的) |
| 退出 | C-c |
| 切换模糊查找和正则查找 | C-r |
| 粘贴 | C-v |
| 清空输入 | C-u |
| 上/下一个选项 | C-k/j |
| 在新标签/垂直分割/水平分割打开文件 | C-t/]/v |
| 刷新列表 | F5 |
vim-table-mode
| 功能 | 按键 |
|---|---|
| 删除列 | Leader-tdc |
| 删除行 | Leader-tdd |
| 重新格式化表格 | Leader-tr |
二、高级应用:
1. vim 中执行 shell 命令
vim 中执行 shell 命令,有以下几种形式:
:!command
不退出 vim,并执行 shell 命令 command,将命令输出显示在 vim 的命令区域,不会改变当前编辑的文件的内容
例如
:!ls -l
特别的可以运行:!bash来启动一个 bash shell 并执行命令,不需要退出 vim
:r !command
将 shell 命令 command 的结果插入到当前行的下一行
例如
:r !date #读取系统时间并插入到当前行的下一行。
:起始行号,结束行号 !command
将起始行号和结束行号指定的范围中的内容输入到 shell 命令 command 处理,并将处理结果替换起始行号和结束行号指定的范围中的内容
例如
:62,72 !sort #将 62 行到 72 行的内容进行排序
可以只指定起始行,例如
:62 !tr [a-z] [A-Z] #将62行的小写字母转为大写字母
当前光标所在行,除可以指定行号外,也可以用.表示,例如
:. !tr [a-z] [A-Z] #将当前行的小写转为大写
:起始行号,结束行号 w !command
将起始行号和结束行号所指定的范围的内容作为命令 command 的输入。不会改变当前编辑的文件的内容
例如
:62,72 w !sort #将62行到72行的内容进行排序,但排序的结果并不会直接输出到当前编辑的文件中,
#而是显示在 vim 敲命令的区域
特殊的可以下面这么用
:62 w !bash #将会把第62行的内容作为 bash 命令来执行并显示结果,而且不会改变当前编辑的文件的内容
同样的:. w !bash,将当前行的内容作为 bash 命令来执行
例如52行内容为ls -l
那么输入:52 w !bash就跟执行!ls -l是一样的效果,如果你用的 shell 是 bash shell
如果输入的是:52 !bash,那么会把第52行的内容也就是ls -l作为命令执行,
同时命令的输出结果会替换第52行的内容,注意其中的区别。
2. vim copy 指定行之间的文本
#例:复制第5行 到 第10行 的内容到 第20行
:5,10 co 20