VIM User Manual第一部分Getting Started整理笔记

来源:互联网 发布:区域生长算法 python 编辑:程序博客网 时间:2024/06/16 06:31

说明:笔记内容与原手册编排顺序并不相同,完全是按照个人组织,对VIM的常用操作做一个整体上的归纳,很多细节部分很难详细涉及到,如有不解之处,请移至官方数据手册http://vimdoc.sf.net。

注意涉及到指令部分,都会用不同颜色加以区分开来,且所有指令都是用 Courier New 字体,举例如下:

(1)终端指令:

vim filename

(2)命令行模式(Command-line Mode)指令:

:set showmode

(3)普通模式(Normal Mode)指令:

"*yy

其中(2)(3)指令只有在打开VIM的时候才能生效。另外还有一点需要注意的是,指令区分大小写!当需要用到辅助键的时候,均用大写表示,如CTRL-W,表示按住Ctrl键和w键(这个w直接按住就可以,不要配合Shift键按下)

指令中由中括号括起来的部分为可选部分

==========================================分割线==========================================

一、如何获取帮助

这个很关键,VIM的指令众多,哪怕是记住其中的几成也是相当困难的一件事情,因此首先要学会使用帮助手册,这一部分跳过,之所以列在这里只是希望引起足够的重视,常用帮助手册使用方法请参考官方User Manual 02.8 How to get help

:help 02.8

详细使用方法使用指令

:help :help


二、移动和滚动

1. 全局移动操作:

h, j, k, l分别对应上下左右,这四个按键适用于所有的移动操作


2. 光标移动操作:

(1)w, b, W, B

 移动到下一个word的开头,上一次word,W 下一个WORD开头,上一个WORD

(2)e, ge, E, gE

 移动到下一个word的结尾, ge 上一次word,E 下一个WORD结尾,gE 上一个WORD

(3)f, F, t, T

需要配合单一字符使用,且只能在光标所在行有效,移动到下一个指定字符,F 上一个指定字符,t 移动到下一个指定字符的前一个字符,T 移动到上一次指定字符的后一个字符。

(4)0, ^, $

移动到行的最开头,移动到行第一个非空字符处,移动到行末

其中(1)(2)(3)可以配合数字键使用,表示移动相应的单元长度,操作为{number}{command}。另外(1)(2)可跨行移动。

说明:word和WORD为不同概念,默认情况下word包括字母、数字、下划线和可打印的拉丁字符,而WORD是由空格分开的所有非空字符。word定义的范围可通过 iskeyword 选项来查看,指令

:set iskeyword

会打印出默认范围是 iskeyword=@,48−57,_,192−255,@代表所有字母,48-57是数字0-9,192-255是可打印的拉丁字符。该范围可自行修改,如

:set iskeyword+=-

:set iskeyword-=-

分别将 - 字符加入到word范围或是从该范围中删除。


3. 文本移动操作:

文本移动其实是一个复合操作,包括文本的剪切和拷贝,然后再粘贴。

(1)剪切(x, X, d, D, dd

 删除光标下的一个字符,删除光标前的字符,删除操作,不可单独使用,需要配合motion,删除光标至行末,dd 删除整行。

(2)复制(y, Y, yy

 复制操作,不可单独使用,需要配合motion,复制整行,yy 同 Y。

(3)粘贴(p, P

粘贴文本在光标后,在光标前

(4)连接行(J

将两行连接在一起

以上操作均可在前面配合数字使用。

(5)其他操作说明:

operator-motion(操作符与动作)

对于 和 这样不能单独使用,需要配合motion(表示移动的指令)来说的指令,称之为operator(操作符),这种模式叫operator-motion pattern,所有的operator(操作符)都必须配合motion来使用,其相应功能影响的范围就是从当前光标处开始到 motion 到达的地方,另外这个模式也可以配合数字使用,类似于形式

[number]{operator}[number]{motion}

Text object(文本对象)

我们经常碰到需要选中整个单词或者句子而不受光标所在位置的影响时,文本对象就起到作用了,它的影响范围是光标所在的整个单词或者整个句子等等。文本对象通过 a 或者 加上对象来选中,比如 aw 表示光标所处单词,as 表示光标所处句子,i 和 a 的区别在于 a 会选中对象旁边的空白字符,而 i 则只选中对象本身(可以通过 vis 和 vas 来进行效果对比, v 的作用是进入 Visual mode)。举例说明:

daw       删除光标所在单词

yis       复制光标所在句子

除了 w 和 s 以外,还有其他一些对象,可以通过

:help object

来查看所有对象列表。

Clipboard(剪切板)

单纯使用 d 和 y 的文本只能在当前文本中使用,如果要放在其他地方,就要使用到剪切板,方法是在 和 y 操作符前加上 “*,粘贴的时候也在 p或者 P 前加上 “* 就可以了,如

“*yy    复制当前行到剪切板

“*p     粘贴剪切板的内容

* 是可以换成 + 的,这时候内容是保留在VIM的 real clipboard (真正的剪切板),VIM是有两个剪切板的,详细内容不在这里叙述,可查看User Manual 的 09.3 Using the clipboard


4. 窗口滚动操作

(1)向上滚动CTRL-U 半屏滚动,CTRL-Y 单行滚动,CTRL-B 全屏滚动

(2)向下滚动:CTRL-D 半屏滚动,CTRL-E 单行滚动,CTRL-F 全屏滚动

(3)根据光标所处行滚动:zt 滚动当前行到窗口上方,zz 到窗口中间,zb 到窗口下方。


5. 跳转:

jump(跳转)有别于普通的光标移动操作,它一般是指移动到本行以外的其他地方,但是像 j, k 这样的操作不能算跳转,即使前面加上数字移动到很远的地方,而像查找中使用 将光标的位置改变,即使是同一行,也是一种跳转。跳转操作会记录光标的位置,这些位置可以通过 CTRL-I (或 <Tab>)和 CTRL-O 向上或向下寻找。

寻找mark(标记)也是一种跳转。

标记用来记录当前光标所在行的位置,通过 指令标记,单引号  或者重音符 ` 寻找标记,如 ms 将当前行标记为 s, ’s 跳转到标记为 s 的行了,标记除了一些特殊的以外(如 ’’表示跳转到上一次的位置),一般使用26个字母,小写的标记只对该文本有效,而大写的标记则是全局的,可以在多文件同时打开的情况下进行跳转,关于标记的详细内容可查看

:help mark-motions

(注意学会使用CTRL-D,如上条指令输入到 :help mark 时,可以按CTRL-D,就可以看到所有含有 mark 的帮助文档)

(1)gg, G

 gg 跳转到文件开头,到文件末尾,前面配合数字表示跳转到相应行

(2)H, M, L

 H 跳转到窗口最上方,M 到窗口中间,L 到窗口最下方,注意区别 zt, zz, zb

(3)[number]%

跳转到文件指定百分比的位置

(4)'{mark}, `{mark}

跳转到标记处


三、窗口操作

(1)分割窗口

:split      横向分割窗口,并在新窗口中打开当前文件,如果指定文件名,则打开指定文件

:vsplit     纵向分割窗口,并在新窗口中打开当前文件,如果指定文件名,则打开指定文件

:new        横向分割窗口,并在新窗口中打开新文件。

:vnew       纵向分割窗口,并在新窗口中打开新文件。

这四条指令都可以在前面加上一个数字,指定新打开窗口的高度或宽度值,另外 可以单独从纵向分割中独立开来,变成 :vertical

除此之外,还可以在打开多文件之前使用分割窗口的方式打开

vim -o file1 file2 file3      横向分割窗口打开三个文件

vim -O file1 file2 file3      纵向分割窗口打开三个文件

另外,下面文件操作中提到的 vimdiff 也是一种分割窗口打开文件的方式,默认为纵向分割

:close      关闭当前窗口,除此之外,任何关闭vim的方式都可以用来关闭当前窗口

:only       只保留当前窗口,关闭其他所有窗口

:qall[!], :wall, :wqall       关闭或(和)保存所有窗口并退出(:wall只保存所有,不退出)


横向分割或纵向分割的默认行为是在当前窗口的上方或是左侧分割,可以通过 splitbelow 或 splitright 选项来改变(这两个是布尔变量,通过 set 或者 set no 设定,没有splittop 或者 splitleft 选项)

:set splitbelow       在当前窗口下方横向分割

:set nosplitright     在当前窗口左侧横向分割

(2)窗口切换

CTRL-W CTRL-W      在窗口之间切换

CTRL-W h/j/k/l     切换到左 / 上 / 下 / 右的窗口

CTRL-W t/b         切换到顶上 / 最底的窗口

:leftabove, :aboveleft, :rightbelow, :belowright, :topleft, :botright     切换到相应位置的窗口

(3)窗口移动

CTRL-W H/J/K/L        移动当前窗口到最左 / 最上 / 最下 / 最右的位置

(4)窗口调整

[number] CTRL-W +     窗口增加指定大小值

[number] CTRL-W -     窗口减小指定大小值

不指定大小,则默认改变值为1

{height} CTRL-W _     指定横向窗口的高度,如果不指定,则尽可能增大,注意最后是一个下划线 _ (对纵向窗口的效果可自行试试看)

:vertical all         纵向显示所有窗口

(5)标签页

VIM除了支持多窗口以外,还可以使用Tab page(标签页)的形式。方法是在打开(或分割)新窗口的指令前加上 tab 即可(除某些指令以外),如:

:tab help tab-page

以标签页的形式打开标签页的帮助手册,多标签页的时候,未选中的标签页下方都会有一条白线,所有标签页的最右边有一个 X,可以通过鼠标点击来关闭当前标签页,:tabonly 仅保留当前标签页,详细使用方法使用上面这条指令查看。


四、文件操作

1. 单文件操作:

(1)文本的插入(i, I, a, A, o, O

光标前插入,I 光标前第一个非空字符插入, a 光标后插入, A 行末插入, o 光标所在行下方开辟新行插入,O 光标所在行上方开辟新行插入

(2)文本的修改(c, C, cc

c 操作符,配合motion使用,删除选中对象并插入, C 删除光标到行末的字符并插入, cc 删除整行并插入(注意区别于d, D, dd

(3)大小写切换(~,  g~, g~g~, g~~, gu, gugu, guu, gU, gUgU, gUU

和 g是切换大小写,g是切换到小写,g是切换到大写。g~, gu, gU 是操作符,需要接motion。g~g~, g~~, gugu, guu, gUgU, gUU是操作光标所处的整行(注意区别于普通模式,单独使用u或者U只有在Visual mode才是小写或大写切换)

(4)更改撤销(u, U, CTRL-R

u 撤销上一次更改,U 撤销该行所有的更改,CTRL-R 恢复撤销的更改。注意 u 和 U 要区别于Visual Mode下的 u 和 U

(5)查找(/, ?, n, N, *, #, g*, g#

和 ? 用于查找指定字符串,/ 前向查找,反向查找,n 沿着查找方向向下,N 沿着查找方向向上。

如果要限定查找的字符串完整匹配,需要在字符串前后加上 \< 和 \>,这两个限定也可以分开使用,分别代表前向限定和后向限定。另外查找还可以结合查找的正则表达式来使用。* 完整匹配并前向查找光标所在单词,# 与 * 类似,只是反向查找,g* 和 g# 取消了完整匹配的限制。

(6)替换

替换指令的基本形式是

:[range]substitute/from/to/[flags]

substitute 一般简写成 s。分隔符 可以用其他字符来代替,比如 +


[range]

替换的范围可以有多种形式,一般有

数字 {number}                          指定行号,如 :5s/old/new/

点 .                    当前行,如 :.s/old/new/

百分号 %                整个文件,如 :%s/old/new

正则表达式 {pattern}     符合规则的行,如 :?^Chapter?,/^Chapter/s=grey=gray=g

偏移量 offset          不单独使用,调整替换范围的起始处和终止处,如 :'<, '>+2s/old/new/

标记 mark               指定标记的行, 如 :'a, $s/old/new/

如后三例所示,范围可以通过用 , 分割开来的方式来指定起始和终止,如果在按 之前,先输入一个数字(比如5),那么命令行上就会出现

:.,.+4

的显示,这就指定了范围是从当前到其后5行的位置,如果是通过 v 指令选中一段文字,那么再输入 的时候,会看到

:'<, '>

这两个 '<  '> 分别代表Visual Mode的起始和结束。


[flag]

替换标志一般使用g, c。前者代表当前范围所有符合条件的,如果不加上,只替换第一个;后者代表替换确认,每次替换都会有相应的替换提示,更多详细的内容查看

:help s_flag

(7)格式文件

当通过 :set textwidth=72 设定文本的宽度为72,如果有行插入或删除新的内容,行就变得过长或过短了,而VIM不会将内容重新格式。

可以通过指令 gq 来完成文件的自动格式搭配。如

gqap

将光标所在的段落进行格式齐整(不要忘了a是用来选定一个对象的)。除了 text object 以外,还可以使用motion来指定一个范围,如

gggqG

将文件从开始到结束进行格式齐整。

(8)文件属性

这里只涉及 read-only 和 modifiable 属性

如果以指令

vim -r filename

打开文件,则文件是read-only,也就是修改无法生效,但是用 :w! 还是可以保存的

而如果以指令

vim -M filename

打开文件,则文件的modifiable 属性就会处于off 状态,此时文件是根本无法修改的。

2. 多文件操作

(1)文件切换

在不退出vim的情况下编辑另外一个文件,可以通过

:edit filename

的方式。但是之前的文件必须要保存修改或者舍弃更改才可以切换过去,当然也可以通过

:hide edit filename

不保存更改切换,但是要退出VIM的时候还是要保存或者舍弃更改。


单一窗口打开多个文件的时候,只能看到第一个文件,可以通过以下指令切换

:next         切换到下一个文件,已在最后会报错

:prev         前一个文件,已在最前会报错

:first        第一个文件

:last         最后一个文件

如果文件有修改未保存会报错,可以通过在指令前加上 w 保存或者用 舍弃更改

:args         查看所有文件列表,当前文件会用中括号括起来。如果后面跟上文件名作为参数,则打开指定的几个文件并关闭之前打开的所有文件

注意这种方式打开多个文件,一旦退出是所有文件一起退出,而不是像之前分割窗口打开,需要加上一个 all 才可以完全退出


第三种文件切换的方式就是之前提到的使用标记的方法,如果在某一个文件定义一个大写字母的标记,则只需要寻找标记,就可以切换到该文件。

有两个特殊标记会经常涉及到:

`"           跳转到上一次的位置

`.           跳转到上一次的更改

这两条指令不受文件的限制,可以在多文件之间跳转。

(2)文件比较

当使用指令

vimdiff file1 file2

去打开两个文件进行比较的时候,窗口会被自动纵向分割成两个,并将不同之处高亮,相同部分默认处于折叠状态(称之为 folder),如下图所示



图中每一个文件的左边都会有一个纵向的粗条,粗条上的 + 号就是折叠起来的 folder,只要点击一下就可以将相同部分展开,并变成 - ,再次点击就可以折叠,也可以用指令zo 和 zc 来打开和关闭。横向的粗条,显示被折叠的行数以及折叠部分的第一行的内容。如果有内容删除,删除部分会用一长串的短连接填充显示;文件不同之处,用红色高亮显示。

如果已经打开一个文件,也可以通过

:vertical diffsplit file

的方式来打开需要比较的文件,如果不用 vertical 的话,就是横向打开了。

还有一种方法是使用文件补丁的时候,可以通过指令

:vertical diffpatch file.patch

来打开当前文件的一个副本,并将补丁打入到这个副本,进而比较两个文件的不同之处(注意只能有一个补丁文件存在)。

不同之处可以通过 ]c  [c 跳转到前一个或后一个不同之处。

还有一点需要说明的是,如果在其中一个窗口滚动鼠标的时候,会发现两个窗口是一起滚动的,可以通过清除 scrollbind 选项(布尔变量)来取消

:set noscrollbind

(3)文件整合

当需要向一个文件中添加另外一个文件的内容,或者将当前文件的全部或部分内容添加或写入到另外一个文件,可以通过使用以下指令来完成。
:read file 
读取 file 文件内容并插入到光标下面一行,还可以在 read 前加上一个范围,指定插入的位置,比如 :$read file 是插入到当前文件最后,:0read file 插入到“第0行”(也就是文件的最开始)
:[range]write! file 
将当前文件的指定范围内的内容写入到 file,注意指令中使用了 ! 强制符号,否则无法写入,如果想保留file文件内容,可以通过 :[range]write >> file 将内容追加到 file 的最后,此时也不会有错误提示,替换范围中的 [range] 也适用于这里,如果不指定,则默认范围是 1,$


五、其他说明

(1)文件备份

VIM默认是不会将文件自动备份,如果需要备份,可以使用指令

:set backup

来完成,backup 也是个布尔变量。备份文件默认是在以原文件的名字后加一个波浪号 来命名,也可以通过指令

:set backupext=.bak

将其进行修改,备份目录默认是当前目录,可以通过 backupdir 选项来查看所有可能的备份路径

:set backupdir

如果要在做任何修改前保留一份源文件,可以通过设置 patchmode 选项来完成,如

:set patchmode=.orig

会在文件 file 进行修改的时候,自动创建一个 file.orig 的文件。

(2)语法高亮

syntax highlighting(语法高亮)是根据文件类型来识别的,一般如果有合适的文件后缀名,VIM在打开该文件的时候会设置合适的语法高亮,如果没有高亮,可以通过制定文件类型的方式来完成。

:set filetype=vim

上面这条指令的功能就是将当前文件的类型修改为vim脚本文件。VIM支持高亮的文件类型可以通过指令

:!ls $VIMRUNTIME/syntax

查看,除了语法高亮以外,VIM还支持背景颜色修改,如指令

:set background=dark

将背景修改为暗色系。色彩主题可以通过 :colorscheme 来设定,如

:colorscheme evening

将VIM的色彩主题设置成evening模式,其他主题可以通过 CTRL-D 来查看。

如果取消所有色彩设置,恢复成默认状态,只需要输入指令

:syntax reset

就可以。

(3)寄存器

寄存器是VIM中一项重要的内容,很多批量操作一般都可以通过寄存器来实现。

文本移动操作中的剪切和复制都是将文本暂存在寄存器中,当粘贴的时候,就从寄存器中取出。如果有很多不同内容需要同时进行复制或剪切,可以给寄存器命名,如

"fyas

将光标所在行复制到寄存器 f 中,粘贴的时候使用

"fp

就可以将内容从 f 寄存器中取出(别忘了剪切板也是如此,只是把寄存器的名字换成了 * 或者 +)。需要注意的是寄存器要紧跟着操作符,中间除了数字以外不能有其他任何指令。


除此之外,批量指令也可以存放在寄存器中,通过 q{register} 来实现。如要把下面这几行文字

stdio.h ~
fcntl.h ~
unistd.h ~
stdlib.h ~

变成如下所示

#include "stdio.h" ~
#include "fcntl.h" ~
#include "unistd.h" ~
#include "stdlib.h" ~

首先将光标移至第一行,然后采取以下步骤

qa把以下指令保存在 a 寄存器中

^移动到开头

i#include "<Esc>插入#include "并退出插入模式

$移动到末尾

a"附加 ”

q退出指令记录操作

在操作过程中,VIM的左下角会显示 recording,表示正在记录指令,当再按一次q退出的时候,也就不再显示。

指令保存在a以后,通过 @a 来执行执行。还可以指定数字,比如上例中,3@a 就可以将剩下3行全部修改,或者通过 @@ 来重复上一次操作。

保存在寄存器中的指令还可以像普通文本一样来进行修改,通过 ”ap 将指令内容粘贴在一个新行,修改之后再将指令通过 "add 将指令剪切到 a 寄存器。但是注意特殊字符(如<Esc>)手动输入是无效的

VIM中有一个强大的操作符 “.,在普通模式下,它是用来重复上一次动作的(注意区分查找替换中的 . ),但是也只能重复一次,因此多条指令的时候,就应该考虑使用寄存器了。

(4)模式说明

VIM的模式除了常提到的普通模式、命令行模式和插入模式以外,还有诸如 Replace Mode(替换模式),Select Mode(选择模式),Visual Mode(可视模式)等,详细的模式说明可以查看

:help vim-modes-intro(别忘了CTRL-D可以帮你找)

替换模式在普通模式下按 R 就可以进入,也就是进入连续替换的方式。

选择模式,类似于Windows下的鼠标选中,注意区别于可是模式,该模式下按任意一个字符选中文字就会全部被删除,而可视模式下就不会。VIM默认选择模式不能通过鼠标来进入,所以当用鼠标去选中文字的时候,左下角显示当前正处于Visual模式,而不是Select模式。可以通过修改选项 selectmode 改变

:set selectmode+=mouse

这样当用鼠标去选中文字的时候,就会处于选择模式了。不需要鼠标的时候,用 -= 剔除掉。

可视模式有三种常用进入的方式,一是按 v 就可以进入,可通过motion指令来进行调整选中范围;二是按 V 进入,此时为 Visual Line,即按行选中,左右调整已失效;三是按 CTRL-V 进入,此时为Visual block,也就是按区域块进行选中。进入Visual模式以后,可以按 o 来切换选中端,这样可以做到从任意一端进行调整,在Visual block中还可以通过 O 来进行同一行上选中端的切换。

在Visual block下,选中文字以后,按 I 修改第一行数据之后按 <Esc> 退出插入模式,后面所有被选中的行都会产生相应的更改,如果中间有行过短没有被选中,则不会对该行产生影响。按 c 会产生类似的效果,只是会将选中区域的内容全部删除。如果是 C, 则从选中区域的左端到行末都会被删除。除此之外,按 > 则会在选中区域左端插入空白符,空白符的长度通过 shiftwidth 选项来设定;选中空白符,按 < 则会将空白符移除。