Skip to content

vim

Linux文本编辑工具之神vim

目录

[toc]

1 vi和vim简介

在Linux中我们经常编辑修改文本文件,即由ASCII,Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。

文本编辑种类

bash
全屏编辑器: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 命令格式

bash
vim[OPTION]... FILE...

常用选项

bash
+#打开文件后,让光标处于第#行的行首,+默认行尾+/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 )或命令(末)行模式:保存,退出等;

模式转换

命令模式-->插入模式

bash
iinsert,在光标所在处输入I在当前光标所在行的行首输入aappend,在光标所在处后面输入A在当前光标所在行的行尾输入o在当前光标所在行的下方打开一个新行O在当前光标所在行的上方打开一个新行

插入模式 --- ESC----->命令模式

命令模式 ---- :---->扩展命令模式

扩展命令模式 ----ESC,enter---->命令模式

3 扩展命令模式

按“:”进入Ex模式 ,创建一个命令提示符:处于底部的屏幕左侧。

3.1 扩展命令模式基本命令

bash
w写(存)磁盘文件wq写入并退出x写入并退出wq!==ZZ强制保存并退出(普通模式下)X加密(不常用)#取消加密:输入空口令;q退出q!不存盘退出,即使更改都将丢失rfilename#读文件内容到当前文件中 注意!wfilename#将当前文件内容写入另一个文件 注意!!command#执行命令 注意!r!command#读入命令的输出 注意!

3.2 地址定界

格式

bash
:start_pos,end_posCMD

3.2.1 地址定界格式

bash
# #具体第#行,例如2表示第2行#,# #从左侧#表示起始行,到右侧#表示结尾行 #,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行.  #当前行$#最后一行.,$-1#当前行到倒数第二行%#全文,相当于1,$/pattern/  #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式/pat1/,/pat2/#从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束#,/pat/     #从指定行开始,一直找到第一个匹配patttern的行结束/pat/,$    #向下找到第一个匹配patttern的行到整个文件的结尾的所有行

3.2.2 地址定界后跟一个编辑命令

bash
d      #删除y#复制wfile#将范围内的行另存至指定文件中rfile#在指定位置插入指定文件中的所有内容

3.3 查找并替换

格式

bash
s/要查找的内容/替换为的内容/修饰符

说明

要查找的内容:可使用基末正则表达式模式

替换为的内容:不能使用模式,但可以使用\1,\2,...等后向引用符号还可以使用“&”引用前面查找时查找到的整个内容;

修饰符

bash
i#忽略大小写g#全局替换,默认情况下,每一行只替换第一次出现的。gc#全局替换,每次替换前询问

3.3.1 范例:常规替换

bash
:s/root/zxl/g:2,10s/root/zxl/g

3.3.2 范例:查找替换中的分隔符/可替换为其它字符,如:#,@

bash
或者加转义符:(麻烦)s@/etc@/var@gs#/boot#/#i

3.3.3 范例:替换为的内容:不能使用模式,但可以使用\1,\2,...等后向引用符号**;**还可以使用“&”引用前面查找时查找到的整个内容;

bash
:%s/xyz/&er/g表示把所有行里面的xyz全部替换为xyzer。

3.3.4  范例:vi/vim 中如何在每行行首或行尾插入指定字符串?

bash
行首:%s/^/your_word/g行尾:%s/$/your_word/g:/^d----^意思表示以什么开头,,查找以字母d开头的内容:/t$-----$意思表示以什么结尾,,查找以字母t结尾的内容

扩展命令模式下正则表达式应用

3.3.5 范例:分组引用的搜索替代用的最多了。

bash
测试1:#vim新建一个新文件:[root@localhost ~]# vim fa.txtrootrootrootrabtrabtrxyt#现在想在vim编辑界面如何将root替换为rooter?:%s/root/root/g#扩展命令行模式下#替换后效果如下:rooterrooterrooterrabtrabtrxyt
bash
测试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 行号

