玩转VIM编辑器-文本操作
插入和添加文本
键 | 描述 |
i | 在当前位置插入文本 |
I | 在当前行首插入文本 |
o | 在当前行的下一行新建一行并插入文本 |
O | 在当前行的上一行新建一行并插入文本 |
:r filename | 在当前行的下一行开始插入filename中的内容 |
:r !command | 在当前行的下一行插入command的输出信息 |
a | 在当前光标后添加文本 |
A | 在当前行末添加文本 |
替换文本
键 | 描述 |
r{c} | 使用c替换当前字符 |
R | 命令与r相同,用于替换文本,不同在于,按下R后会进入覆盖模式,输入的字符将逐一覆盖屏幕上的字符,直到ESC为止。 |
s | 删除当前光标字符,然后插入文本 |
S | 删除整行,并插入文本 |
4s | 删除当前4个光标字符,然后插入文本 |
4S | 删除4行,并插入文本 |
cc | 同S |
C | 将从光标开始到行末的字符删除,并开始插入文本 |
连接行与行
可以使用J来将行与行进行连接,中间只有一个空格隔开。
复制一个字符、单词或行
键值 | 描述 |
yc | 复制单个字符 |
yw | 复制单个字 |
yl | 向下复制一行,也可以yk向上复制 |
y<mark name> | 复制一个书签行 |
y’<mark name> | 复制到一个书签的位置 |
粘贴
可以使用p来粘贴到光标所在的下一行,或者P来粘贴到光标所在的上一行。
我们可以通过:reg来查看寄存器中的一些操作量,可以使用”np来粘贴第n个寄存器的内容,其中n为:reg中的第一列。
删除单个字符、字或者行
键值 | 描述 |
x | 删除光标当前字符 |
dw | 删除当前字 |
dj | 删除当前行和下一行 |
从剪切板粘贴内容
在普通模式下,可以使用”*p来插入剪贴板的内容。
从当前文件复制内容到剪贴板
复制到粘贴板 | 描述 |
:%p | 将整个文件复制到粘贴板 |
:y | 复制当前行到粘贴板 |
:N,My | 复制指定的N到M行至粘贴板 |
将文件的部分内容写到另一个文件
可以使用CRTL+V块选择来指定文件内容,然后使用:w newfilename,来将内容写到新的文件;或者使用:5,10w newfilename将第5至10行写到新的文件。
交换单词
如果将as写成了sa,快速交换次序的方法为执行xp,解释为x为剪切当前字符,p为粘贴。可以测试一下。所以xp的意思就是转置。
强大的点.
Dot(.)的含义为重复上一次对文件内容有影响的命令,注意是有修改的命令,所以单纯的移动是不重复的。
可视模式命令
可视模式命令
可视模式类型 | 描述 |
v | 选择字符,从当前字符开始 |
V | 选择字符,从当前字符所在的行开始 |
CTRL+V | 块选择 |
可视模式命令 | 描述 |
<ESC> | 退出可视模式 |
d | 删除高亮选择的部分 |
D | 删除高亮部分所在的行 |
y | 拷贝高亮部分文本 |
Y | 拷贝高亮部分所在的行 |
c | 删除高亮文本并且进入插入模式 |
C | 删除高亮文本所在的行并且进入插入模式 |
使用:g来编辑
示例 | 描述 |
删除所有的空白行 | |
:g/^\s*$/d | 删除所有的空白行和由空格组成的行 |
:g/^$/,/./-j | 将多个空白行改变为单个空白行 |
:g/pattern/d | 删除带有指定pattern的行 |
:g/pattern/ . w>>filename | 将带有指定pattern的行写入文件filename |
:g/^/m0 | 反转整个文件 |
:g/^\s*PATTERN /exe "norm! I/* \<ESC>A */\<ESC>" | 意义添加匹配PATTERN的行,为c风格的注释 |
上述的:g可以使用:g!或者:v来做相反的操作,例如:g!/^$/d就是删除所有非空白的行。
拷贝文本行到命名缓冲区
将文本拷贝到命名缓冲区,后面可以直接通过该缓冲区使用。有效的缓冲区名字为从a到z的26个字母。
命令 | 描述 |
“ayy | 拷贝当前行到缓冲区a |
“a5yy | 拷贝5行到缓冲区a |
“ap | 光标后粘贴缓冲区a的内容 |
“aP | 光标前粘贴缓冲区a的内容 |
将插入的文本当作正常命令
如果在插入模式下输入了命令,那么可以按F2来将输入文本转为命令执行。当然这个需要在vimrc中定义inoremap <F2> <ESC>u@. 其中最后有个点号
缩写和非缩写
如果经常需要输入邮箱、住址或这单位,这个功能就比较使用。例如the People's Republic of China,那么我们只需要:addr CHINA the People's Republic of China,以后在输入CHINA的时候就会自动转为the People's Republic of China,又如:addr EMAIL thisismyemail@gmail.com,那么我们在输入EMAIL的时候,就会自动转为thisismyemail@gmail.com。
其中的addr也可以使用iabbrev替代。
使用:noabbr CHINA就可以取消该缩写。
宏的使用
宏就是记录我们的操作动作,后续的可以按照我们的设定进行工作。
步骤如下:
1. 按下q开始记录,后面跟上一个小写的字母,比如a作为宏的名字;
2. 在vim中进行一些操作,这些宏a都会记录;
3. 按下q停止记录;
4. 使用宏,可以通过@a来回放宏a;
5. 如果想执行多次操作,可以使用:N@a,其中N为次数。
文件内容排序
:sort会对文件的所有内容进行排序,如果需要对特定的行进行排序,可以使用块选择,然后在执行sort操作。
:sort选项 | 描述 |
:sort | 升序排列 |
:sort! | 降序排列 |
:sort i | 忽略大小写排序 |
:sort u | 移除掉重复的行 |
:sort! ui | 也可以将上述几种进行结合操作 |
恢复删除的文本
如果误删除了一些文本,可以恢复最近9个操作过的文本。因为他们都保存在编号的缓冲区中,最后一次删除的内容保存在缓冲区1,倒数第二次的则保存在缓冲区2……要恢复删除操作,先输入”(双引号),接着指定缓冲区编号,在使用放置命令。
恢复误操作 | 描述 |
“1p | 恢复最近一次的误操作 |
“2p | 恢复最近倒数第二次的误操作 |
“3p | 恢复最近倒数第三次的误操作 |
如果你不清楚删除的内容,可以查看9个删除的缓冲区内容。也可以使用下述命令,直到你找到正确的那个(如果在恢复p一次后利用重复命令(.)做恢复,缓冲区的编号会自动增加,再加上用u撤销恢复,即可用下例搜索变化的缓冲区:):
“1pu.u.u.u.u.u.
删除文件时发生的问题
1. 使用u来撤销上一个命令,但这只适用于尚未下达其他命令的时候,因为u只会撤销最近一个命令;
2. 可以使用p命令,因为vi会将最近9次的删除动作保存在9个编号的删除缓冲区中。
3. 其实vim支持“无限”恢复的,因此挽救失误因此简单多了。
重复或撤销上一个命令
每一个编辑命令均存储到一个临时的缓冲区,直到发出下一个命令为止。
要想重复相同的编辑命令时,可以使用重复命令,句号(.),以节省时间。
可以使用u来撤销上一个命令;
使用U会撤销所有对同一行的编辑动作,只要光标还在这一行即可,一旦你移到别的行,就不能使用U了。
VIM让我们用CTRL+R来重做一次撤销操作,即撤销所作的撤销操作。
为一些文件自动添加一些东西
Vim中有40多个自动命令的触发事件。例如下面几个:
事件 | 描述 |
BufNewFile | 开始编辑一个不存在的文件 |
FileReadPre | 在读取一个文件前使用:read命令 |
BufWritePre | 将整个缓存写入一个文件 |
FileWritePre | 将部分缓存写入一个文件 |
BufDelete | 在一个缓存列表中删除一个缓存 |
BufWipeout | 清空整个缓存前 |
BufNew | 创建一个新的缓存后 |
BufEnter | 进入一个缓存后 |
BufLeave | 离开到另一个缓存前 |
SwapExists | 检测一个存在的swap文件 |
很多开发者希望在编写程序的时候就把一些必须的东西直接填写在文件中,比如打开文件就希望是如下:
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
* File Name : 1.c
* Purpose :
* Creation Date : 22-12-2008
* Last Modified : Mon 22 Dec 2008 10:36:49 PM PST
* Created By :
_._._._._._._._._._._._._._._._._._._._._.*/
完成这样的操作步骤如下所示:
首先:创建一个临时的文件,比如c_header.txt
:insert
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
* File Name :
* Purpose :
* Creation Date :
* Last Modified :
* Created By :
_._._._._._._._._._._._._._._._._._._._._.*/
.
注意文件刚开始的:insert和最后的点号.
然后:将自动化的命令添加到vimrc文件中:
autocmd bufnewfile *.c so /home/name/c_header.txt
autocmd bufnewfile *.c exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%")
autocmd bufnewfile *.c exe "1," . 10 . "g/Creation Date :.*/s//Creation Date : " .strftime("%d-%m-%Y")
autocmd Bufwritepre,filewritepre *.c execute "normal ma"
autocmd Bufwritepre,filewritepre *.c exe "1," . 10 . "g/Last Modified :.*/s/Last Modified :.*/Last Modified : " .strftime("%c")
autocmd bufwritepost,filewritepost *.c execute "normal `a"
最后:可以创建一个新的.c文件进行测试
可以看到刚开始只会把创建时间等信息填写上,在保存文件后会自动把上一次编辑时间给填写上。
可以通过:version来查看vim的版本以及支持的一些特性。
更改大小写
波浪号~可以将小写字母改成大写的,或者将大写字母改成小写的。
移动到特定的行
若想移动到特定行,可以使用G命令,只按G将移动到文件的结尾,4G则移动到第4行。
文本创建与操纵命令
编辑动作 | 命令 |
在光标所在位置插入文本 | i |
在一行的开头插入文本 | I |
在光标所在位置附加文本 | a |
在一行的最后附加文本 | A |
在光标下一行打开新行 | o |
在光标上一行打开新行 | O |
删除一行并替换文本 | S |
用新文本覆盖现有的文本 | R |
合并当前这一行与下一行 | J |
切换当前字符的大小写 | ~ |
重复上一次动作 | . |
撤销上一次动作 | u |
将一整行恢复到原来的状态 | U |
编辑命令
文本对象 | 更改 | 删除 | 复制 |
一个单词 | cw | dw | yw |
两个单词,不包括标点符号 | 2cW或c2W | 2dW或d2W | 2yW或者y2W |
后退三个单词 | 3cb或c3b | 3db或d3b | 3yb或y3b |
一整行 | cc | dd | yy或y |
到一行的结尾 | C或c$ | D或d$ | y$ |
到一行的开头 | c0 | d0 | y0 |
单个字符 | r | X或x | y1 |
五个字符 | 5s | 5x | 5y1 |