目录:
1. 分屏
分屏操作使用Ctrl+w进行控制。
1.1 启动时分屏
通过-O(大写)指定垂直分屏,-o(小写)指定水平分屏。
| 1 2 3 4 5 | # 垂直分2屏幕,分别编辑file1和file2 vim -O2 file1 file2 # 水平分3屏幕,分别编辑file1、file2和file3 vim -o3 file1 file2 file3 | 
1.2 关闭分屏
| 1 2 | <C-w> c 关闭当前分屏,当若当前已是最后一个分屏则不会退出 <C-w> q 关闭当前分屏,如果只剩最后一个了,则退出Vim | 
1.3 编辑文件时增加分屏
| 1 2 3 4 | <C-w> s 水平分割当前打开的文件 :sp filename 水平分割窗口,并在新窗口打开一个新的文件。 <C-w> v 垂直分割当前打开的文件 :vsp filename 垂直分割窗口,并在新窗口打开一个新的文件。 | 
1.4 在分屏间移动光标
Vim中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+w
| 1 2 3 4 5 | <C-w> h 光标左移 <C-w> l 光标右移 <C-w> k 光标上移 <C-w> j 光标下移 <C-w> w 光标移动到下一个分屏中 | 
BTW:
移动屏幕本身也是
H, J, K, L四个键,但是移动光标是小写,移动窗体是大写。
1.5 调节屏幕尺寸
| 1 2 3 4 5 | <C-w> = 让所有窗口等大 <C-w> + 增加当前窗口高度 <C-w> - 减小当前窗口高度 <C-w> > 增加当前窗口宽度 <C-w> < 减小当前窗口宽度 | 
1.6 分屏中打开目录
在编辑文件的时候,可以使用命令在新的分屏中浏览当前文件所在目录。
| 1 2 3 4 | :He 水平分屏,在下部窗口中浏览目录 :He! 水平分屏,在上部窗口中浏览目录 :Ve 垂直分屏,在左侧窗口中浏览目录 :Ve! 垂直分屏,在右侧窗口中浏览目录 | 
1.7 分屏同步移动光标
要同步光标,注意应该先将要同步的分屏的光标移动到需要的位置,然后在多个分屏中分别执行命令:
| 1 2 | :set scb 设置同步移动 :set scb! 解开同步移动的配置 | 
1.8 Tab分屏
| 1 2 | # 同时以tab的方式打开多个文件
vim -p file1 file2 file3
 | 
其他命令:
| 1 2 3 4 5 6 | :Te                     打开新的Tab页
gt                      跳转到下一个Tab页,注意没有分号
gT                      跳转到上一个Tab页,注意没有分号
{n}gt或:tabm {n}        跳转到指定Tab页,注意没有分号,n是具体数字。
:tabs                   浏览当前所有tab页的概况
:tabclose {n}           关闭Tab页,如果后面指定了数字,那就关闭指定页,如果没有就关闭当前页
 | 
BTW
关于切换tab页,gvim使用
Ctrl+PageDown和Ctrl+PageUp来进行切换
如果你想把buffer中的文件全转成tab的话,你可以使用下面的命令:
:bufdo tab split
2. 缓冲区
用:E命令浏览目录时打开的文件都保存在缓冲区中。可以用以下命令查看缓冲区内容:

| 1 2 3 | :ls                   查看缓冲区,其中标有`%a`的一行表示当前激活状态的缓冲区。`:ls`输出如上图。
:buffer {n}           切换到指定缓冲区继续编辑文件, n代表缓冲区编号,在ls命令中能看到
:buffer {filepath}    同上,但是通过文件名切换
 | 
还可以使用以下命令快速在缓冲区间切换:
| 1 2 3 4 | :bnext 移动到下一缓冲区,缩写为`:bn` :bprevious 移动到上一缓冲区,缩写为`:bp` :blast 移动到最后一个缓冲区文件,缩写为`:bl` :bfirst 移动到第一个缓冲区文件,缩写为`:bf` | 
前面我们提到一个%a标识符,这个表示当前被激活的文件。相关的标记还有:
| 1 2 3 4 5 6 7 | – 非活动的缓冲区 a 当前被激活缓冲区 h 隐藏的缓冲区 % 当前的缓冲区 # 交换缓冲区 = 只读缓冲区 + 已经更改的缓冲区 | 
3. 关键字补全
无插件的vim也支持关键字补全,补全文本的来源是当前所编辑的文件本身。
| 1 2 | <C-n> 自动提示并补全 <C-p> 光标回到默认补全之前的位置 | 
另外还有Ctrl+x开头的补全快捷键:
| 1 2 3 4 5 6 | <C-x>和<C-D> 宏定义补齐 <C-x>和<C-]> 是Tag 补齐 <C-x>和<C-F> 是文件名 补齐 <C-x>和<C-I> 也是关键词补齐,但是关键后会有个文件名,告诉你这个关键词在哪个文件中 <C-x>和<C-V> 是表达式补齐 <C-x>和<C-L> 整个行补齐 | 
4. 移动光标
移动光标是基本操作,可以和后面的编辑命令相组合而执行。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |  h,j,k,l   左/下/上/右移动一个字符
       0   数字零,到行头
       $   到本行行尾
       %   匹配括号:() or [] or {}
       ^   到本行第一个不是blank字符的位置
      g_   到本行最后一个不是blank字符的位置
       w   移动到下一个单词开头,`W`: 移动到下一个单词(空白字符分隔)开头(word)
       e   移动到下一个单词结尾,`E`: 移动到下一个单词(空白字符分隔)结尾(end)
       b   移动到前一个单词
       G   文件最后一行
      gg   文件第一行,相当于`1G`或者`:1`
    {n}G   或者 `:{n}`: 跳转到文件第n行
    {n}e   往后移动n个单词
    f{c}   行内正向移动到下一个字符C,可以用`;`和`,`移动到上一个位置和下一个位置
    F{c}   行内反向移动到下一个字符C,可以用`;`和`,`移动到上一个位置和下一个位置
    t{c}   行内正向移动到下一个字符C的前一个字符,所以反复用`T{c}`的光标位置是不变的
    T{c}   行内反向移动到上一个字符C的后一个字符,所以反复用`T{c}`的光标位置是不变的
   <C-e>   向上滚动一行
   <C-y>   向下滚动一行
   <C-u>   向上滚动半屏
   <C-d>   向下滚动半屏
 | 
