vim
Linux文本编辑工具之神vim
目录
[toc]
1 vi和vim简介
在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。
文本编辑种类:
全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim
行编辑器:sed
vi:Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大
vim:VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件
官网:www.vim.org
其他相关编辑器: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 命令格式
vim [OPTION]... FILE...
常用选项:
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
-y file Easy mode (like "evim", modeless),直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出
说明:
如果该文件存在,文件被打开并显示内容
如果该文件不存在,当编辑后第一次存盘时创建它
2.2 三种主要模式和转换
vim 是一个模式编辑器,击键行为是依赖于 vim的 的“模式”。
三种常见模式:
(1)命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本;
(2)插入(Insert)或编辑模式:用于修改文本;
(3)扩展命令(extended command )或命令(末)行模式:保存,退出等;
模式转换:
命令模式-->插入模式:
i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
插入模式 --- ESC-----> 命令模式
命令模式 ---- : ----> 扩展命令模式
扩展命令模式 ----ESC,enter----> 命令模式
3 扩展命令模式
按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧。
3.1 扩展命令模式基本命令
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
wq! == ZZ 强制保存并退出(普通模式下)
X 加密(不常用) #取消加密:输入空口令;
q 退出
q! 不存盘退出,即使更改都将丢失
r filename #读文件内容到当前文件中 注意!
w filename #将当前文件内容写入另一个文件 注意!
!command #执行命令 注意!
r!command #读入命令的输出 注意!
3.2 地址定界
格式:
:start_pos,end_pos CMD
3.2.1 地址定界格式
# #具体第#行,例如2表示第2行
#,# #从左侧#表示起始行,到右侧#表示结尾行
#,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
. #当前行
$ #最后一行
.,$-1 #当前行到倒数第二行
% #全文, 相当于1,$
/pattern/ #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ #从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$ #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
3.2.2 地址定界后跟一个编辑命令
d #删除
y #复制
w file #将范围内的行另存至指定文件中
r file #在指定位置插入指定文件中的所有内容
3.3 查找并替换
格式:
s/要查找的内容/替换为的内容/修饰符
说明:
要查找的内容:可使用基末正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容;
修饰符:
i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现的。
gc #全局替换,每次替换前询问
3.3.1 范例:常规替换
:s/root/zxl/g
:2,10s/root/zxl/g
3.3.2 范例:查找替换中的分隔符/可替换为其它字符,如:#,@
或者加转义符:(麻烦)
s@/etc@/var@g
s#/boot#/#i
3.3.3 范例:替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号**;**还可以使用“&”引用前面查找时查找到的整个内容;
:% s/xyz/&er/g表示把所有行里面的xyz全部替换为xyzer。
3.3.4 范例:vi/vim 中如何在每行行首或行尾插入指定字符串?
行首 :% s/^/your_word/g
行尾 :% s/$/your_word/g
:/^d ----^意思表示以什么开头 ,,查找以字母d开头的内容
:/t$ -----$意思表示以什么结尾,,查找以字母t结尾的内容
扩展命令模式下正则表达式应用
3.3.5 范例:分组引用的搜索替代用的最多了。
测试1:
#vim新建一个新文件:
[root@localhost ~]# vim fa.txt
root root root
rabt rabt rxyt
#现在想在vim编辑界面如何将root替换为rooter?
:%s/root/root/g #扩展命令行模式下
#替换后效果如下:
rooter rooter rooter
rabt rabt rxyt
测试2:
#vim新建一个新文件:
[root@localhost ~]# vim fa.txt
root root root
rabt rabt rxyt
#现在想在vim编辑界面如何将r..t替换为admin(r..t)er?
:%s#\(r..t\)#admin\1er#g #扩展命令行模式下
#替换后效果如下:
adminrooter adminrooter adminrooter
adminrabter adminrabter adminrxyter
3.4 定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存。
配置文件:
/etc/vimrc #全局
~/.vimrc #个人
老师自定义vimrc配置脚本(见“脚本库”)
3.4.1 行号
显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu
3.4.2 忽略字符的大小写
启用:set ignorecase,简写 set ic
不忽略:set noic
3.4.3 自动缩进
启用:set autoindent,简写 set ai
禁用:set noai
注意:
自动缩进
带来的一个缺点就是:复制粘贴会出问题。。。。。缩进乱了。。。。
不同编辑器的tab键(1个tab键代表几个空格)不同,可能会造成影响。。。。。
vim中默认一个tab键需要用8个空格来代替:
现象如下:
解决办法:
:set paste保留原格式
3.4.4 复制保留格式
启用:set paste
禁用:set nopaste
3.4.5 显示Tab(^I)和换行符($)显示
启用:set list
禁用:set nolist
#vim fstab
abc$ #每个换行符后面都会出现一个美元符号$
123$
^Ic ^Icdd$ #如果里面含有tab输入,这里就会显示这个`^I`符号!
~
:set list
3.4.6 高亮搜索
启用:set hlsearch
禁用:set nohlsearch
3.4.7 语法高亮
启用:syntax on
禁用:syntax off
#注意:语法高亮默认是开启的;
#注意:cp /etc/passwd /data/下的区别;(后者默认不会出现语法高亮,因为系统认为/etc/目录下就是文件的配置文件所在目录,因此才会显示语法高亮,而后者不是)
3.4.8 文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix
注意:
hexdump -C file #hexdump命令可以用来确认文件的格式(linux格式换行符只有oa,而winodws的同时有0d 0a)
dos2unix file #linux-->winodws;
unix2dos file #winodws-->linux;
3.4.9 Tab 用空格代替
启用:set expandtab #默认为8个空格代替Tab
禁用:set noexpandtab
简写:set et
3.4.10 Tab用指定空格的个数代替
启用:set tabstop=# 指定#个空格代替Tab
简写:set ts=4 #常见的编辑器一般1个tab键用4个空格来表示的;
3.4.11 设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15
3.4.12 设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set nocursorline
3.4.13 加密
启用: set key=password
禁用: set key=
3.4.14 了解更多
set 帮助
:help option-list
:set or :set all
4 命令模式
命令模式,又称为Normal模式,功能强大,只是此模式输入指令并不在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用。
4.1 退出VIM
ZZ 保存退出(自己经常使用来着,哈哈)
ZQ 不保存退出
4.2 光标跳转
4.2.1 字符间跳转
h: 左 L: 右 j: 下 k: 上
#COMMAND:跳转由#指定跳转的字符个数
4.2.2 单词间跳转
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数
4.2.3 当前页跳转
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
4.2.4 行首行尾跳转
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾
4.2.5 行间移动
#G 或者扩展命令模式下 :# 跳转至由第#行
G 最后一行
1G, gg 第一行 (gg和G经常使用)
或者:
:x #在扩展命令行下,输入数字,按回车代表跳转到某行!
4.2.6 句间移动
) 下一句 ( 上一句
#注意,句是用.来隔开的;
4.2.7 段落间移动
} 下一段 { 上一段
#注意:段是用空行来分隔的;
4.2.8 命令模式翻屏操作
Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏
4.3 字符编辑
x 删除光标处的字符
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符
4.4 替换命令(replace)
r 只替换光标所在处的一个字符
R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式
4.5 删除命令(delete )
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除到行尾 (经常使用!!!)
d^ 删除到非空行首
d0 删除到行首
dw (经常使用!!!)
de
Db
#COMMAND
dd: 剪切光标所在的行
#dd 多行删除
dG 删除从本行到后面全部内容: dG 这里注意G一定要大写
D:从当前光标位置一直删除到行尾,等同于d$
vim扩展命令行模式下删除当前所有内容:%d
4.6 复制命令(yank)
y 复制,行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy 复制多行
Y:复制整行
4.7 粘贴命令(paste)
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
#普通模式下,用p命令取回方才删除的数据:
vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。
举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。
4.8 改变命令(change)
c: 删除后切换成插入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除当前行并输入新内容,相当于S
#cc
C:删除当前光标到行尾,并切换成插入模式,相当于c$
4.9 查找
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
4.10 撤销更改
u 撤销最近的更改,相当于windows中ctrl+z
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改,相当于windows中crtl+y
. 重复前一个操作
#. 重复前一个操作#次
4.11 高级用法
<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符
例子:粘贴“wang”100次
100iwang [ESC]
di" 光标在” “之间,则删除” “之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符
5 可视化模式
在末行有”-- VISUAL -- “指示,表示在可视化模式;
可视化键可用于与移动键结合使用;
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等;
允许选择的文本块:
(1)v 面向字符,-- VISUAL --
(2)V 面向整行,-- VISUAL LINE --
(3)ctrl-v 面向块,-- VISUAL BLOCK --
案例:批量注释多行与去注释多行方法(很实用)
(1)注释:ctrl+v 进入列编辑模式(visual block模式),向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。
(2)删除:按ctrl+v 进入列编辑模式(visual block模式);向下或向上移动光标 ;选中注释部分,然后按d, 就会删除注释符号。
PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。
6 多文件模式
这种方式用的不多!
vim FILE1 FILE2 FILE3 ...
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall保存退出所有
7 多窗口模式
7.1 多文件分割
vim -o|-O FILE1 FILE2 ...
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow
7.2 单文件窗口分割
Ctrl+w,s:split, 水平分割,上下分屏
Ctrl+w,v:vertical, 垂直分割,左右分屏
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出
8 vim的寄存器
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终端窗口)间共享(666)。
寄存器名称a,b,…,z,格式: ”寄存器放在数字和命令之间
范例:
3"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t
"tp 表示将t寄存器内容粘贴
未指定,将使用无命名寄存器
有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享。
9 标记和宏(macro)
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称,末行提示: recording @a
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏
10 编辑二进制文件
#vim编辑二进制文件方法:
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
#切换至插入模式下,编辑二进制文件
#切换至扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
#保存退出
[root@centos76 ~]#dd if=/dev/zero of=test.img bs=1 count=3 #特别注意:用dd命令创建的文件默认就是二进制文件,bs的单位是字节B
3+0 records in
3+0 records out
3 bytes (3 B) copied, 0.0001449 s, 20.7 kB/s
[root@centos76 ~]#file test.img
test.img: data #file命令这里的输出为data;
[root@centos76 ~]#ll
total 4
-rw-r--r-- 1 root root 3 Jan 20 07:27 test.img
[root@centos76 ~]#cat test.img #cat命令查看输出为空,当时是这样了,因为当时仅仅只设置为3B大小
[root@centos76 ~]#hexdump -C test.img #虽然次文件内容为空,但用二进制命令查看里面是有内容的。是用0字节进行填充的;
00000000 00 00 00 |...|
00000003
[root@centos76 ~]#xxd test.img
0000000: 0000 00 ...
[root@centos76 ~]#
[root@centos76 ~]#vim -b test.img #用vim以二进制(-b参数)方式打开,显示如下:
^@^@^@
"test.img" [noeol] 1L, 3C
[root@centos76 ~]#vim test.img #用vim以正常方式打开,显示也是一样的:
^@^@^@
"test.img" [noeol] 1L, 3C
[root@centos76 ~]#cat test.img #但是用cat命令查看输出是为空的,当时是这样了,因为当时仅仅只设置为3B大小
#开始进行编辑二进制文件:
[root@centos76 ~]#vim -b test.img
^@^@^@
~
:%!xxd #进到扩展命令模式,输入"!xxd"
00000000: 0000 00 ...
~
:%!xxd
进到插入模式:开始编辑,插入abc对应的16进制数字:61,62,63(可以用man ascii来查看)
00000000: 6162 63
:%!xxd -r
保存退出!
#查看编辑二进制效果:
[root@centos8 tmp]#ll
total 4
-rw-r--r--. 1 root root 3 Jan 20 10:22 test.img
[root@centos8 tmp]#cat test.img
abc[root@centos8 tmp]#xxd test.img
00000000: 6162 63 abc
[root@centos8 tmp]#hexdump -C test.img
00000000 61 62 63 |abc|
00000003
[root@centos8 tmp]#
11 帮助
(1)vim打开文件后,需求help:
:help #扩展命令模式下输入help
:help topic
Use :q to exit help
(2)vimtutor
[root@centos76 ~]#which vimtutor
/usr/bin/vimtutor
[root@centos76 ~]#vimtutor #这个软件本来就是用来练习vim的,无论如何更改该文件,再次打开,文件内容是不会改变的。
12 vim其它
#注意:检查 vim 软件包
在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim,另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。
$ alias vi
alias vi='vim'
$
$ which vim
/usr/bin/vim
$
$ ls -l /usr/bin/vim
-rwxr-xr-x. 1 root root 1967072 Apr 5 2012 /usr/bin/vim
$
注意,上面的程序文件长列表中并没有显示出任何的链接文件。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。
在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。
$ alias vi
-bash: alias: vi: not found
$
$ which vi
/usr/bin/vi
$
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Apr 22 12:39
/usr/bin/vi -> /etc/alternatives/vi
$
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 Apr 22 12:33
/etc/alternatives/vi -> /usr/bin/vim.tiny
$
$ ls -l /usr/bin/vim.tiny
-rwxr-xr-x 1 root root 884360 Jan 2 14:40
/usr/bin/vim.tiny
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.tiny
因此,当输入vi命令时,执行的是程序/usr/bin/vim.tiny。vim.tiny只提供少量的vim编辑器功能。如果特别需要vim编辑器,而且使用的又是Ubuntu,那至少应该安装一个基础版本的vim包。
在Ubuntu发行版中安装基础版的vim包非常简单。
$ sudo apt-get install vim
[...]
The following extra packages will be installed:
vim-runtime
Suggested packages:
ctags vim-doc vim-scripts
The following NEW packages will be installed:
vim vim-runtime
[...]
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
$
基础版的vim现在安装好了,/usr/bin/vi的文件链接会自动更改成指向/usr/bin/ vim.basic。以后再输入vi命令的时候,使用的就是基础版的vim编辑器了。
13 vim总结图
14 .vimrc脚本版
vim ~/.vimrc
set ts=4
set expandtab
set ignorecase
set cursorline
set autoindent
set paste
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#***************************************************************")
call setline(4,"#Author: hg" )
call setline(5,"#QQ: 2675263825")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: https://www.onedayxyy.cn")
call setline(9,"#Description: The test script" )
call setline(10,"#Copyright (c) : ".strftime("%Y")." All rights reserved")
call setline(11,"#***************************************************************")
call setline(12,"")
endif
endfunc
autocmd BufNewFile * normal G
测试效果:
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 博客
www.onlyyou520.com
🍀 知乎
https://www.zhihu.com/people/foryouone
🍀 语雀
https://www.yuque.com/books/share/34a34d43-b80d-47f7-972e-24a888a8fc5e?# 《云笔记最佳实践》
最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!