bash
显示:setnumber,简写setnu取消显示:setnonumber,简写setnonu

3.4.2 忽略字符的大小写

bash
启用:setignorecase,简写setic不忽略:setnoic

3.4.3 自动缩进

bash
启用:setautoindent,简写setai禁用:setnoai

注意:

自动缩进带来的一个缺点就是:复制粘贴会出问题。。。。。缩进乱了。。。。

不同编辑器的tab键(1个tab键代表几个空格)不同,可能会造成影响。。。。。

vim中默认一个tab键需要用8个空格来代替:

现象如下:

解决办法

:set paste保留原格式

3.4.4 复制保留格式

bash
启用:setpaste禁用:setnopaste

3.4.5 显示Tab(^I)和换行符($)显示

bash
启用:setlist禁用:setnolist
bash
#vim fstababc$#每个换行符后面都会出现一个美元符号$123$^Ic^Icdd$ #如果里面含有tab输入,这里就会显示这个`^I`符号!~:setlist

3.4.6 高亮搜索

bash
启用:sethlsearch禁用:setnohlsearch

3.4.7 语法高亮

bash
启用:syntaxon禁用:syntaxoff#注意:语法高亮默认是开启的;#注意:cp /etc/passwd /data/下的区别;(后者默认不会出现语法高亮,因为系统认为/etc/目录下就是文件的配置文件所在目录,因此才会显示语法高亮,而后者不是)

3.4.8 文件格式

bash
启用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 用空格代替

bash
启用:setexpandtab#默认为8个空格代替Tab禁用:setnoexpandtab简写:setet

3.4.10 Tab用指定空格的个数代替

bash
启用:settabstop=#指定#个空格代替Tab简写:setts=4#常见的编辑器一般1个tab键用4个空格来表示的;

3.4.11 设置文本宽度

bash
settextwidth=65(vim only)setwrapmargin=15

3.4.12 设置光标所在行的标识线

bash
启用:setcursorline,简写setcul禁用:setnocursorline

3.4.13 加密

bash
启用:setkey=password禁用:setkey=

3.4.14 了解更多

bash
set帮助:helpoption-list:setor:setall

4 命令模式

命令模式,又称为Normal模式,功能强大,只是此模式输入指令并不在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用。

4.1 退出VIM

bash
ZZ保存退出(自己经常使用来着,哈哈)ZQ不保存退出

4.2 光标跳转

4.2.1 字符间跳转

bash
h:L:j:k:#COMMAND:跳转由#指定跳转的字符个数

4.2.2 单词间跳转

bash
w:下一个单词的词首e:当前或下一单词的词尾b:当前或前一个单词的词首#COMMAND:由#指定一次跳转的单词数

4.2.3 当前页跳转

bash
H:页首M:页中间行L:页底zt:将光标所在当前行移到屏幕顶端zz:将光标所在当前行移到屏幕中间zb:将光标所在当前行移到屏幕底端

4.2.4 行首行尾跳转

bash
^跳转至行首的第一个非空白字符0跳转至行首$跳转至行尾

4.2.5 行间移动

bash
#G 或者扩展命令模式下 :# 跳转至由第#行G最后一行1G,gg第一行(gg和G经常使用)或者::x#在扩展命令行下,输入数字,按回车代表跳转到某行!

4.2.6 句间移动

