Vim FAQ

Posted by KC on May 16, 2016

目录:

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

  1. 关于切换tab页,gvim使用Ctrl+PageDownCtrl+PageUp来进行切换

  2. 如果你想把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                 打开指定文件进行编辑