vim的使用

   日期:2020-05-10     浏览:160    评论:0    
核心提示:vim三种模式的功能说明及深入说明vim的正则表达式开发工具

vim的使用

  • 1、vim一般模式
    • 1.1 移动光标
    • 1.2 删除、复制、粘贴
    • 1.3 搜索取代
      • 搜索 /、?
      • 取代s
    • 1.4 Vim正则表达式 [^1]
      • 文本元字符
      • 数量元字符[^2]
      • 位置元字符
      • 转义特殊字符
      • 子表达式
      • 回溯引用
      • 前后查找
  • 2、Vim编辑模式
  • 3、指令列模式
  • 4、三种模式相互关系的简略图

1、vim一般模式

以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。这个模式下,你可以上下移动光标,可以搜索和替换,可以删除、复制、粘贴。

 

  • 1.1 移动光标

快捷键 功能描述
h 光标向左移动一个字符
j 光标向下移动一个字符
h 光标向左移动一个字符
k 光标向上移动一个字符
l 光标向右移动一个字符
n + j/h/k/l 次数移动光标
[Ctrl] + [f] 屏幕『向下』移动一页
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
w 按单词移动光标
0 移动到这一行的最前面字符处
$ 移动到这一行的最后面字符处
G 移动到这个档案的最后一行
nG n 为数字。移动到这个档案的第 n 行
gg 移动到这个档案的第一行
n n 为数字。光标向下移动 n 行(常用)

 

  • 1.2 删除、复制、粘贴

复制文本有行复制和选择文本复制。行复制请参考以下的快捷键方式,而选择文本性复制,要用到文本选择。点击这里到另一篇“Vim额外的功能”查看规则

快捷键 功能说明
x,X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整列(常用)
ndd n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)
d 1G
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 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
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 将光标所在列与下一列的数据结合成同一列
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

 

  • 1.3 搜索取代

    • 搜索 /、?

    命令格式:/ 正则表达式/s, 向下搜索,/s是可选参数,跨行匹配
    命令格式:?正则表达式/s,向上搜索,/s是可选参数,跨行匹配
    :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 匹配单词词首
> \b 匹配单词词尾
    • 转义特殊字符

Vim字符 意义
\ * *
\ . .
\ / /
\ \ \
\ [ [
\ ] ]
    • 子表达式

      重复次数的元字符只作用于紧挨着它的前一个字符或元字符。实际上,我们希望重复次数作用于一个整体。
      例子:&nbsp;*正则表达式会搜索出&nbsp;;;;;;
      例子:(&nbsp;)*正则表达式会搜索出&nbsp;&nbsp;&nbsp;&nbsp;

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

Vim Perl
/small\(cat\)\@! small(?!cat)

\@<= 逆序环视:向后查找。左右的文本要写成子表达式
eg…查找https协议的域名。mail.forta.com

Vim Perl
/(https://)@<=[a-z.]* (?<=https://)[\w.]*

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相反 ,匹配大小写

4、三种模式相互关系的简略图

全文参考鸟哥的Linux私房菜第三版的第十章:vim 程序编辑
http://cn.linux.vbird.org/linux_basic/0310vi_2.php

  1. 参考正则表达式必知必会(修订版)Author:Ben Forta ↩︎

  2. 参考https://www.cnblogs.com/penseur/archive/2011/02/25/1964522.html(vim 正则表达式 很强大) ↩︎

  3. 位置匹配对某段文本的特定位置进行匹配。假设搜索:smallcat,vim表达式:small(cat)@=,搜索结果是small ↩︎

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服