vim的使用
1、vim一般模式
以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。这个模式下,你可以上下移动光标,可以搜索和替换,可以删除、复制、粘贴。
快捷键 | 功能描述 |
---|---|
h | 光标向左移动一个字符 |
j | 光标向下移动一个字符 |
h | 光标向左移动一个字符 |
k | 光标向上移动一个字符 |
l | 光标向右移动一个字符 |
n + j/h/k/l | n 为数字。光标向下移动 n 行(常用) |
[Ctrl] + [f] | 屏幕『向下』移动一页 |
[Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
w | 按单词移动光标 |
0 | 移动到这一行的最前面字符处 |
$ | 移动到这一行的最后面字符处 |
G | 移动到这个档案的最后一行 |
nG | n 为数字。移动到这个档案的第 n 行 |
gg | 移动到这个档案的第一行 |
复制文本有行复制和选择文本复制。行复制请参考以下的快捷键方式,而选择文本性复制,要用到文本选择。点击这里到另一篇“Vim额外的功能”查看规则
快捷键 | 功能说明 |
---|---|
x,X | 在一行字当中,x 为向光标(vim会高亮一个字符显示,而光标是在这个高亮字符的左边)后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 |
dd | 删除游标所在的那一整列(常用) |
ndd | n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用) |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除游标所在处,到该行的最后一个字符 |
d0 | 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 |
yy | 复制游标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用) |
y1G | 复制游标所在列到第一列的所有数据 |
yG | 复制游标所在列到最后一列的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p,P | p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
J | 将光标所在列与下一列的数据结合成同一列 |
c | 重复删除多个数据,例如向下删除 10 行,[ 10cj ] |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 撤销复原的动作(常用) |
这个u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是撤销~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! | |
. | 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
-
命令格式:/ 正则表达式, 向下搜索
命令格式:?正则表达式,向上搜索
:set ignorecase //忽略大小写
:set noignorecase //恢复到大小写敏感
搜索子表达式的例子点击*[查看演示] -
-
取代s
命令完整格式::[range]s/from/to/[flags]
把from指定的字符串替换成to指定的字符串,from可以是正则表达式。*[点击查看vim正则表达式规则]
-
[range]的取值列表:
符号 | 说明 |
---|---|
不写range | 默认为光标所在的行 |
% | 所有行(与 1,$ 等价) |
. | 光标所在的行 |
1 | 第一行 |
$ | 最后一行 |
33 | 第33行 |
22,33 | 第22~33行 |
.,$ | 当前行 到 最后一行 |
[to]
s/from/=函数式 或者 s/from/\1
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 ( 和 ) 中的内容。
函数式::%s/(.)</head>/=submatch(1)
正则表达式::%s/(.)</head>/\1
例子
[flags]
符号 | 说明 |
---|---|
无 | 只对指定范围内的第一个匹配项进行替换 |
g | 对指定范围内的所有匹配项进行替换 |
c | 在替换前请求用户确认 |
i | 忽略大小写 |
e | 忽略执行过程中的错误 |
例子:
-
:%s/yes//gc
注意:上面的所有flags都可以组合起来使用,比如 gc 表示对指定范围内的所有匹配项进行替换,并且在每一次替换之前都会请用户确认。 -
:%s/\<four\>/4/g
将所有的four替换成4,但是fourteen中的four不替换。 -
:%s/ */ /g
把一个或者多个空格替换为一个空格。 -
:%s/ *$//
去掉行尾的所有空格。 -
:%s/^/ /
在每一行头上加入一个空格。
-
1.4 Vim正则表达式 1
Vim元字符类型 | 元字符表达式 | 说明 |
---|---|---|
匹配任意字符 | ||
. | 匹配任意一个字符 ,除了换行符\n以外的所有字符 | |
匹配一组字符 | ||
[abc] | 匹配方括号中的任意一个字符 | |
[-] | 匹配一组字符,[0-9]匹配数字 | |
[^abc] | 匹配除方括号中字符之外的任意字符 | |
匹配空白字符 | ||
\t | 匹配<TAB>字符 | |
\s | 匹配空字符和制表符;Perl是所有空白符,包括空字符、制表符、换行符、换页符、回车符 | |
\S | 匹配非空白字符[^\t] | |
这是一个空格,按一次Space键。匹配一个空格符 | ||
\n | 匹配换行符 | |
匹配数字(与非数字)(与非字母和数字) | ||
\d | 匹配阿拉伯数字,等同于[0-9] | |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0-9] | |
匹配字母和数字(与非字母和数字) | ||
\w | 匹配字母、数字和_,等同于[0-9a-zA-Z_ ] | |
\W | 匹配除了字母、数字和_的字符,等同于[^0-9a-zA-Z_ ] |
-
-
数量元字符2
-
vim | Perl | 说明 |
---|---|---|
* | * | 0个或多个;贪婪匹配 |
\+ | + | 1个或多个;贪婪匹配 |
\?或 \= | ? | 0个或1个;贪婪匹配 |
\{n,m} | {n,m} | n个到m个;贪婪匹配 |
\{n,} | {n,} | 最少n个;贪婪模式 |
\{,m} | {,m} | 最多m个;贪婪模式 |
\{n} | {n} | 恰好n个 |
\{-n,m} | {n,m}? | n个到m个;懒惰匹配 |
\{-} | *? | 0个或多个;懒惰匹配 |
\{-1,} | +? | 1个或多个;懒惰匹配 |
\{-,1} | ?? | 0个或1个;懒惰匹配 |
vim | Perl | 说明 |
---|---|---|
^ | ^ | 匹配行首 |
$ | $ | 匹配行尾 |
\< | \b | 匹配不是单词词首,而PERL是匹配单词词首 |
\> | \b | 匹配不是单词词尾,而PERL是匹配单词词尾 |
Vim字符 | 意义 |
---|---|
\ * | * |
\ . | . |
\ / | / |
\ \ | \ |
\ [ | [ |
\ ] | ] |
重复次数的元字符只作用于紧挨着它的前一个字符或元字符。实际上,我们希望重复次数作用于一个整体。
例子: *正则表达式会搜索出 ;;;;;
例子:( )*正则表达式会搜索出
vim | Perl | 意义 |
---|---|---|
\( \) | () | 子表达式,允许嵌套 |
vim | Perl | 意义 |
---|---|---|
\n | \n | 引用子表达式。n代表着第几个子表达式,从1开始 |
例子:
<body>
<H1>标签头尾一致</H1>
<H2>标签头尾不一致</H1>
</body>
- vim搜索子表达式:
/<\(H1\)>.*<\/\1>
搜索:
<body>
<H1>标签头尾一致</H1>
<H2>标签头尾不一致</H1>
</body>
-
vim替换子表达式:
:%s/<\(H\d\)>\(.\{-}\)<\/\(H\d\)>/<\1>\2<\/\1>
替换结果:<H2>标签头尾不一致</H2> -
-
前后查找
Vim向前查找是因为要匹配文本是在左边,而左边紧跟的内容,可以说是位置匹配3。而Perl表达式(?=),要匹配的文本也在左边。而区别是,vim位置匹配文本是写在紧跟\@=左边,而Perl是写在(?=)等号右边。
Vim向后匹配,要匹配的文本是在右边,\@<=右边紧跟要匹配的文本,左边内容起到位置匹配的作用。而Perl表达式(?<=),等号后面紧跟的是位置匹配文本,子表达式右边是文本匹配。
-
例子:提取URL的协议名,就是提取http、https、ftp
smallcat
smalldog
mysmallcat
smallcat_lili
http://www.forta.com/
https://mail.forta.com/
ftp://ftp.forta.com/
\@= 顺序环视:向前查找
eg…查找URL的协议名
搜索结果:http、https、ftp
Vim | Perl | 说明 |
---|---|---|
/.\+\(:\)\@= | .+?(?=:) | 向…之前匹配;向:字符之前查找匹配文本,但不消费:字符 |
\@! 顺序否定环视:否定式向前查找
尝试过模糊匹配,例如Perl表达式:.*?(?!cat),发现匹配的效果不如意,可能否定式向前查找,前面的字符是要确定的文本。
eg…查找单词后面不是cat的small
搜索结果:smalldog中的small
Vim | Perl | 说明 |
---|---|---|
/small\(cat\)@! | small(?!cat) | 向不是…之前匹配;向不是cat字符串之前查找匹配文本,但不消费cat字符串 |
\@<= 逆序环视:向后查找。左右的文本要写成子表达式
eg…查找https协议的域名。mail.forta.com
Vim | Perl | 说明 |
---|---|---|
/(https://)@<=[a-z.]* | (?<=https://)[\w.]* | 向…之后匹配;向http://之后匹配,但不消费http://字符串 |
2、Vim编辑模式
在一般模式中可以进行删除、复制、炸你特等等的动作,但是却无法编辑文件内容的! 要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现『 INSERT 或 REPLACE 』的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下『Esc』这个按键即可退出编辑模式。
快捷键 | 说明 |
---|---|
i, I | 进入插入模式(Insert mode):i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用) |
a, A | 进入插入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开始插入』。(常用) |
o, O | 进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常用) |
r, R | 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 |
上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 | |
[Esc] | 退出编辑模式,回到一般模式中(常用) |
3、指令列模式
只能从一般模式进入,在一般模式中输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!
指令 | 说明 |
---|---|
:w | 将编辑的数据写入硬盘档案中(常用) |
:w! | 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊! |
:q | 离开 vi (常用) |
:q! | 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开! |
:w filename | 将编辑的数据储存成另存为一个新档 |
:x,y w filename | 将 第x行 到 第y行 的内容另存为一个新档。 |
:file | 查看vim当前编辑文件的名称、总行数 |
:! command | 暂时离开 vi 到指令列模式下执行 command 的显示结果!例如『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息! |
:set nu | 显示行号,设定之后,会在每一行的前缀显示该行的行号 |
:set nonu | 与 set nu 相反,为取消行号! |
:noh | 取消高亮,例如搜索后,目标字符会高亮显示 |
:set ignorecase | 搜索字符,忽略大小写 |
:set ignorecase | 与set ignorecase相反 ,匹配大小写 |
-
3.1 Vim中执行Linux命令
支持将vim中执行命令的结果插入到编辑的文件中
【例1】查询err.txt的内容,并把编辑的文件的光标所在行的内容替换成err.txt的内容
1、vim编辑文件,在指令模式下按两次“!!”
2、在屏幕左下角看到指令“ :.! ”,输入cat /tmp/err.txt
3、看到所在行的内容被替换了
4、三种模式相互关系的简略图
全文参考鸟哥的Linux私房菜第三版的第十章:vim 程序编辑
http://cn.linux.vbird.org/linux_basic/0310vi_2.php