vim中插入数字序列的方法待处理的文本假设文本的原始内容是这是第一行这是第二行这是第四行这是第五行将行号插入1这是第一行2这是第二行34这是第四行5这是第五行另一个想要的效果是这是第一行line[1]这是第二行line[2]这是第三行,line[3],这是第四行,line[4]。下面将针对以上两个要求给出答案。使用下面提到的方法实际上可以实现更复杂的数字序列插入。包括指定字符的替换,后跟序号。使用line()line('.')返回当前行号:g/^/s//\=line('.').''/很简单,但不太灵活,只能用来显示当前行行号使用ex命令vim提供了一些可以打印行号的ex命令,如"=","p#","#"为了得到vim的命令输出,需要用redir"在前5行加上行号:redir@a|1,5#|redirEND:1,5d|put!a|1d|6d粘贴后,前后会多出一行,所以用d删除使用range,setline,getlinerange()生成数列列表:foriinrange(6):callsetline(i,i.''.getline(i)):endforrange(6)会生成数字1-5的列表,不包括6个变量累加:leti=1|g/^/s//\=i.''/|leti=i+1这种方法比较灵活,可以通过控制i宏的值变化来控制插入的值,Ctrl-A可以在数字上按Ctrl-A给数字加一,和Ctrl-X数字减一,过程如下:手动加上第一行的序号和空格,输入0"ayw,将序号和空格放入寄存器a,移动到下一行,然后executethefollowingkeyqz0"aP0^A"ayawjqexecutes4@z执行以下4行存储在寄存器z中的命令序列。上面命令序列的详细解释如下qz:开始录制宏,保存在寄存器z0:移动到行首"aP:把寄存器a的内容(行号和空格)粘贴到这里0^A:移动到行首,按ctrl-A给当前光标下的数字加一"ayaw:将当前光标下的单词复制到寄存器中的j中a:移动到下一行q:记录结束如果有是没有空格作为标记,那么就不能用aw来复制一个单词,需要用v来选择对应的数字部分注意在命令行中,ctrl-a需要用到ctrl-v,ctrl-a说明这个key在vim下功能比较强大,但是一般需要多次调试外部命令seq是linux下的命令输出序列harriszhSat22:14@~/trunk/go$seq5-21531harriszhSat22:14@~/trunk/go$seq1512345harriszhSat22:14@~/trunk/go$seq125135如果有三个参数,中间参数为step,第二个参数数字为起始编号和结束编号,步长为1,通过r!seq15在文件中插入数字序列,然后使用列方式复制并使用printf直接插入行号:%s/^/\=printf('%-4d',line('.'))其中-是左对齐,默认右对齐是在指定行插入序列先用V选中要插入的blocksequencenumber:'<,'>s/^/\=printf("%-4d.",line(".")-line("'<")+1)只在非空行插入序列把以下func进入.vimrcfunctionInc(...)letresult=g:iletg:i+=a:0>0?a:1:1returnresultendfunctiona:0相当于argc,a:1相当于argv[1]g:i是全局变量i然后select对应的block:leti=1:'<,'>g/^\S/s/^/\=printf("%4d.",Inc())下面三个range命令,打印指定行下的所有插入序列:12put=range(1,5):callappend(12,range(1,5)):0put=range(3,7)如果第一条命令和第二条命令等价于0put,则range和print会在第一行之前匹配合并可以输出格式化结果:0put=map(range(1,5),'printf(''%04d'',v:val)')v:val表示从前面的列表中取的值,直接用for更清晰易懂:对于我在范围(1,10)|put='192.168.0.'.i|endfor在特定字符后添加序列号:leti=1|g/abc/s//\='abc_'.i/|leti=i+1但是上面的命令有个问题,如果连续有多个abc,它们会被替换成相同的数字,而不是递增。要解决上面的问题,可以使用寄存器:let@a=1|%s/abc/\='abc_'.(@a+setreg('a',@a+1))/gsetreg()返回0,所以用上面的方法调用setreg更新registera的值vim8ctrl-avim8为Ctrl-A提供了新功能,例如my_array[0]=0;my_array[1]=0;my_array[2]=0;my_array[3]=0;my_array[4]=0;my_array[5]=0;my_array[6]=0;用ctrl-V选择0-0列,然后按gCtrl-A,列选择前面0-6,然后按gCtrl-A最后的结果是my_array[2]=1;my_array[4]=2;my_array[6]=3;my_array[8]=4;my_array[10]=5;my_array[12]=6;gCtrl-A的原理是第一个数加1,第二个数加2,和3到第三个数...插件VisIncr主要命令包括I,II,IYMD,IMDY,IA,ID,IO,IR,IX支持数字,日期,字母|table,Romannumerals,octal,hexadecimalincrementanddecrement:IXOriginalSelect,:IX88898a8b8c:IOriginalSelect,:I8889810811812:I-1OriginalSelect,:I-18887868584:IIOriginalSelect,:II8889810811812:II-1OriginalSelect,:II-18887868584:IMDYOriginalSelect,:IMDY06/10/036/10/0306/10/036/11/0306/10/030/12036/13/0306/10/036/14/03:IYMDOriginalSelect,:IYMD03/06/1003/06/1003/06/1003/06/1103/06/1003/06/1203/06/1003/06/1303/06/1003/06/14:IDMYOriginalSelect,:IDMY10/06/0310/06/0310/06/0311/06/0310/06/0312/06/0310/06/0313/06/0310/06/0314/06/03:IDOriginalSelect,:IDSunSunSunMonSunTueSunWedSunThu:IDOriginalSelect,:IDSundaySundaySundayMondaySundayTuesdaySundayWednesdaySundayThursday:IAOriginalSelect,:IAaaabacadae:IOOriginalSelect,:IO555657510511:IROriginalSelect,:IRIIIIIIIIIIIIVIIVIIVI后记写这篇文章的时候看了很多VIM官方wiki,在此表示感谢。如果你有什么很酷的实现方法,欢迎通过邮件反馈给作者
