vim
Linux文本编辑工具之神vim

目录
[toc]
1 vi和vim简介
在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。
文本编辑种类:
1全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim
2
3行编辑器:sed
4
5vi:Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大
6
7vim:VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件
8官网:www.vim.org
9其他相关编辑器:gvim 一个Vim编辑器的图形版本
1.1 vim和vi的爱恨情仇
vim即为vi improved的缩写,是从vi发展起来的一个文本编辑器,其代码补充、编译和错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。这个名称更多是意味着vim已经是vi编辑器的超集,vim的功能已经远远超过了vi。vim是Bill Joy用于unix的vi文本编辑器的补充。vim是由Bram Moolenaar根据Stevie编辑器的源码进行编写的,并在1991年首次公开发布。
1.2 vim概述

2 使用vim初步
2.1 vim 命令格式
1vim [OPTION]... FILE...
常用选项:
1+# 打开文件后,让光标处于第#行的行首,+默认行尾
2+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
3-b file 二进制方式打开文件
4-d file1 file2… 比较多个文件,相当于 vimdiff
5-m file 只读打开文件
6-e file 直接进入ex模式,相当于执行ex file
7-y file Easy mode (like "evim", modeless),直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出
说明:
如果该文件存在,文件被打开并显示内容
如果该文件不存在,当编辑后第一次存盘时创建它
2.2 三种主要模式和转换
vim 是一个模式编辑器,击键行为是依赖于 vim的 的“模式”。
三种常见模式:
(1)命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本;
(2)插入(Insert)或编辑模式:用于修改文本;
(3)扩展命令(extended command )或命令(末)行模式:保存,退出等;
模式转换:

命令模式–>插入模式:
1i insert, 在光标所在处输入
2I 在当前光标所在行的行首输入
3
4a append, 在光标所在处后面输入
5A 在当前光标所在行的行尾输入
6
7o 在当前光标所在行的下方打开一个新行
8O 在当前光标所在行的上方打开一个新行
插入模式 — ESC—–> 命令模式
命令模式 —- : —-> 扩展命令模式
扩展命令模式 —-ESC,enter—-> 命令模式
3 扩展命令模式
按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧。
3.1 扩展命令模式基本命令
1w 写(存)磁盘文件
2
3wq 写入并退出
4x 写入并退出
5wq! == ZZ 强制保存并退出(普通模式下)
6
7X 加密(不常用) #取消加密:输入空口令;
8
9q 退出
10q! 不存盘退出,即使更改都将丢失
11
12r filename #读文件内容到当前文件中 注意!
13w filename #将当前文件内容写入另一个文件 注意!
14!command #执行命令 注意!
15r!command #读入命令的输出 注意!
3.2 地址定界
格式:
1:start_pos,end_pos CMD
3.2.1 地址定界格式
1# #具体第#行,例如2表示第2行
2#,# #从左侧#表示起始行,到右侧#表示结尾行
3
4#,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
5
6. #当前行
7$ #最后一行
8.,$-1 #当前行到倒数第二行
9
10% #全文, 相当于1,$
11
12/pattern/ #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
13/pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
14#,/pat/ #从指定行开始,一直找到第一个匹配patttern的行结束
15/pat/,$ #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
3.2.2 地址定界后跟一个编辑命令
1d #删除
2y #复制
3w file #将范围内的行另存至指定文件中
4r file #在指定位置插入指定文件中的所有内容
3.3 查找并替换
格式:
1s/要查找的内容/替换为的内容/修饰符
说明:
要查找的内容:可使用基末正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容;
修饰符:
1i #忽略大小写
2g #全局替换,默认情况下,每一行只替换第一次出现的。
3gc #全局替换,每次替换前询问
3.3.1 范例:常规替换
1:s/root/zxl/g
2
3:2,10s/root/zxl/g
3.3.2 范例:查找替换中的分隔符/可替换为其它字符,如:#,@
1或者加转义符:(麻烦)
2s@/etc@/var@g
3s#/boot#/#i
3.3.3 范例:替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号**;**还可以使用“&”引用前面查找时查找到的整个内容;
1:% s/xyz/&er/g表示把所有行里面的xyz全部替换为xyzer。
3.3.4 范例:vi/vim 中如何在每行行首或行尾插入指定字符串?
1行首 :% s/^/your_word/g
2行尾 :% s/$/your_word/g
3
4:/^d ----^意思表示以什么开头 ,,查找以字母d开头的内容
5:/t$ -----$意思表示以什么结尾,,查找以字母t结尾的内容
扩展命令模式下正则表达式应用
3.3.5 范例:分组引用的搜索替代用的最多了。
1测试1:
2#vim新建一个新文件:
3[root@localhost ~]# vim fa.txt
4root root root
5rabt rabt rxyt
6
7#现在想在vim编辑界面如何将root替换为rooter?
8:%s/root/root/g #扩展命令行模式下
9
10#替换后效果如下:
11rooter rooter rooter
12rabt rabt rxyt
1测试2:
2#vim新建一个新文件:
3[root@localhost ~]# vim fa.txt
4root root root
5rabt rabt rxyt
6
7#现在想在vim编辑界面如何将r..t替换为admin(r..t)er?
8:%s#\(r..t\)#admin\1er#g #扩展命令行模式下
9
10#替换后效果如下:
11adminrooter adminrooter adminrooter
12adminrabter adminrabter adminrxyter
3.4 定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存。
配置文件:
/etc/vimrc #全局
~/.vimrc #个人
老师自定义vimrc配置脚本(见“脚本库”)
3.4.1 行号
1显示:set number,简写 set nu
2取消显示:set nonumber, 简写 set nonu
3.4.2 忽略字符的大小写
1启用:set ignorecase,简写 set ic
2不忽略:set noic
3.4.3 自动缩进
1启用:set autoindent,简写 set ai
2禁用:set noai
注意:
自动缩进带来的一个缺点就是:复制粘贴会出问题。。。。。缩进乱了。。。。
不同编辑器的tab键(1个tab键代表几个空格)不同,可能会造成影响。。。。。
vim中默认一个tab键需要用8个空格来代替:
现象如下:


