注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎
Vim命令速查表
个人Vim命令速查表。
vim-cheatsheet | Vim官网 | Github | Vim中文文档
光标移动
注:一般模式下,任意一个动作都可以重复。
1 | h # 光标左移,同 <Left> 键 |
插入模式
1 | i # 在光标处进入插入模式 |
插入模式的命令
注:由 i, I, a, A, o, O 等命令进入插入模式
1 | <Up> # 光标向上移动 |
自动补全
在插入模式下,最常用的补全
1 | Ctrl+n # 插入模式下文字自动补全 |
智能补全
1 | Ctrl+X # 进入补全模式 |
文本编辑
1 | r # 替换当前字符 |
复制粘贴
copy 命令的格式为:
1 | :[range]copy{address} |
参数说明:
- [range] 表示要复制的行范围,其中copy可缩写为 :co 或 :t
- {address} 表示复制的目标位置,这两个参数都可以缺省,用于表示Vim光标所在当前行。
例如,:5copy. 表示复制Vim当前打开的文件的第 5 行到当前行 (用 . 表示),即为第 5 行创建一份副本,并放到当前行下方。
下标列出了使用 copy 命令的缩写形式 t 进行文件复制的一些实例及用途,用于理解复制命令 copy 的用途。
1 | :3,5t. # 把第 3 行到第 5 行的内容复制到当前行下方 |
常用复制粘贴命令:
1 | p # 粘贴到光标后 |
文本编辑、复制粘贴中的内容可以简单总结为:
1 | ci'、ci"、ci(、ci[、ci{、ci< # 分别更改这些配对标点符号中的文本内容 |
cit、dit、yit、vit,分别操作一对标签之间的内容,编辑html、xml很好用!
另外,如果把上面的 i 改成 a 可以同时操作配对标点和配对标点内的内容。
移动文本
1 | :[range]move{address} |
参数说明:
- [range] 表示要移动的行范围
- {address} 表示移动的目标位置,这两个参数都可以缺省
例如:1
2
3:m+1 # 下移1行
:m-2 # 上移1行
:8,10m2 # 把当前打开文件的第8~10行内容移动到第 2 行下方
文本对象
1 | $ # 到行末 |
撤销与恢复
1 | u # 撤销命令可以组合,例如Nu N是任意整数,表示撤销N步操作,下同 |
查找替换
一般模式下的查找命令:
1 | /pattern # 从光标处向文件尾搜索 pattern |
一般模式下的替换命令:
1 | :[range]s[ubstitute]/{pattern}/{string}/[flags] |
参数说明:
- pattern:就是要被替换掉的字串,可以用 regexp 來表示
- string:將 pattern 由 string 所取代
- [range]:有以下一些取值:
[range]取值 | 含义 |
---|---|
无 | 默认光标所在行 |
. | 光标所在当前行 |
N | 第 N 行 |
$ | 最后一行 |
‘a | 标记 a 所在的行(之前要用 ma 做过标记) |
$-1 | 倒数第二行,可以对某一行加减某个数值获得确定的某行 |
1,10 | 第1~10行 |
1,$ | 第一行到最后一行 |
1,. | 第一行到当前行 |
.,$ | 当前行到最后一行 |
‘a,’b | 标记 a 所在的行 到 标记 b 所在的行(之前要用 ma、mb 做过标记) |
% | 所有行(和 1,$ 等价) |
?str? | 从当前位置向上搜索,找到第一个str的行(str可以是正则) |
/str/ | 从当前位置向下搜索,找到第一个str的行(str可以是正则) |
注意,上面的所有用于range的表示方法都可以通过 +、- 操作来设置相对偏移量。
- [flags]有以下一些取值:
[flags]取值 | 含义 |
---|---|
g | 对指定范围内的所有匹配项(global)进行替换 |
c | 在替换前请求用户进行确认(confirm) |
e | 忽略执行过程中的错误 |
i | 不区分大小写 |
无 | 只在指定范围内的第一个匹配项进行替换 |
举例:
1 | :s/p1/p2/g # 将当前行中全替换p1为p2 |
可视模式
注:Vim 可视模式下可以选择一块编辑区域,然后对选中的文件内容执行插入、删除、替换、改变大小写等操作。!
1 | v # 切换到面向字符的可视模式 |
此外: Vim normal 命令可以在命令行模式执行普通模式下的命令,当 normal 命令与 Vim 可视化模式结合时,只需很少的操作就能完成大量重复性工作。
注释命令
多行注释1
2
3Ctrl+v # 进入命令行模式,按Ctrl + v进入可视模式,然后按j, 或者k选中多行,把需要注释的行标记起来
I # 按大写字母I,再插入注释符,例如#、//
esc # 按esc键就会全部注释了
取消多行注释
1 | Ctrl+v # 进入命令行模式,按Ctrl + v进入可视模式,按字母l横向选中列的个数,例如#、//(需要选中2列) |
复杂注释
1 | :起始行号,结束行号s/^/注释符/g(注意冒号) # 在指定的行首添加注释 |
位置跳转
1 | Ctrl+O # 跳转到上一个位置 |
文件操作
1 | :w # 保存文件(会修改文件的时间戳) |
打开文件
1 | vim filename # 打开或新建文件,并将光标置于第一行首 |
已打开文件操作
1 | :ls # 查案缓存列表 |
窗口操作
1 | :sp <filename> # 上下切分窗口并在新窗口打开文件 filename |
标签页
1 | :tabs # 显示所有标签页 |
书签
1 | :marks # 显示所有书签 |
帮助信息
1 | :h tutor # 入门文档 |
外部命令
1 | :!command # 执行一次性shell命令,如下命令::!pwd |
Quickfix 窗口
1 | :copen # 打开 quickfix 窗口(查看编译,grep等信息) |
拼写检查
1 | :set spell # 打开拼写检查 |
代码折叠
1 | za # 切换折叠 |
文档加密解密
文档加密
加密方式打开文件时,并在屏幕左下角提示输入密码两次才可进行操作,保存文件退出后必须输入正常密码才能正确打开文件,否则会显示乱码。
1 | vim -x file_name # 输入加密密码 -> 确认密码! 注意:不修改内容也要保存。:wq,不然密码设定不会生效。 |
文档解密
1 | :X # 命令行模式下,提示输入密码,不输入而是按 Enter。注意:不修改内容也要保存。:wq,不然解密设定不会生效。 |
宏录制
1 | qa # 开始录制名字为 a 的宏 |
其他命令
1 | Ctrl+X Ctrl+E # 插入模式下向上滚屏 |
查看命令历史
命令行模式下:1
2:history # 查看所有命令行模式下输入的命令历史
:history search或 / 或? # 查看搜索历史
普通模式下:1
2
3q/ # 查看使用/输入的搜索历史
q? # 查看使用?输入的搜索历史
q: # 查看命令行历史
寄存器
查看寄存器值
1 | :reg # 查看所有寄存器值 |
调取寄存器值
1 | "{register_name} # 普通模式下调取寄存器值 |
Vim寄存器分类
名称 | 引用方式 | 说明 |
---|---|---|
无名寄存器 | “” | 默认寄存器,所有的复制和修改操作(x、s、d、c、y)都会将该数据复制到无名寄存器 |
字母寄存器 | “a - “z 或 “A - “Z | {register_name}只能是一位的26个英文字母,从a-z,A-Z寄存器内容将会合并到对应小写字母内容后边 |
复制专用寄存器 | “0(数字0) | 仅当使用复制操作(y)时,该数据将会同时被复制到无名寄存器和复制专用寄存器 |
逐级临时缓存寄存器 | “1 - “9 | 所有不带范围(‘(’,‘)’,‘{’,‘}’)、操作涉及1行以上的删除修改操作(x、s、d、c)的数据都会复制到逐级临时缓存寄存器,并在新的数据加入时,逐级先后推移。1的数据复制到2,2的复制到3,最后的9寄存器内容将会被删除 |
黑洞寄存器 | “_ | 几乎所有的操作涉及的数据都会被复制到寄存器,如果想让操作的数据不经过寄存器,可以指定黑洞寄存器,数据到该寄存器就会消失掉,不能显示,也不存在 |
系统剪切板 | “+ 或”* | 与Vim外部的GUI交互数据时,需要使用专用的系统剪切板 |
表达式寄存器 | “= | 所有寄存器里最特殊的一个,用于计算表达式。输入完该寄存器应用后,会在命令行里提示“=”,按需输入表达式,结果将会显示到光标处 |
其他寄存器 |
Vim设置
编辑Vim配置文件:
1 | :edit $MYVIMRC # 在Vim的命令模式下使用该命令打开 vim 配置文件 |
Vim配置说明:
注:Vim配置可以在命令模式下单个设置,只在当前窗口生效!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30syntax # 列出已经定义的语法项
syntax clear # 清除已定义的语法规则
syntax on # 允许语法高亮
syntax off # 禁止语法高亮
set history=200 # 记录 200 条历史命令
set bs=? # 设置BS键模式,现代编辑器为 :set bs=eol,start,indent
set sw=4 # 设置缩进宽度为 4
set ts=4 # 设置制表符宽度为 4
set noet # 设置不展开 tab 成空格
set et # 设置展开 tab 成空格
set winaltkeys=no # 设置 GVim 下正常捕获 ALT 键
set nowrap # 关闭自动换行
set ttimeout # 允许终端按键检测超时(终端下功能键为一串ESC开头的扫描码)
set ttm=100 # 设置终端按键检测超时为100毫秒
set term=? # 设置终端类型,比如常见的 xterm
set ignorecase # 设置搜索是否忽略大小写
set smartcase # 智能大小写,默认忽略大小写,除非搜索内容里包含大写字母
set list # 设置显示制表符和换行符
set nu # 设置显示行号,禁止显示行号可以用 :set nonu
set number # 设置显示行号,禁止显示行号可以用 :set nonumber
set relativenumber # 设置显示相对行号(其他行与当前行的距离)
set paste # 进入粘贴模式(粘贴时禁用缩进等影响格式的东西)
set nopaste # 结束粘贴模式
set spell # 允许拼写检查
set hlsearch # 设置高亮查找
set ruler # 总是显示光标位置
set nocompatible # 设置不兼容原始 vi 模式(必须设置在最开头)
set incsearch # 查找输入时动态增量显示查找结果
set insertmode # Vim 始终处于插入模式下,使用 Ctrl+o 临时执行命令
set all # 列出所有选项设置情况
Vim插件
插件 - vim-commentary
vim-commentary:批量注释工具, 可以注释多行和去除多行注释。
1 | gcc # 注释当前行 |
插件 - nerdtree
nerdtree:该插件用于列出当前路径的目录树。
1 | ? # 快速帮助文档 |
插件 - asyncrun.vim
1 | :AsyncRun ls # 异步运行命令 ls 结果输出到 quickfix 使用 :copen 查看 |
Vim模式
1 | 普通模式 # 按 Esc 或 Ctrl+[ 进入,左下角显示文件名或为空 |
网络资源
- 最新版本 https://github.com/vim/vim
- Windows 最新版 https://github.com/vim/vim-win32-installer/releases
- 插件浏览 http://vimawesome.com
- 正确设置ALT/BS键 http://www.skywind.me/blog/archives/2021
- 视频教程 http://vimcasts.org/
- 中文帮助 http://vimcdoc.sourceforge.net/doc/help.html
- 中文版入门到精通 https://github.com/wsdjeg/vim-galore-zh_cn
- 五分钟脚本入门 http://www.skywind.me/blog/archives/2193
- 脚本精通 http://learnvimscriptthehardway.stevelosh.com/
- 十六年使用经验 http://zzapper.co.uk/vimtips.html
- 配色方案 http://vimcolors.com/
TIPS
- 永远不要用 Ctrl+C 代替
完全不同的含义,容易错误中断运行的后台脚本 - 很多人使用 Ctrl+[ 代替
,左手小指 Ctrl,右手小指 [ 熟练后很方便 - 某些终端中使用 Vim 8 内嵌终端如看到奇怪字符,使用 :set t_RS= t_SH= 解决
- 某些终端中使用 NeoVim 如看到奇怪字符,使用 :set guicursor= 解决
- 多使用 ciw, ci[, ci”, ci( 以及 diw, di[, di”, di( 命令来快速改写/删除文本
- 在行内左右移动光标时,多使用w b e或W B E,而不是h l或方向键,这样会快很多
- Shift 相当于移动加速键, w b e 移动光标很慢,但是 W B E 走的很快
- 自己要善于总结新技巧,比如移动到行首非空字符时用 0w 命令比 ^ 命令更容易输入
- 在空白行使用 dip 命令可以删除所有临近的空白行,viw 可以选择连续空白
- 缩进时使用 >8j >}
ap =i} == 会方便很多 - 插入模式下,当你发现一个单词写错了,应该多用 Ctrl+W 这比
快 - y d c 命令可以很好结合 f t 和 /X 比如 dt) 和 y/end
- c d x 命令会自动填充寄存器 “1 到 “9 , y 命令会自动填充 “0 寄存器
- 用 v 命令选择文本时,可以用 o 掉头选择,有时很有用
- 写文章时,可以写一段代码块,然后选中后执行 :!python 代码块就会被替换成结果
- 搜索后经常使用 :nohl 来消除高亮,使用很频繁,可以 map 到
上 - 搜索时可以用 Ctrl+R Ctrl+W 插入光标下的单词,命令模式也能这么用
- 映射按键时,应该默认使用 noremap ,只有特别需要的时候使用 map
- 当你觉得做某事很低效时,你应该停下来,然后思考正确的高效方式来完成
- 用 y 复制文本后,命令模式中 Ctrl+R 然后按双引号 0 可以插入之前复制内容
- Windows 下的 GVim 可以设置 set rop=type:directx,renmode:5 增强显示
书籍
Vim键盘图
参考
- https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt
- https://github.com/groenewege/vimrc/blob/master/vim_cheat_sheet.txt
- http://blog.g-design.net/post/4789778607/vim-cheat-sheet
- http://www.keyxl.com/aaa8263/290/VIM-keyboard-shortcuts.htm
- http://jmcpherson.org/editing.html
- http://www.fprintf.net/vimCheatSheet.html
- http://www.ouyaoxiazai.com/article/24/654.html
- http://bbs.it-home.org/thread-80794-1-1.html
- http://www.lpfrx.com/wp-content/uploads/2008/09/vi.jpg
- http://michael.peopleofhonoronly.com/vim/
- https://github.com/hobbestigrou/vimtips-fortune/blob/master/fortunes/vimtips
- https://github.com/glts/vim-cottidie/blob/master/autoload/cottidie/tips