Linux之vim的使用

1、vim一般模式

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

 

  • 1.1 移动光标

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

 

  • 1.2 删除、复制、粘贴

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

快捷键功能说明
x,X在一行字当中,x 为向光标(vim会高亮一个字符显示,而光标是在这个高亮字符的左边)后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nxn 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd删除游标所在的那一整列(常用)
nddn 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除游标所在处,到该行的最后一个字符
d0那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy复制游标所在的那一行(常用)
nyyn 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用)
y1G复制游标所在列到第一列的所有数据
yG复制游标所在列到最后一列的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p,Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J将光标所在列与下一列的数据结合成同一列
c重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u复原前一个动作。(常用)
[Ctrl]+r撤销复原的动作(常用)
这个u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是撤销~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
.不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

 

  • 1.3 搜索取代

    • 搜索 /、?

    命令格式:/ 正则表达式, 向下搜索
    命令格式:?正则表达式,向上搜索
    :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

vimPerl说明
**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个;懒惰匹配
    • 位置元字符

vimPerl说明
^^匹配行首
$$匹配行尾
\<\b匹配不是单词词首,而PERL是匹配单词词首
\>\b匹配不是单词词尾,而PERL是匹配单词词尾
    • 转义特殊字符

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

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

vimPerl意义
\( \)()子表达式,允许嵌套
    • 回溯引用

vimPerl意义
\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

VimPerl说明
/.\+\(:\)\@=.+?(?=:)向…之前匹配;向:字符之前查找匹配文本,但不消费:字符

\@! 顺序否定环视:否定式向前查找
尝试过模糊匹配,例如Perl表达式:.*?(?!cat),发现匹配的效果不如意,可能否定式向前查找,前面的字符是要确定的文本。
eg…查找单词后面不是cat的small
搜索结果:smalldog中的small

VimPerl说明
/small\(cat\)@!small(?!cat)向不是…之前匹配;向不是cat字符串之前查找匹配文本,但不消费cat字符串

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

VimPerl说明
/(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、三种模式相互关系的简略图

vim三种模式的相互关系

全文参考鸟哥的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 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值