《VIM使用技巧》word版.doc_第1页
《VIM使用技巧》word版.doc_第2页
《VIM使用技巧》word版.doc_第3页
《VIM使用技巧》word版.doc_第4页
《VIM使用技巧》word版.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VIM使用技巧1.交换两个字符位置xp 2.上下两行调换ddp 3.把文件内容反转:g/m0 4.上下两行合并5.删除所有行dG 6.从当前位置删除到行尾d$7.从当前位置复制到行尾y$如果要粘贴到其他地方p就可以了由于vi是建立在EX上的所以当键入:时就来到了EX命令状态8.:ab string strings例如:ab usa United States of America,当你在文见里插入usa时United States of America就蹦出来了9.:map keys new_seq定义你当前键盘命令10.:setallvi or ex的编辑状态如显示每行:set nu 11.在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。12.单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S 13.:%s/old_word/new_word/g这个指令是于在整个文件中替换特定字符串14.光标控制k:上移nk上移n行j:下移nj下移n行将光标移到第n行,按下mk将光标移到第m行,按下ayk即将第n到m的行存到a寄存器,以此类推,b,c.寄存器等这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用想粘贴到某处,直接将光标移到某地,按下ap即可,以此类推,b,c.寄存器等在当前屏幕中H跳到第一行M跳到中间一行L跳到最后一行15.表8-2删除命令删除命令操作d l删除当前字符(与x命令功能相同)d 0删除到某一行的开始位置d删除到某一行的第一个字符位置(不包括空格或TA B字符)d w删除到某个单词的结尾位置d 3w删除到第三个单词的结尾位置d b删除到某个单词的开始位置d W删除到某个以空格作为分隔符的单词的结尾位置d B删除到某个以空格作为分隔符的单词的开始位置d 7B删除到前面7个以空格作为分隔符的单词的开始位置d)删除到某个语句的结尾位置d 4)删除到第四个语句的结尾位置d(删除到某个语句的开始位置d删除到某个段落的结尾位置d删除到某个段落的开始位置d 7删除到当前段落起始位置之前的第7个段落位置d d删除当前行d/t ex t删除从文本中出现t ex t中所指定字样的位置,一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容d fc删除从文本中出现字符c的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容d tc删除当前行直到下一个字符c所出现位置之间的内容D删除到某一行的结尾d$删除到某一行的结尾5 dd删除从当前行所开始的5行内容d L删除直到屏幕上最后一行的内容d H删除直到屏幕上第一行的内容d G删除直到工作缓存区结尾的内容d 1G删除直到工作缓存区开始的内容修改命令操作c l更改当前字符c w修改到某个单词的结尾位置c 3w修改到第三个单词的结尾位置c b修改到某个单词的开始位置c W修改到某个以空格作为分隔符的单词的结尾位置c B修改到某个以空格作为分隔符的单词的开始位置c 7B修改到前面7个以空格作为分隔符的单词的开始位置c 0修改到某行的结尾位置c)修改到某个语句的结尾位置c 4)修改到第四个语句的结尾位置c(修改到某个语句的开始位置c修改到某个段落的结尾位置c修改到某个段落的开始位置c 7修改到当前段落起始位置之前的第7个段落位置c tc修改当前行直到下一个字符c所出现位置之间的内容C修改到某一行的结尾c c修改当前行5 cc修改从当前行所开始的5行内容.重复上一次修改!表8-4替换命令替换命令操作s将当前字符替换为一个或多个字符S将当前行替换为一个或多个字符5 s将从当前字符开始的5个字符替换为一个或多个字符vi替换使用规则:g/s1/s/s2/s3/g第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用/代替),s3是替换字符串16.fx往右移动到x字符上Fx往左移动到x字符上tx往右移动到x字符前Tx往左移动到x字符后(注意:以上四个命令中,其中x是键入的字符)分号,配合f和t使用,重复一次逗号,配合f和t使用,反方向重复一次17.vi环境选项Solaris ksh noautoindent nomodelines noshowmode autoprint nonumber noslowopen noautowrite nonovice tabstop=8 nobeautify nooptimize taglength=0 directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags/usr/lib/tags noedcompatible prompt tagstack noerrorbells noreadonly term=vt100 noexrc redraw noterse flash remap timeout hardtabs=8 report=5 ttytype=vt100 noignorecase scroll=11 warn nolisp sections=NHSHH HUuhsh+c window=23 nolist shell=/bin/ksh wrapscan magic shiftwidth=8 wrapmargin=0 mesg noshowmatch nowriteany For C-Shell:setenv EXINITset nuFor Bourne or Korn Shell:EXINIT=set nu;export EXINIT For Korn Shell Only(alternate method):typeset-x EXINIT=set nu在.profile里设置vi的环境选项,以上均测试过18.标记文本mchar用字母char标记当前光标的位置char移至char所标记处char移至char标记所在行的开头处移至当前行上一次所在位置(在光标移动之后)一个双引号移至当前行上第一次所在位置的行的开头处(在光标移动之后)两个单引号19.同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,屏幕底部仍然显示目前vi的是刚才的文件。(在HP-UX,Solaris,AIX上通过)也可以使用:进行切换20.sco下VI要在文本前同样的字符加用%s/要加的内容/g要在文本后同样的字符加%s/$/要加的内容/g 21.如何去掉文本中的M硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。cat filename|tr-d5newfile不同的unix系统还存在一些其他不同的命令,如:doscp sed也可以实现这个功能.dos2unix filename filename2反之unix2dos filename filename2在vi中用:$s/M/g是crtl-V crtl-M 22.如何在unix命令行下将一个文件的某字符串用另一个串换掉seds/string1/string2/gpfile1 file2 23.将/etc/hosts下所有的地址都ping 2次1#/usr/bin/sh 2#grad/etc/hosts and ping each address 3cat/etc/hosts|grep-v#|while read LINE 4do 5ADDR=awkprint6 for MACHINE in$ADDR 7do 8ping$MACHINE-n 29 done 10 done 24到前一个函数,到下一个函数,括号配对%,交叉参考Ctrl_(事先用ctags做索引),回来用e#编辑一个函数:vi-t函数名,编辑加密文本vi-X 25在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等当今世界,文本编辑器种类繁多,大有乱花渐欲迷人眼之势。中国有句古语:手巧不如家什妙,作为IT业的专业人士,选择一款优秀的编辑软件至关重要。笔者认为:LINUX下的VIM以其强大的功能和无穷的魅力将使您终生受益。作者:闫石()来自:由于被广泛移植,无论是PC机的DOS和WINDOWS,还是RISC/6000的AIX,乃至于IBM的大型机S/390,都能见到VIM的身影。然而,对于初学者,VIM的用户界面与使用方法非常不符合常规,甚至认为它比较混乱,无所适从。事实上,VIM编辑器是专门为经验丰富的用户设计的,它的界面和使用方法提供了更快的速度和更强的功能。对于熟知它的用户,VIM的许多特性节省了时间和击键次数,并可以完成一些其他编辑器无法完成的功能。学习的最好方法是实践,唯有如此,才能真正掌握其中的精髓。文中列举的实例,都是笔者在实际工作中遇到的,具有一定的代表性,请大家在阅读的过程中仔细体会。好了,现在让我们共同畅游神奇的VIM的世界!例一、两个常用的指令序列xp左右交换光标处两字符的位置。ddp上下交换光标处两行的位置。例二、重复输入同一字符有时,我们可能想多次输入同一字符,VIM的插入功能可以很好的完成这项工作命令80i=ESC一次可以输入80个字符=,当然,80a=ESC也可以完成上述功能。请注意:此处的ESC表示键盘左上方上的ESC键。例三、将两个文本数据文件按行逐条合并,并给出标尺数据文件1内容如下:1- 2- 3-数据文件2内容如下:1=2=3=要求的结果如下:|- 1-2-3-4-5 1- 1=|- 1-2-3-4-5 2- 2=|- 1-2-3-4-5 3- 3=也许您会说,这还不简单,无非是反复拷贝、粘贴,任何一款文本编辑器都能完成上述功能。可是,如果这两个文件都很大,每个文件都成千上万行,恐怕简单的拷贝、粘贴就难以胜任了。因此,我们所关心的,是找到一种行之有效的方法,把枯燥乏味的工作留给计算机,我们只需发布指令。为达到此目的,请按以下步骤执行:、将两文件合并,结果如下1- 2- 3- 1=2=3=、在两文件头尾相接的地方插入标志行,用以区分两个文件,本文采用的是一整行!字符1- 2- 3-!1=2=3=、在标志行的下方输入标尺1- 2- 3-!|- 1-2-3-4-5 1=2=3=、执行宏命令脚本merge_2r.vim,即在VIM编辑器中按如下键:so merge_2r.vim回车、按下键盘上的=键,执行的结果如下|- 1-2-3-4-5 1- 1=|- 1-2-3-4-5 2- 2=|- 1-2-3-4-5 3- 3=|- 1-2-3-4-5!|- 1-2-3-4-5、将最后三行删除,即可得到我们需要的结果|- 1-2-3-4-5 1- 1=|- 1-2-3-4-5 2- 2=|- 1-2-3-4-5 3- 3=怎么样,简单吗?请大家自己实际尝试一下。下面,我来详细讲解宏命令脚本merge_2r.vim。该脚本内容如下:-Macro Function:Merge File1 And File2,Have Ruler in every recordDate:2001/12/01Author:Yan Shi-1-2-Sample File13-!Flag Row|- 1-2-3-4-5 Ruler1=2=Sample File23=-:1:map=ma/!M+:.coa-1M/!M2+:.maM+=前14行每行都以开始,表明该行是注释行,实际并不执行,只是方便读者阅读,只有最后两行才是真正的代码行。请注意:本例中的M表示键盘上的回车键,并非和M两个字符。为了讲述清楚,我把命令行分解开,逐一说明。首先将第一行置为当前行,然后执行map命令,将一大串VIM指令映像给字符=。这一大串VIM指令共分9步执行:ma将数据文件一的第一行标记为a 1- 2- 3-!|- 1-2-3-4-5 1=2=3=/!M找到标志行,置为当前行1- 2- 3-!|- 1-2-3-4-5 1=2=3=+光标下移一行,即把标尺行置为当前行1- 2- 3-!|- 1-2-3-4-5 1=2=3=:.coa-1M把标尺行复制到标记行(数据文件一的第一行)的上方|- 1-2-3-4-5 1- 2- 3-!|- 1-2-3-4-5 1=2=3=/!M再次找到标志行,置为当前行|- 1-2-3-4-5 1- 2- 3-!|- 1-2-3-4-5 1=2=3=2+光标下移2行,即数据文件二的第一行置为当前行|- 1-2-3-4-5 1- 2- 3-!|- 1-2-3-4-5 1=2=3=:.maM把数据文件二的第一行移至标记行的下方|- 1-2-3-4-5 1- 1=2- 3-!|- 1-2-3-4-5 2=3=+光标下移一行,即数据文件一的第二行置为当前行|- 1-2-3-4-5 1- 1=2- 3-!|- 1-2-3-4-5 2=3=这一步很关键,是典型的递归调用,重复完成以上步骤例四、在文件中置入行号工作中,我们有时希望把行号置入文件中,而VIM提供的功能:set nu只能显示行号,不能编辑或将其置入文件当中,下面的宏命令脚本row_num.vim可以完成此项功能。-Macro Function:Source File Add Row_NumDate:2001/12/01Author:Yan Shi-:%s/I/:$:let end=line(.):1-:let num=1:while num=end:let line=getline(.):let temp=substitute(line,$,num,):call setline(.,temp):+:let num=num+1:endwhile-请注意:本例中的I表示键盘上的TAB键,并非和I两个字符。下面,我针对该宏命令脚本逐一讲解。:%s/I/每一行的行首添加一个TAB字符:$到文件的末行:let end=line(.)末行的行号=变量END,函数line的功能是取得指定行的行号,此处参数.表示当前行:1到文件的首行-:let num=1 1=计数器:while num=end:let line=getline(.)取当前行的内容=变量LINE:let line=substitute(line,$,num,)在变量LINE的前面置入行号:call setline(.,line)将变量LINE的内容写回当前行:+下移一行:let num=num+1计数器加一:endwhile循环执行,直到文件结束-有关正则表达式的使用UNIX/LINUX下的很多工具之所以强大、灵活,关键是因为有了正则文法和元字符,这也是VIM乃至UNIX/LINUX系统的精华所在。正因为使用灵活,因此掌握起来比较吃力,如果不是真正理解,实际运用中会出现千奇百怪的错误。因此,有必要对这部分知识多花些气力。下面结合具体实例讲解。例五、有一文件,包含某外企的中国员工的资料,首先是姓名,然后是两个空格,其次是15位身份证号码。zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001现在,有以下问题需要解决:按照外国人的习惯,应该是名在前,姓在后。因此,文件中的姓名字段需要修改。姓与名的首字母应该大写。根据身份证号码,还可以判断出生年月日,将其作为一个新字段添加。根据身份证号码,可以判断出性别。若为男性,添加male,若为女性,添加female。将男女员工分开,男员工在前,女员工在后。将各字段数据左对齐最终结果如下:Fei.Zhang 430759701022003 1970/10/22 male Yu.Guan 342869680413001 1968/04/13 male Bei.Liu 210324650708001 1965/07/08 male- Chan.Diao 651302801225012 1980/12/25 female Shi.Xi 120638780214006 1978/02/14 female为了完成上述功能,只需执行脚本employee.vim,使用方法为:so employee.vim回车即可。脚本内容如下:%s/:%s/()(*)/:%s/(A-Za-zA-Za-z*)(.)(A-Za-zA-Za-z*)/uu/:%s/$/xxxxxx/:%s/(0-96)(0-96)(0-93)(xxxxxx)/:%s/(.)(.)(.)$/19/:%s/$/xxxxxx/:%s/(0-91413579)(.*)(xxxxxx)/male/:%s/(0-91402468)(.*)(xxxxxx)/female/:$:s/.*/&M-:g/female/.m$在这个脚本中,使用了大量的正则表达式,这里仅对涉及到的正则表达式做一简要介绍。有关正则表达式的内容相当多,本文不可能占用大量篇幅叙述,请大家谅解。%地址范围符号,代表文件中的所有行,作用等同于地址范围1,$.与任意单字符(换行符除外)匹配,例如y.s可以匹配yas y.s或y s等等。*与前一字符的0次或多次出现匹配,例如y*s可以匹配yys yyyyys或s等等。$与行尾匹配。&代表模式匹配中出现的字符串,例如s/abc/&def是把当前行的abc替换成abcdef。匹配中出现的字符,例如abc匹配字符a,b或c,a-zA-Z匹配所有的英文字符。()(和)之间出现的内容可以由num来替代。替代(和)之间出现的内容。u将后续字符串的首字母大写。num与前一字符的num次出现匹配。现在,我们对脚本逐条讲解,希望能帮助大家理解正则文法。:%s/将文件中每行出现的2个空格替换为10个空格。zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001:%s/()(*)/保留行首的12个字符,将其余的空格删除,这样,前两个字段就对齐了。zhang.fei 430759701022003 diao.chan 651302801225012 guan.yu 342869680413001 xi.shi 120638780214006 liu.bei 210324650708001:%s/(A-Za-zA-Za-z*)(.)(A-Za-zA-Za-z*)/uu/将文件中每行出现的雇员姓名互换,并将首字母大写。Fei.Zhang 430759701022003 Chan.Diao 651302801225012 Yu.Guan 342869680413001 Shi.Xi 120638780214006 Bei.Liu 210324650708001:%s/$/xxxxxx/在每一行的行尾添加2个空格和6个x Fei.Zhang 430759701022003 xxxxxx Chan.Diao 651302801225012 xxxxxx Yu.Guan 342869680413001 xxxxxx Shi.Xi 120638780214006 xxxxxx Bei.Liu 210324650708001 xxxxxx:%s/(0-96)(0-96)(0-93)(xxxxxx)/将xxxxxx替换成出生年月日。Fei.Zhang 430759701022003 701022 Chan.Diao 651302801225012 801225 Yu.Guan 342869680413001 680413 Shi.Xi 120638780214006 780214 Bei.Liu 210324650708001 650708:%s/(.)(.)(.)$/19/将年月日用/字符分隔,并在年前添加19。Fei.Zhang 430759701022003 1970/10/22 Chan.Diao 651302801225012 1980/12/25 Yu.Guan 342869680413001 1968/04/13 Shi.Xi 120638780214006 1978/02/14 Bei.Liu 210324650708001 1965/07/08:%s/$/xxxxxx/在每一行的行尾添加2个空格和6个x Fei.Zhang 430759701022003 1970/10/22 xxxxxx Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 xxxxxx Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 xxxxxx:%s/(0-91413579)(.*)(xxxxxx)/male/身份证号码末位是奇数的,将xxxxxx替换成male Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 xxxxxx Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 xxxxxx Bei.Liu 210324650708001 1965/07/08 male:%s/(0-91402468)(.*)(xxxxxx)/female/身份证号码末位是偶数的,将xxxxxx替换成female Fei.Zhang 430759701022003 1970/10/22 male Chan.Diao 651302801225012 1980/12/25 female Yu.Guan 342869680413001 1968/04/13 male Shi.Xi 120638780214006 1978/02/14 female Bei.Liu 210324650708001 1965/07/08 male:$到文件的最后一行:s/.*/&M-在文件的最末行插入一行-字符。Fei.Zhang 430759701022

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论