vim
Linux文本编辑工具之神vim
目录
[toc]
1 vi和vim简介
在Linux中我们经常编辑修改文本文件,即由ASCII,Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。
文本编辑种类:
全屏编辑器:nano(字符工具),gedit(图形化工具),vi,vim行编辑器:sedvi:Visualeditor,文本编辑器,是Linux必备工具之一,功能强大,学习曲线较陡峭,学习难度大vim:VIsualeditoriMproved,和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匹配到的行行首-bfile二进制方式打开文件-dfile1file2…比较多个文件,相当于vimdiff-mfile 只读打开文件-efile 直接进入ex模式,相当于执行exfile-yfile Easymode(like "evim",modeless),直接可以操作文件,ctrl+o:wq|q!保存和不保存退出
说明:
如果该文件存在,文件被打开并显示内容
如果该文件不存在,当编辑后第一次存盘时创建它
2.2 三种主要模式和转换
vim 是一个模式编辑器,击键行为是依赖于 vim的 的“模式”。
三种常见模式:
(1)命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本;
(2)插入(Insert)或编辑模式:用于修改文本;
(3)扩展命令(extended command )或命令(末)行模式:保存,退出等;
模式转换:
命令模式-->插入模式:
iinsert,在光标所在处输入I在当前光标所在行的行首输入aappend,在光标所在处后面输入A在当前光标所在行的行尾输入o在当前光标所在行的下方打开一个新行O在当前光标所在行的上方打开一个新行
插入模式 --- ESC----->命令模式
命令模式 ---- :---->扩展命令模式
扩展命令模式 ----ESC,enter---->命令模式
3 扩展命令模式
按“:”进入Ex模式 ,创建一个命令提示符:处于底部的屏幕左侧。
3.1 扩展命令模式基本命令
w写(存)磁盘文件wq写入并退出x写入并退出wq!==ZZ强制保存并退出(普通模式下)X加密(不常用)#取消加密:输入空口令;q退出q!不存盘退出,即使更改都将丢失rfilename#读文件内容到当前文件中 注意!wfilename#将当前文件内容写入另一个文件 注意!!command#执行命令 注意!r!command#读入命令的输出 注意!
3.2 地址定界
格式:
:start_pos,end_posCMD
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#复制wfile#将范围内的行另存至指定文件中rfile#在指定位置插入指定文件中的所有内容
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@gs#/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.txtrootrootrootrabtrabtrxyt#现在想在vim编辑界面如何将root替换为rooter?:%s/root/root/g#扩展命令行模式下#替换后效果如下:rooterrooterrooterrabtrabtrxyt
测试2:#vim新建一个新文件:[root@localhost ~]# vim fa.txtrootrootrootrabtrabtrxyt#现在想在vim编辑界面如何将r..t替换为admin(r..t)er?:%s#\(r..t\)#admin\1er#g #扩展命令行模式下#替换后效果如下:adminrooteradminrooteradminrooteradminrabteradminrabteradminrxyter
3.4 定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存。
配置文件:
/etc/vimrc #全局
~/.vimrc #个人
老师自定义vimrc配置脚本(见“脚本库”)
3.4.1 行号
显示:setnumber,简写setnu取消显示:setnonumber,简写setnonu
3.4.2 忽略字符的大小写
启用:setignorecase,简写setic不忽略:setnoic
3.4.3 自动缩进
启用:setautoindent,简写setai禁用:setnoai
注意:
自动缩进
带来的一个缺点就是:复制粘贴会出问题。。。。。缩进乱了。。。。
不同编辑器的tab键(1个tab键代表几个空格)不同,可能会造成影响。。。。。
vim中默认一个tab键需要用8个空格来代替:
现象如下:
解决办法:
:set paste保留原格式
3.4.4 复制保留格式
启用:setpaste禁用:setnopaste
3.4.5 显示Tab(^I)和换行符($)显示
启用:setlist禁用:setnolist
#vim fstababc$#每个换行符后面都会出现一个美元符号$123$^Ic^Icdd$ #如果里面含有tab输入,这里就会显示这个`^I`符号!~:setlist
3.4.6 高亮搜索
启用:sethlsearch禁用:setnohlsearch
3.4.7 语法高亮
启用:syntaxon禁用:syntaxoff#注意:语法高亮默认是开启的;#注意:cp /etc/passwd /data/下的区别;(后者默认不会出现语法高亮,因为系统认为/etc/目录下就是文件的配置文件所在目录,因此才会显示语法高亮,而后者不是)
3.4.8 文件格式
启用windows格式:setfileformat=dos启用unix格式:setfileformat=unix简写setff=dos|unix注意:hexdump-Cfile#hexdump命令可以用来确认文件的格式(linux格式换行符只有oa,而winodws的同时有0d 0a)dos2unixfile#linux-->winodws;unix2dosfile#winodws-->linux;
3.4.9 Tab 用空格代替
启用:setexpandtab#默认为8个空格代替Tab禁用:setnoexpandtab简写:setet
3.4.10 Tab用指定空格的个数代替
启用:settabstop=#指定#个空格代替Tab简写:setts=4#常见的编辑器一般1个tab键用4个空格来表示的;
3.4.11 设置文本宽度
settextwidth=65(vim only)setwrapmargin=15
3.4.12 设置光标所在行的标识线
启用:setcursorline,简写setcul禁用:setnocursorline
3.4.13 加密
启用:setkey=password禁用:setkey=
3.4.14 了解更多
set帮助:helpoption-list:setor:setall
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(经常使用!!!)deDb#COMMANDdd:剪切光标所在的行#dd 多行删除dG删除从本行到后面全部内容:dG这里注意G一定要大写D:从当前光标位置一直删除到行尾,等同于d$vim扩展命令行模式下删除当前所有内容:%d
4.6 复制命令(yank)
y复制,行为相似于d命令y$y0y^yeywyb#COMMANDyy:复制行#yy 复制多行Y:复制整行
4.7 粘贴命令(paste)
p缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面P缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面#普通模式下,用p命令取回方才删除的数据:vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。
4.8 改变命令(change)
c:删除后切换成插入模式c$c^c0cbcecw#COMMANDcc:删除当前行并输入新内容,相当于S#ccC:删除当前光标到行尾,并切换成插入模式,相当于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进入列编辑模式(visualblock模式),向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。(2)删除:按ctrl+v进入列编辑模式(visualblock模式);向下或向上移动光标;选中注释部分,然后按d,就会删除注释符号。PS:当然不一定是shell的注释符”#”,也可以是”
:next下一个:prev前一个:first第一个:last最后一个:wall保存所有:qall不保存退出所有:wqall保存退出所有
7 多窗口模式
7.1 多文件分割
vim-o|-OFILE1FILE2...-o:水平或上下分割-O:垂直或左右分割(vimonly)在窗口间切换: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 @aq 停止录制宏@a 执行宏 a@@ 重新执行上次执行的宏
10 编辑二进制文件
#vim编辑二进制文件方法:vim-bbinaryfile#扩展命令模式下,利用xxd命令转换为可读的十六进制:%!xxd#切换至插入模式下,编辑二进制文件#切换至扩展命令模式下,利用xxd命令转换回二进制:%!xxd -r#保存退出
[root@centos76 ~]#dd if=/dev/zeroof=test.imgbs=1count=3#特别注意:用dd命令创建的文件默认就是二进制文件,bs的单位是字节B3+0recordsin3+0recordsout3bytes(3 B) copied,0.0001449 s,20.7 kB/s[root@centos76 ~]#file test.img test.img:data#file命令这里的输出为data;[root@centos76 ~]#lltotal4-rw-r--r--1rootroot3Jan2007:27test.img[root@centos76 ~]#cat test.img #cat命令查看输出为空,当时是这样了,因为当时仅仅只设置为3B大小[root@centos76 ~]#hexdump -C test.img #虽然次文件内容为空,但用二进制命令查看里面是有内容的。是用0字节进行填充的;00000000000000|...|00000003[root@centos76 ~]#xxd test.img 0000000:000000...[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:000000...~:%!xxd进到插入模式:开始编辑,插入abc对应的16进制数字:61,62,63(可以用manascii来查看)00000000:616263:%!xxd-r保存退出!#查看编辑二进制效果:[root@centos8 tmp]#lltotal4-rw-r--r--.1rootroot3Jan2010:22test.img[root@centos8 tmp]#cat test.img abc[root@centos8tmp]#xxdtest.img00000000:616263abc[root@centos8 tmp]#hexdump -C test.img 00000000616263|abc|00000003[root@centos8 tmp]#
11 帮助
(1)vim打开文件后,需求help:
:help#扩展命令模式下输入help:helptopicUse:qtoexithelp
(2)vimtutor
[root@centos76 ~]#which vimtutor/usr/bin/vimtutor[root@centos76 ~]#vimtutor #这个软件本来就是用来练习vim的,无论如何更改该文件,再次打开,文件内容是不会改变的。
12 vim其它
#注意:检查 vim 软件包在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim,另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。$aliasvialiasvi='vim'$$whichvim/usr/bin/vim$$ls-l/usr/bin/vim-rwxr-xr-x.1rootroot1967072Apr52012/usr/bin/vim$注意,上面的程序文件长列表中并没有显示出任何的链接文件。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。$aliasvi-bash:alias:vi:notfound$$whichvi/usr/bin/vi$$ls-l/usr/bin/vilrwxrwxrwx1rootroot20Apr2212:39/usr/bin/vi->/etc/alternatives/vi$$ls-l/etc/alternatives/vilrwxrwxrwx1rootroot17Apr2212:33/etc/alternatives/vi->/usr/bin/vim.tiny$$ls-l/usr/bin/vim.tiny-rwxr-xr-x1rootroot884360Jan214: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包非常简单。$sudoapt-getinstallvim[...] Thefollowingextrapackageswillbeinstalled:vim-runtimeSuggestedpackages:ctagsvim-docvim-scriptsThefollowingNEWpackageswillbeinstalled:vimvim-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
setts=4setexpandtabsetignorecasesetcursorlinesetautoindentsetpasteautocmdBufNewFile*.shexec":call SetTitle()"funcSetTitle()ifexpand("%:e") =='sh'callsetline(1,"#!/bin/bash")callsetline(2,"#")callsetline(3,"#***************************************************************")callsetline(4,"#Author:hg")callsetline(5,"#QQ:2675263825")callsetline(6,"#Date:".strftime("%Y-%m-%d"))callsetline(7,"#FileName:".expand("%"))callsetline(8,"#URL:https:callsetline(9,"#Description:The test script")callsetline(10,"#Copyright (c) :".strftime("%Y")."All rights reserved")callsetline(11,"#***************************************************************")callsetline(12,"")endifendfuncautocmdBufNewFile*normalG
测试效果:
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 csdn
上次更新时间: