vim作为一个强大的,可靠性,效率性极高的文本编辑器,深受使用Linux系统的用户的喜欢,可以毫不夸张的说,不会使用vim文本编辑器,纵使sed,awk,grep三剑客使用的再6,面对海量的文本内容,也是徒呼无奈。
本文旨在揭示vim的神秘面纱,普通的用法并不能提高多少文本编辑的效率,要使用就使用高阶的技巧,对吧。因此,本文不就vim的历史以及它的基础用法做探讨,仅讨论高阶技巧。因此,无vim使用基础的同学可退出(无情劝退!!!!)。
首先,就vim的模式来说,大致分为六种:
一,正常模式
也就是使用vim打开一个文本的时候,所进入的模式,这个模式也可称之为默认模式,基本模式,其他的任意模式均可以通过esc键回退到正常模式。
在该模式下,键盘可使用的按键有:v,p,x,cc,d,dd,i,o,r,R等等, 具体的用法是基础知识,请自行百度。
二,命令模式
在正常模式下输入“/”进入命令行模式,在该模式下可以进行搜索,替换等。该模式主要是针对的是文本内容。
三,末行模式
在正常模式下输入“:” 这个模式叫末行模式,可进行退出vim,vim的设置等等vim的内部交互命令输入。
四,插入模式
这个模式是相对正常模式的,文本文档通过a,i,o(大写和小写共三对)六个字母进入可编辑状态,也是使用率最高的模式。
五,可视模式(也有人叫它视图模式)
此模式针对的是块编辑,也就是选定某一块区域,连续的,快速的,高效的编辑文本。快速选定文本文档内的特定内容全靠这个模式。
六,替换模式
快速的替换文本文档的某些内容,替换方式可控,可自定义。修改文档(注意,不是编写文档)时的常用模式。
vim的高阶用法主要集中在上面所说的二,三,五,六哲几个模式,因此,按照模式划分,依次讲解。讲解用例使用centos系统root根目录下最常见的文件anaconda-ks.cfg进行讲解。
文件内容如下:
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
network --hostname=localhost.localdomain
# Root password
rootpw --iscrypted $6$3Y0z0FD29vhUy/Ed$PRmmeqp284stUb5548cvv9V.1JTgtwSsx4wSi5wicLri1tBIgw15wyhXdLCnoB7tv/7a38OpN2ybou/VNeTHP/
# System services
services --disabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=sda --size=2048
part pv.198 --fstype="lvmpv" --ondisk=sda --size=100351
volgroup centos --pesize=4096 pv.198
logvol /home --fstype="xfs" --size=4092 --name=home --vgname=centos
logvol / --fstype="xfs" --size=61440 --name=root --vgname=centos
logvol /var --fstype="xfs" --size=30720 --name=var --vgname=centos
logvol swap --fstype="swap" --size=4096 --name=swap --vgname=centos
%packages
@^minimal
@core
%end
%addon com_redhat_kdump --disable --reserve-mb='128M'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
首先,vim打开该文件后,即进入正常模式,ctrl +g 可看到文档的基本信息
以上表示,我的光标停留在了49行的第一个字母,vim所打开的文件名是 anaconda-ks.cfg,总共53行,光标在该文本文档的92%处停留。该文件没有被修改过,如果修改了,但还没保存退出,ctrl+g 会这样显示(加了个[Modified])。
切换方式为v或者V或者ctrl+v,这里要说一下了,v,V,ctrl+v 是可视模式的三种状态,v是可视模式的基本模式(可以取得行或者块模式的效果,使用上更为灵活),V是可视模式的行可视模式(以行为单位),ctrl+v是可视模式的块可视模式(以块为单位,块也就是区域需要自己定义),进入可视模式后,复制,粘贴,删除,光标定位仍可使用,具体说,就是y,p,d,h,j,k,l都可使用,因此,配合这些按键就可以达到很多我们想要的结果,不仅有这些按键,我们还有快捷键可以使用!!!!! 也就是ve ,vw,vb。
(1)v
当然,我们如果脱离了其它模式只讲一个单一模式,无疑是耍流氓。比如,需要复制第一行的version,不包括前面的#号,将该单词粘贴到下一行,我们的按键顺序应该是ggwveyo esc p。这里,我们使用了ve组合的快捷键。
ve表示光标处到单词末尾,连续ew,就是连续选取,以单词为单位,注意,不包括空格。vw和ve是一样的,只是包括了空格,也就是认为空格也是一个单位。
vb是向后选择,多个b就是多次向后选取。
vc和vs是删除光标所在字母并进入编辑模式。如果所在行是空行,那么,将删除空行后在下一行行首插入编辑,这里需要提一下cc,这个组合在正常模式下,表示删除光标所在行并进入编辑模式,简单说就是行重写,
等于dd+大o
(2)大v
仍以示例文件为例,如果想要复制文件内的这么两行,怎么做?
network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
network --hostname=localhost.localdomain
思路首先是如何快速的定位到这么两行,然后选取这两行后复制,在粘贴到合适的地方。
定位方法为:/ 后输入network,然后回车。此时,应该已经定位到这么两行了。
Vjyy这个组合命令即可复制这两行了。此时,光标移动到文件末尾,p 即可看到复制的这两行内容了。
大v的作用就是快递选定行的,仅此而已,注意一点,是按行为单位选取。此时,即使使用了hl来调整范围,依然是按行选定。
(3)Ctrl +v
这个没什么好说的,块选择,可以使用webhjkl这些按键快速选择。
小结:可视模式--->插入模式,请使用vc,vs,如果需要快速复制整个文本,那么,命令应该为:ggvG+end+yy,
ve,vw,vb按单词为单位选取(通常需要w,e,b配合,比如wve这样的组合,就是选取一个单词,wvee,选取两个单词,特殊符号算一个单词,),后续处理,自行思考。
那么,如果你认真阅读了以上内容,下面这个问题应该对你是轻而易举的。
问题:把该文件的第四行# Use CDROM installation media 修改为 # Don't use CDROM installation media
答案我就不说了,请各位看官自行思考。
Ctrl+r 和u 是一对,u是撤销修改,按步撤销,Ctrl+r是按步恢复,比如,如果我在文件末尾添加1,2,3,4,5,一个数字占一行,此时文件没有保存,如果,按一次u,回退一个数字,Ctrl+r前进一个数字。注意一点,模式切换一次算一步,不管是什么模式互换。比如,第一步,在末尾按o,写下1,esc,这是第一步,再次o,写下数字2,esc,这算是第二步,依次类推。
正常模式到替换模式是使用键盘的r,替换模式细分为两种,一种是只替换一个字母(小写r),一种是连续替换(大写r)。
小写r用在文档编辑极少的极细微的改动需求时,大写r用在需要大量的修改文档内的某些字段,这里需要注意,替换模式屏蔽所有其他的功能按键哦(除了esc),也就是说,比如在可视模式下,你还可以使用hjkl等等功能按键,但此时,在替换模式下,你在键盘上按的是什么,就会输入什么,直到你按了esc退出替换模式到正常模式为止。因此,替换模式没有什么花里胡哨,方向键是你唯一的定位按键。
该模式是输入:即可进入末尾模式,这里得命令大部分所针对的对象是vim编辑器内部,比如,vim的显示方式(显示高亮,显示行号等等)
nohl 不显示高亮
set number 显示行号 永久显示行号需要编辑文件 vim ~/.vimrc 在此文件内添加 set number
%s/原有内容/要替换的内容/g 全文替换。例如:删除文本文档内的所有注释符号#,应该是首先进入末尾模式,输入: , 然后输入以下命令:%s/#/ /g,全文注释命令如下:%s/^/#/g
window下的文件放到Linux下的空格格式转换 :set ff=unix
(1)
Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按两下ESC,Vim会自动将你选中的所有行首都加上注释,保存退出完成注释。
这里需要注意,一定要按两次esc才会生效。取消注释:Ctrl+v块选择模式,选中所有的#,然后按r+空格即可取消所有注释。
(2)
进入末尾模式,全文注释,命令如下:%s/^/#/g,取消所有注释:%s/^#/ /g
(3)
进入连续替换模式,大写r,逐个修改。虽然可行,但稍显愚蠢。
(4)
awk命令,sed命令,grep命令联合或者单独快速添加注释或者取消注释,本文探讨vim,因此,不予讨论。
(五),
批量排版
进入末尾模式,:ce居中 :le靠左 :ri靠右 指定行数排版,比如,指定1到10行居中,:1,10ce,这里需要注意,只有连续行不能跳行。
使用tab迅速缩进,同居中,只是ce,le,ri这些改成了 > < , > 代表右缩进, < 代表左缩进,比如,11到20行右缩进, :11,20> 只输入:> 表示光标所在行右缩进
全文排版:gg v G end = (这的end是相对键盘里的那个home的键)
需要善于利用cc这个组合键快速删除后并切换到编辑模式,这会提高很多效率,在vim中,需要着重的牢记 w,e,b (W,E,B)这三对以单词和空格为单位的定位按键。为了加深理解,请理解一下命令:
dw 删除一个单词,特殊符号算一个单词,空格隔开的连续的字母以及数字算一个单词,直到下一个单词的词首。(单词定义)
dW 删除一个单词,特殊符号不单独算一个单词,只以空格算一个单词,直到下一个单词的词首。(单词定义不同)
de 删除到本单词末尾,特殊符号算一个单词,空格隔开的连续的字母以及数字算一个单词,直到下一个单词的词尾。(单词定义)
de 删除到本单词末尾,特殊符号不单独算一个单词,空格隔开的连续的字母以及数字算一个单词,直到下一个单词的词尾。(单词定义不同)
dw和de删除操作后光标定位不同,db和dwde基本类似,dE和dB是常用的哦。