5. 单词或行编辑
| 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 30 31 32 33 34 35 36 37 |    r      replace,替换当前字符。
  gr      当前字符虚拟替换模式。该模式下的<Tab>字符会在输入第8个字符是才将<tab>替换掉。
   R      替换模式,可以替换多个字符,直到按<Esc>退出。
  gR      虚拟替换模式。该模式下的<Tab>字符会在输入第8个字符是才将<tab>替换掉。
 x/X      小写x删除光标处字符,大写X删除光标前字符
 i/I      小写i在光标前插入,大写I在行首插入
 a/A      小写a在光标后插入,大写A在行尾插入
   u      undo
<C-u>     在输入模式下执行的撤销操作
<C-r>     redo
   d      删除命令,删除后会将内容复制到剪切板。相当于剪切命令。有以下组合:
          dd   删除当前行,重复两次命令为删除当前行。
          d0   删除到行首,同样`d$`表示删除到行尾(大写`D`也表示删除到行尾)
          dw   删除光标后单词,`dW`: 剪切单词(空白字符分隔);同样还有`de`和`dE`
          db   删除光标前单词,同样`dB`会删除光标前以空白字分隔符计算的单词
           D   剪切到行尾,和`d$`相同
   c      删除并改变状态的插入模式。其中删除部分和`d`命令相同。同样有`cc`,`cw`,`cE`等等组合
   y      复制命令,有和`d`命令同样的组合
             yy   复制行,相当于 `ddP`
            nyy   复制n行
           "+yy   复制1行到操作系统剪切板
          "+nyy   复制n行到操作系统剪切板  
   p      光标后粘贴;`P`: 光标前粘贴
gU/gu     变大/小写。用法是:
           guw  会使光标所在单词变小写
           gU$  会使光标到行尾所有字符变大写
          gu3e  会使光标往后三个单词变成小写。
>>/<<     >>向右缩进当前行,<<向左缩进当前行
 2,8>     2-8行缩进,`4,6<`: 4-6行反缩进
  v/V     进入选择模式,移动光标选择多行,然后执行`>`缩进一次,执行`2>`则会缩进两次
          其中小写v为进入字符选择选择模式,大写V为行选择模式。可以按`o`切换高亮端。
<C-v>     进入列编辑模式选择需要编辑的列,例如选择后按A/I开始编辑,完成后按<esc>应用到所有列
 | 
6. 缩进
以下选项需在命令模式下使用,例如:set number表示显示行号。
| 1 2 3 4 5 6 7 8 9 10 |    (no)ai    (no)autoindent,自动缩进,即新行与当前行同等缩进
   (no)ci    (no)cindent,C语言风格的缩进
   (no)si    (no)smartindent,基于autoindent的一些改进风格
  
   ts={n}    tabstop,设置tab键长度,相当于n个空格
  sts={n}    softtabstop,开启et后,如果开启本参数,每次退格会删除n个空格
   sw={n}    shiftwidth,每层缩进的空格数
   (no)et    (no)expandtab,将tab字符展开为空格,开启后如果确实要输入tab,可以使用`<C-v><Tab>`
  (no)sta    (no)smarttab,开启后在行首按<Tab>将会sw个空格,否则加入t个空格
(no)paste    粘贴选项打开的时候,从剪切板粘贴过来的文本不会自动缩进,可以在粘贴完之后再关闭该选项
 | 
8. 折叠
代码的折叠,可以方便掌控程序的主要逻辑,也便于代码的阅读、查找。使用折叠,首先要设置折叠方式,即设置vim中fdm(foldmethod的缩写)的值,例如fdm设置为indent,即依据代码的缩进进行自动折叠。vim中有六种fdm可以设置,参考详细帮助: :help fold。常用的折叠打开、关闭操作如下:
| 1 2 3 4 5 6 7 8 | zc 折叠代码 zC 递归折叠代码 zo 取消折叠代码 zO 递归取消折叠代码 zM 折叠整个文件 zR 取消整个文件的折叠 :m,nfoldopen 折叠m,n行中的代码 :m,nfoldclose 取消m,n行代码的折叠 | 
8. 环境变量和配置项
| 1 2 3 | :echo $VIMRUNTIME 查看vim环境变量$VIMRUNTIME的值 :set fileencodings? 查看fileencodings配置项的值 :set history=200 设置history配置项的值(该值默认为20) | 
9. 其他
| 1 2 3 | :%!python -m json.tool json代码格式化 :w !sudo tee % > /dev/null 以root权限保存当前文件 :e path/to/file 打开指定文件进行编辑 |