bash
) 下一句 (上一句#注意,句是用.来隔开的;

4.2.7 段落间移动

bash
} 下一段 {上一段#注意:段是用空行来分隔的;

4.2.8 命令模式翻屏操作

bash
Ctrl+f向文件尾部翻一屏Ctrl+b向文件首部翻一屏Ctrl+d向文件尾部翻半屏Ctrl+u向文件首部翻半屏

4.3 字符编辑

bash
x删除光标处的字符#x 删除光标处起始的#个字符xp交换光标所在处的字符及其后面字符的位置~转换大小写J删除当前行后的换行符

4.4 替换命令(replace)

bash
r只替换光标所在处的一个字符R切换成REPLACE模式(在末行出现--REPLACE--提示),按ESC回到命令模式

4.5 删除命令(delete )

bash
d删除命令,可结合光标跳转字符,实现范围删除d$删除到行尾(经常使用!!!)d^删除到非空行首d0删除到行首dw(经常使用!!!)deDb#COMMANDdd:剪切光标所在的行#dd 多行删除dG删除从本行到后面全部内容:dG这里注意G一定要大写D:从当前光标位置一直删除到行尾,等同于d$vim扩展命令行模式下删除当前所有内容:%d

4.6 复制命令(yank)

bash
y复制,行为相似于d命令y$y0y^yeywyb#COMMANDyy:复制行#yy 复制多行Y:复制整行

4.7 粘贴命令(paste)

bash
p缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面P缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面#普通模式下,用p命令取回方才删除的数据:vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。

4.8 改变命令(change)

bash
c:删除后切换成插入模式c$c^c0cbcecw#COMMANDcc:删除当前行并输入新内容,相当于S#ccC:删除当前光标到行尾,并切换成插入模式,相当于c$

4.9 查找

bash
/PATTERN:从当前光标所在处向文件尾部查找?PATTERN:从当前光标所在处向文件首部查找n:与命令同方向N:与命令反方向

4.10 撤销更改

bash
u撤销最近的更改,相当于windows中ctrl+z#u 撤销之前多次更改U撤消光标落在这行后所有此行的更改Ctrl-r重做最后的“撤消”更改,相当于windows中crtl+y.重复前一个操作#. 重复前一个操作#次

4.11 高级用法

bash
<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 --

案例:批量注释多行与去注释多行方法(很实用)

bash
(1)注释:ctrl+v进入列编辑模式(visualblock模式),向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。(2)删除:按ctrl+v进入列编辑模式(visualblock模式);向下或向上移动光标;选中注释部分,然后按d,就会删除注释符号。PS:当然不一定是shell的注释符”#”,也可以是”
:next下一个:prev前一个:first第一个:last最后一个:wall保存所有:qall不保存退出所有:wqall保存退出所有

7 多窗口模式

7.1 多文件分割

bash
vim-o|-OFILE1FILE2...-o:水平或上下分割-O:垂直或左右分割(vimonly)在窗口间切换:Ctrl+w,Arrow

7.2 单文件窗口分割

bash
Ctrl+w,s:split,水平分割,上下分屏Ctrl+w,v:vertical,垂直分割,左右分屏ctrl+w,q:取消相邻窗口ctrl+w,o:取消全部窗口:wqall退出

8 vim的寄存器

bash
有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)

bash
ma将当前位置标记为a,26个字母均可做标记,mbmc等等'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用qa 录制宏 a,a为宏的名称,末行提示: recording @aq 停止录制宏@a 执行宏 a@@ 重新执行上次执行的宏

10 编辑二进制文件

bash
#vim编辑二进制文件方法:vim-bbinaryfile#扩展命令模式下,利用xxd命令转换为可读的十六进制:%!xxd#切换至插入模式下,编辑二进制文件#切换至扩展命令模式下,利用xxd命令转换回二进制:%!xxd -r#保存退出
bash
[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:

bash
:help#扩展命令模式下输入help:helptopicUse:qtoexithelp

(2)vimtutor

bash
[root@centos76 ~]#which vimtutor/usr/bin/vimtutor[root@centos76 ~]#vimtutor #这个软件本来就是用来练习vim的,无论如何更改该文件,再次打开,文件内容是不会改变的。

12 vim其它

bash
#注意:检查 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

bash
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

测试效果:

image-20240329122752062

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

🍀 微信公众号

《云原生架构师实战》

🍀 csdn

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新