解决办法:
:set paste保留原格式
3.4.4 复制保留格式
1启用:set paste
2禁用:set nopaste
3.4.5 显示Tab(^I)和换行符($)显示
1启用:set list
2禁用:set nolist
1#vim fstab
2abc$ #每个换行符后面都会出现一个美元符号$
3123$
4^Ic ^Icdd$ #如果里面含有tab输入,这里就会显示这个`^I`符号!
5~
6:set list
3.4.6 高亮搜索
1启用:set hlsearch
2禁用:set nohlsearch
3.4.7 语法高亮
1启用:syntax on
2禁用:syntax off
3
4#注意:语法高亮默认是开启的;
5#注意:cp /etc/passwd /data/下的区别;(后者默认不会出现语法高亮,因为系统认为/etc/目录下就是文件的配置文件所在目录,因此才会显示语法高亮,而后者不是)
3.4.8 文件格式
1启用windows格式:set fileformat=dos
2启用unix格式:set fileformat=unix
3简写 set ff=dos|unix
4
5注意:
6hexdump -C file #hexdump命令可以用来确认文件的格式(linux格式换行符只有oa,而winodws的同时有0d 0a)
7
8dos2unix file #linux-->winodws;
9unix2dos file #winodws-->linux;
3.4.9 Tab 用空格代替
1启用:set expandtab #默认为8个空格代替Tab
2禁用:set noexpandtab
3简写:set et
3.4.10 Tab用指定空格的个数代替
1启用:set tabstop=# 指定#个空格代替Tab
2简写:set ts=4 #常见的编辑器一般1个tab键用4个空格来表示的;
3.4.11 设置文本宽度
1 set textwidth=65 (vim only)
2 set wrapmargin=15
3.4.12 设置光标所在行的标识线
1启用:set cursorline,简写 set cul
2禁用:set nocursorline
3.4.13 加密
1启用: set key=password
2禁用: set key=
3.4.14 了解更多
1set 帮助
2:help option-list
3:set or :set all
4 命令模式
命令模式,又称为Normal模式,功能强大,只是此模式输入指令并不在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用。
4.1 退出VIM
1ZZ 保存退出(自己经常使用来着,哈哈)
2ZQ 不保存退出
4.2 光标跳转
4.2.1 字符间跳转
1 h: 左 L: 右 j: 下 k: 上
2 #COMMAND:跳转由#指定跳转的字符个数
4.2.2 单词间跳转
1 w:下一个单词的词首
2 e:当前或下一单词的词尾
3 b:当前或前一个单词的词首
4 #COMMAND:由#指定一次跳转的单词数
4.2.3 当前页跳转
1 H:页首 M:页中间行 L:页底
2
3 zt:将光标所在当前行移到屏幕顶端
4 zz:将光标所在当前行移到屏幕中间
5 zb:将光标所在当前行移到屏幕底端
4.2.4 行首行尾跳转
1 ^ 跳转至行首的第一个非空白字符
2 0 跳转至行首
3 $ 跳转至行尾
4.2.5 行间移动
1 #G 或者扩展命令模式下 :# 跳转至由第#行
2 G 最后一行
3 1G, gg 第一行 (gg和G经常使用)
4
5或者:
6:x #在扩展命令行下,输入数字,按回车代表跳转到某行!
4.2.6 句间移动
1 ) 下一句 ( 上一句
2
3#注意,句是用.来隔开的;
4.2.7 段落间移动
1 } 下一段 { 上一段
2
3#注意:段是用空行来分隔的;
4.2.8 命令模式翻屏操作
1Ctrl+f 向文件尾部翻一屏
2Ctrl+b 向文件首部翻一屏
3Ctrl+d 向文件尾部翻半屏
4Ctrl+u 向文件首部翻半屏
4.3 字符编辑
1x 删除光标处的字符
2#x 删除光标处起始的#个字符
3xp 交换光标所在处的字符及其后面字符的位置
4~ 转换大小写
5J 删除当前行后的换行符
4.4 替换命令(replace)
1r 只替换光标所在处的一个字符
2R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式
4.5 删除命令(delete )
1d 删除命令,可结合光标跳转字符,实现范围删除
2
3d$ 删除到行尾 (经常使用!!!)
4d^ 删除到非空行首
5d0 删除到行首
6
7dw (经常使用!!!)
8de
9Db
10
11#COMMAND
12
13
14dd: 剪切光标所在的行
15#dd 多行删除
16dG 删除从本行到后面全部内容: dG 这里注意G一定要大写
17
18
19D:从当前光标位置一直删除到行尾,等同于d$
20
21vim扩展命令行模式下删除当前所有内容:%d
4.6 复制命令(yank)
1y 复制,行为相似于d命令
2
3y$
4y0
5y^
6
7ye
8yw
9yb
10#COMMAND
11
12yy:复制行
13#yy 复制多行
14Y:复制整行
4.7 粘贴命令(paste)
1p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
2P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
3
4#普通模式下,用p命令取回方才删除的数据:
5vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。
6
7举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。
4.8 改变命令(change)
1c: 删除后切换成插入模式
2 c$
3c^
4c0
5
6cb
7ce
8cw
9#COMMAND
10cc:删除当前行并输入新内容,相当于S
11#cc
12C:删除当前光标到行尾,并切换成插入模式,相当于c$

4.9 查找
1/PATTERN:从当前光标所在处向文件尾部查找
2?PATTERN:从当前光标所在处向文件首部查找
3n:与命令同方向
4N:与命令反方向
4.10 撤销更改
1u 撤销最近的更改,相当于windows中ctrl+z
2
3#u 撤销之前多次更改
4U 撤消光标落在这行后所有此行的更改
5Ctrl - r 重做最后的“撤消”更改,相当于windows中crtl+y
6. 重复前一个操作
7#. 重复前一个操作#次
4.11 高级用法
1<start position><command><end position>
2常见Command:y 复制、d 删除、gU 变大写、gu 变小写
3
40y$ 命令
50 → 先到行头
6y → 从这里开始拷贝
7$ → 拷贝到本行最后一个字符
8
9例子:粘贴“wang”100次
10100iwang [ESC]
11
12di" 光标在” “之间,则删除” “之间的内容
13yi( 光标在()之间,则复制()之间的内容
14vi[ 光标在[]之间,则选中[]之间的内容
15dtx 删除字符直到遇见光标之后的第一个 x 字符
16ytx 复制字符直到遇见光标之后的第一个 x 字符
5 可视化模式
在末行有”– VISUAL – “指示,表示在可视化模式;
可视化键可用于与移动键结合使用;
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等;
允许选择的文本块:
(1)v 面向字符,– VISUAL –
(2)V 面向整行,– VISUAL LINE –
(3)ctrl-v 面向块,– VISUAL BLOCK –
案例:批量注释多行与去注释多行方法(很实用)
1(1)注释:ctrl+v 进入列编辑模式(visual block模式),向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。
2(2)删除:按ctrl+v 进入列编辑模式(visual block模式);向下或向上移动光标 ;选中注释部分,然后按d, 就会删除注释符号。
3
4PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。
6 多文件模式
这种方式用的不多!
1vim FILE1 FILE2 FILE3 ...
2:next 下一个
3:prev 前一个
4:first 第一个
5:last 最后一个
6:wall 保存所有
7:qall 不保存退出所有
8:wqall保存退出所有
7 多窗口模式
7.1 多文件分割
1vim -o|-O FILE1 FILE2 ...
2 -o: 水平或上下分割
3-O: 垂直或左右分割(vim only)
4在窗口间切换:Ctrl+w, Arrow
7.2 单文件窗口分割
1Ctrl+w,s:split, 水平分割,上下分屏
2Ctrl+w,v:vertical, 垂直分割,左右分屏
3ctrl+w,q:取消相邻窗口
4ctrl+w,o:取消全部窗口
5:wqall 退出
8 vim的寄存器
1有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终端窗口)间共享(666)。
2寄存器名称a,b,…,z,格式: ”寄存器放在数字和命令之间
3
4范例:
53"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t
6"tp 表示将t寄存器内容粘贴
7
8未指定,将使用无命名寄存器
9
10有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享。
9 标记和宏(macro)
1ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
2'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
3
4qa 录制宏 a,a为宏的名称,末行提示: recording @a
5q 停止录制宏
6@a 执行宏 a
7@@ 重新执行上次执行的宏
10 编辑二进制文件
1#vim编辑二进制文件方法:
2vim -b binaryfile
3#扩展命令模式下,利用xxd命令转换为可读的十六进制
4:%!xxd
5
6#切换至插入模式下,编辑二进制文件
7
8#切换至扩展命令模式下,利用xxd命令转换回二进制
9:%!xxd -r
10#保存退出
1[root@centos76 ~]#dd if=/dev/zero of=test.img bs=1 count=3 #特别注意:用dd命令创建的文件默认就是二进制文件,bs的单位是字节B
23+0 records in
33+0 records out
43 bytes (3 B) copied, 0.0001449 s, 20.7 kB/s
5[root@centos76 ~]#file test.img
6test.img: data #file命令这里的输出为data;
7[root@centos76 ~]#ll
8total 4
9-rw-r--r-- 1 root root 3 Jan 20 07:27 test.img
10[root@centos76 ~]#cat test.img #cat命令查看输出为空,当时是这样了,因为当时仅仅只设置为3B大小
11
12
13[root@centos76 ~]#hexdump -C test.img #虽然次文件内容为空,但用二进制命令查看里面是有内容的。是用0字节进行填充的;
1400000000 00 00 00 |...|
1500000003
16[root@centos76 ~]#xxd test.img
170000000: 0000 00 ...
18[root@centos76 ~]#
19[root@centos76 ~]#vim -b test.img #用vim以二进制(-b参数)方式打开,显示如下:
20^@^@^@
21
22"test.img" [noeol] 1L, 3C
23[root@centos76 ~]#vim test.img #用vim以正常方式打开,显示也是一样的:
24^@^@^@
25
26"test.img" [noeol] 1L, 3C
27[root@centos76 ~]#cat test.img #但是用cat命令查看输出是为空的,当时是这样了,因为当时仅仅只设置为3B大小
28
29#开始进行编辑二进制文件:
30[root@centos76 ~]#vim -b test.img
31^@^@^@
32~
33:%!xxd #进到扩展命令模式,输入"!xxd"
34
35
3600000000: 0000 00 ...
37~
38
39:%!xxd
40
41进到插入模式:开始编辑,插入abc对应的16进制数字:61,62,63(可以用man ascii来查看)
4200000000: 6162 63
43
44:%!xxd -r
45保存退出!
46
47#查看编辑二进制效果:
48[root@centos8 tmp]#ll
49total 4
50-rw-r--r--. 1 root root 3 Jan 20 10:22 test.img
51[root@centos8 tmp]#cat test.img
52abc[root@centos8 tmp]#xxd test.img
5300000000: 6162 63 abc
54[root@centos8 tmp]#hexdump -C test.img
5500000000 61 62 63 |abc|
5600000003
57[root@centos8 tmp]#
11 帮助
(1)vim打开文件后,需求help:
1:help #扩展命令模式下输入help
2:help topic
3Use :q to exit help
(2)vimtutor
1[root@centos76 ~]#which vimtutor
2/usr/bin/vimtutor
3[root@centos76 ~]#vimtutor #这个软件本来就是用来练习vim的,无论如何更改该文件,再次打开,文件内容是不会改变的。

12 vim其它
1#注意:检查 vim 软件包
2在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim,另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。
3$ alias vi
4alias vi='vim'
5$
6$ which vim
7/usr/bin/vim
8$
9$ ls -l /usr/bin/vim
10-rwxr-xr-x. 1 root root 1967072 Apr 5 2012 /usr/bin/vim
11$
12注意,上面的程序文件长列表中并没有显示出任何的链接文件。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。
13
14在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。
15$ alias vi
16-bash: alias: vi: not found
17$
18$ which vi
19/usr/bin/vi
20$
21$ ls -l /usr/bin/vi
22lrwxrwxrwx 1 root root 20 Apr 22 12:39
23/usr/bin/vi -> /etc/alternatives/vi
24$
25$ ls -l /etc/alternatives/vi
26lrwxrwxrwx 1 root root 17 Apr 22 12:33
27/etc/alternatives/vi -> /usr/bin/vim.tiny
28$
29$ ls -l /usr/bin/vim.tiny
30-rwxr-xr-x 1 root root 884360 Jan 2 14:40
31/usr/bin/vim.tiny
32$
33$ readlink -f /usr/bin/vi
34/usr/bin/vim.tiny
35因此,当输入vi命令时,执行的是程序/usr/bin/vim.tiny。vim.tiny只提供少量的vim编辑器功能。如果特别需要vim编辑器,而且使用的又是Ubuntu,那至少应该安装一个基础版本的vim包。
36
37在Ubuntu发行版中安装基础版的vim包非常简单。
38$ sudo apt-get install vim
39[...]
40The following extra packages will be installed:
41 vim-runtime
42Suggested packages:
43 ctags vim-doc vim-scripts
44The following NEW packages will be installed:
45 vim vim-runtime
46[...]
47$
48$ readlink -f /usr/bin/vi
49/usr/bin/vim.basic
50$
51基础版的vim现在安装好了,/usr/bin/vi的文件链接会自动更改成指向/usr/bin/ vim.basic。以后再输入vi命令的时候,使用的就是基础版的vim编辑器了。
13 vim总结图




14 .vimrc脚本版
vim ~/.vimrc
1set ts=4
2set expandtab
3set ignorecase
4set cursorline
5set autoindent
6set paste
7autocmd BufNewFile *.sh exec ":call SetTitle()"
8func SetTitle()
9 if expand("%:e") == 'sh'
10 call setline(1,"#!/bin/bash")
11 call setline(2,"#")
12 call setline(3,"#***************************************************************")
13 call setline(4,"#Author: hg" )
14 call setline(5,"#QQ: 2675263825")
15 call setline(6,"#Date: ".strftime("%Y-%m-%d"))
16 call setline(7,"#FileName: ".expand("%"))
17 call setline(8,"#URL: https://www.onedayxyy.cn")
18 call setline(9,"#Description: The test script" )
19 call setline(10,"#Copyright (c) : ".strftime("%Y")." All rights reserved")
20 call setline(11,"#***************************************************************")
21 call setline(12,"")
22 endif
23endfunc
24autocmd BufNewFile * normal G
测试效果:

关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 博客

🍀 知乎
https://www.zhihu.com/people/foryouone

🍀 语雀
https://www.yuque.com/books/share/34a34d43-b80d-47f7-972e-24a888a8fc5e?# 《云笔记最佳实践》

最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


