您的位置:首页 > 运维架构 > Shell

shell浅谈之文本处理工具Vim

2015-01-04 22:10 477 查看


一、简介

Vim是一个类似于Vi的文本编辑器,在Vi的基础上增加了很多新的特性。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。


二、详解

1、vim操作

(1)文本编辑器分为:行编辑器如sed(流编辑器)等和全屏幕编辑器如emacs、vi、vim(支持高亮、插件等高级功能)等。

(2)vim又称为模式化编辑器,包括命令模式、输入模式和末行模式。

(3)vim +16 a.cpp表示打开a.cpp文件,光标跳到第16行第一个字符。而vim + a.cpp是光标跳到文件最后一行。vim +/PATTERN a.cpp是光标跳到被模式第一次匹配到的行的行首。

(4)vim编辑模式下输入i:当前光标所在字符前面插入,a:当前光标所在字符后面插入,o:当前光标所在行的下方新增空白行并输入。I:当前光标所在行的行首插入,A:当前光标所在行的行尾插入,O:当前光标所在行的上方新增空白行并输入。

(5)光标字符跳转,h、j、k、l(右手在键盘上的位置)分别实现光标向左、下、上、右移动。

光标单词跳转,w:跳转至下一个单词的词首,e:跳转至后面一个的词尾,b:跳转至前面的一个词首。

光标行跳转,^:跳转至行首的第一次非空白字符处,0(数字):跳转到绝对行首,$:跳到绝对行尾。

光标行间跳转,#G跳转到第几行,G:跳到文件末尾,也可在末行模式下输入行号回车即可。

(6)翻屏操作,ctrl+f向前移动一屏,ctrl+b向后移动一屏,crtl+d向前移动半屏,crtl+u向后移动半屏。

(7)删除操作(仍保存在vim的缓冲区中),x:删除光标所在位置后面的一个字符,#x:删除光标所在位置后面的#个字符。X:删除光标前的一个字符,#X:删除光标前的#个字符,dw:删除光标所在处的单词,d$:删除从光标开始到行尾的单词,d0:删除从光标前到行首的单词,dd:删除光标所在行,#dd:删除从光标所在行的#行。

末行模式下的删除:1,nd(删除1~n行),其中.表示当前行,$表示最后一行,相对地址定界:+n,-n(如1, +5d),/PATTERN1/,/PATTERN2/d从第一次模式PATTERN1匹配到第一次模式PATTERN2匹配到所有行。

(8)粘贴操作,p:若删除或复制的是整行,则在当前光标所在行下方粘贴。

若删除的是单词或行的部分,则在当前光标所在处后方粘贴。

P(大写):若删除或复制的是整行,则在当前光标所在行上方粘贴。

若删除的是单词或行的部分,则在当前光标所在处前方粘贴。

(9)复制操作,yw:复制光标所在处的单词,#yw:复制从光标所在处后的#个单词,yy:复制光标所在行,#yy复制从光标所在行的#行。

(10)v(按字符选取)或V(按行选取)进入可视化模式,再进行y和d操作。

(11)c(编辑和模式转换的结合):先删除指定范围的内容,再转换至输入模式。

(12)撤销编辑操作(vim可保存最近50次的操作),u:撤销上一次编辑操作,ctrl+r:撤销最后一次的撤销操作,#u:撤销最近的#次操作。

(13)搜索功能(vim搜索内容高亮),/keyword或?keyword实现vim的查找功能,n继续朝同一个方向搜索,N反方向进行搜索。

(14)查找并替换,在末行模式下使用s命令,其格式为:定界s/查找的内容/替换成的内容/修饰符(gi),其中查找的内容支持正则表达式,替换的内容不支持正则表达式但可使用前向引用。修饰符:g:全局替换,i:忽略大小写。例如:1,20s/\<u...e\>/abc/g从1至20行将以u开头加任意三个字母加e结尾的字符串全部替换成abc。又例:1,30/n..e\>/&r/g其中&用于引用查找到的整个字符串。定界符1,$等价于%全文查找。又例%/\/etc\/sysconfig\/network/&s/g其中对分隔符进行了转义,当然也可以更换分隔符%#/etc/sysconfig/network#&s#g分隔符也可换成@。%s/^[[:space:]]*#[[:space:]]*\([^[:space:]].*\)//g删除#号注释,%s/[A-Z]//g删除大写字母,%s/^#[[:space:]]*//g删除所有行首的#号和其后的空格

(15)单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S。

2、vim与shell交互

(1)末行模式下与shell交互,输入!+shell命令(直接执行shell命令)。
(2)将打开文件的部分内容另存到另一个文件,定界符+w+路径,例如5,100w /tmp/vim.txt将当前文件从5~100行另存在vim.txt文件中。

(3)末行模式下输入:set all可以查看所有的set设置。



(4)定制vim的工作属性,在末行模式下,:set [no]nu(关闭)显示行号,:set
[no]ai(不)自动缩进,:set [no]ic(不)忽略大小写,:syntax on[off]语法高亮显示或关闭,:set
[no]hlsearch语法搜索高亮。

(5)末行模式下所有的设置只对当前vim,要使重新打开后也生效则须修改配置文件,全局配置文件(对所有用户有效):/etc/vimrc,其部分内容如下:(其中注释都是一个双引号)



当前用户配置文件(对自己有效):~/.vimrc,不存在时需要用户自己创建,如在其中写入set number则每次在用户下打开vim都会自动显示行号。

(6)命令行下输入vimtutor打开vim向导,可查看vim相关的操作。



2、vim窗口处理

(1)单个文件

在命令模式下:ctrl+w+a窗口水平拆分,ctrl+w+v窗口垂直拆分,按ctrl+w再通过h(左)j(下)k(上)l(右)b(底部)t(顶部)来相互切换,先按ctrl+w,然后再按大写的H、J、K、L(不是小写),窗口就会按上下左右顺序移动了。ctrl+w接着按q键,关闭窗口。

在末行模式下:输入:vs或:vsplit (vertical split)当前窗口竖直分割,输入:sp或:split 当前窗口水平分割。

当多个窗口编辑同一个文件时,任意一个窗口进行编辑(例如删除一行),那么所有相同文件的窗口上都会同时反应效果(因为他们共享同一个文件缓冲区)。

(2)vim打开多个文件

方式一:vim file1 file2,在末行模式下,:next切换到第二个文件,:prev切换至前一个文件,:first切换到第一个文件,:last切换到最后一个文件,:wqall保存并关闭所有文件
(同样:wall、:qall、:q!all功能和不加all是类似的)。

方式二:打开多个文件并拆分显示,-o:水平拆分,-O:垂直拆分。vim
-o file1 file2是打开一个编辑会话,水平分割成两半的窗口水平分割成两半的窗口水平分割成两半的窗口。



vim
-o file1 file2是打开一个编辑会话,水平分割成两半的窗口水平分割成两半的窗口水平分割成两半的窗口

vim
-O file1 file2是打开一个编辑会话,水平分割成两半的窗口水平分割成两半的窗口垂直分割成两半的窗口。



-o后面加一个数字n,是预分配窗口的形式打开,例如vim -O5 file1 file2将分配5个相同的窗口(3个闲置)。



(3)vim已打开一个文件,再打开另一个

在当前文件末行模式下输入:vs newfilename(或:vsplitnewfilename)竖直分割显示,:sp
newfilename(或:splitnewfilename)水平分割显示,如果newfilename不存在则会新建该文件并打开

(4)移动窗口

ctrl+w+r向右或向下方交换窗口,而Ctrl + w + R则和它方向相反。

ctrl+w+x交换同列或同行的窗口的位置,vim默认交换当前窗口的与它下一个窗口的位置,如果下方没有窗口,则试着与上一个窗口交换位置(可在此命令前加上数量,与制定的窗口交换位置)。

ctrl+w+|将当前窗口的宽度调到最大。

ctrl+w+=让所有窗口调整至相同尺寸(平均划分,比较适用)。

ctrl+w+-:将当前窗口的高度减少一行。

ctrl+w++:将当前窗口的高度增加一行。

ctrl+w+< :将当前窗口的宽度减少。

ctrl+w+> :将当前窗口的宽度增加。


三、总结

(1)vim是从vi发展出来的一个超级强大的文本编辑器,本文仅介绍其常用的命令,可以通过vimtutor向导进一步学习。

(2)在windows下可以安装gVim for windows。

(3)熟练的应用还需建立在日常的不断学习和练习中。


四、patch

(1)vim删除操作集合
命令模式下:

x 删除当前光标下的字符。

dw 删除光标之后的单词剩余部分。

d$ 删除光标之后的该行剩余部分。

dd 删除当前行。

c 功能和d相同,区别在于完成删除操作后进入INSERT MODE。

cc 也是删除当前行,然后进入INSERT MODE。

末行模式下:

删除每行第一个字符:%s/^.//g($代表行末或者最后一行,1,$表示全文,也可用%表示。s/^.//g表示正则替换)。

删除每行最后一个字符:1,$s/.$//g。

(2)命令模式下代码前加#或//

加注释:ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如"#",再按Esc(注意:输入内容只在第一列,输完后按两次Esc,每行会增加同样的内容),就会全部注释了。

删注释:按ctrl+v 进入列编辑模式,向下或向上移动光标选中行注释部分,向左或向右移动光标选中列注释部分,,然后按d, 就会删除注释符号(#或//)。

使用替换命令

:% s/^/\/\//g 在全部内容的行首添加//号注释

:2,50 s/^/\/\//g 在2~50行首添加//号注释

:2,50 s/^\/\///g 在2~50行首删除//号

替换空行:1,$s/^$\n//g

每行的行首都添加一个字符串:%s/^/要插入的字符串

每行的行尾都添加一个字符串:%s/$/要插入的字符串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: