• vim 中替换命令的技巧汇总
    时间:2012-03-09   作者:佚名   出处:互联网

    VIM无疑是非常强大的,学会其中的命令会使你事半功倍,下面本文列举一下替换命令的一些技巧。

    1.使用命令将C语言中的enum替换为JAVA常量:

    g/^\s*$/d
    g/^/s//public static final int/

    let i=1000
    g/,/ s//\='='.i.';'/ |let i=i+1

    2.使用命令将C语言中的#define宏替换为JAVA常量:

    %s/^#define [A-Z, 0-9, _]*\zs\s\ze/=/
    g/#define/s//public static final int/
    g/$/s//;/

    vim中一些高级替换技巧

    1.替换变量

    在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
    example:
    ·将 data1 data2 修改为 data2 data1
    -----------------------------------
    :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
    -----------------------------------
    ·将 Doe, John 修改为 John Doe
    -----------------------------------
    :%s/\(\w\+\), \(\w\+\)/\2 \1/  
    -----------------------------------

    2.利用函数式替换

    用法:
    ---------------------------
    :s/替换字符串/\=函数式
    ---------------------------
    说明:
    ·函数式可以有多个,返回值可以用字符串连接符.连接起来,如line(".")返回匹配行号(:help line()  ),submatch(n)可以引用\1、\2的内容,其中submatch(0)引用匹配的整个内容;
    ·函数式也可以是字符串常量,用双引号引起来。函数式也可以是任意表达式,需要用小括号引起来,如(3+2*6);
    ·函数式还可以是寄存器中的内容,通过"@寄存器名"访问,如@a(不需要加引号,但是还是需要用.来连接);
    example:
    ·要将下列8行的data0依次变成data0~7(前面的数字是行号)
    double data0;
    double data0;
    double data0;
    double data0;
    double data0;
    double data0;
    double data0;
    double data0;
    如果安装有perl的话,我以前一般都是借助perl来完成这件事情:
    ---------------------------------------------------------------------------
    :r !perl -n -le "if(s/^(double\s+data)\d;/$1$k;/){ $k++; print $_; }" %:p---------------------------------------------------------------------------
    其中%:p表示包含完整路径的文件名
    现在只用vim我们就可以完成这样的事情:
    首先将光标移到125行(line(".")返回当前匹配行的行号,line("'a")返回mark a的行号):
    ---------------------------------------------------------------------------
    ma
    :%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
    ---------------------------------------------------------------------------
    再或者
    首先将光标移到125行(line("'V7j
    :%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'
    ---------------------------------------------------------------------------

    3.匹配的开始与结束

    \zs和\ze可以用于替换操作中指明替换的开始与结束,如上例中可以以更短的操作来实现:
    ---------------------------------------------------------------------------
    ma
    :%s#^double\s\+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
    ---------------------------------------------------------------------------
    另外,还可以使用vim表达式来实现上述功能:
    ---------------------------------------------------------------------------
    :let n=0 | g/^double\s\+data\zs\d/s//\=n/ | let n+=1
    ---------------------------------------------------------------------------
    其中 ·|      用来分割不用的命令;
    ·g      在匹配后面模式的行中执行指定的ex命令
    ·\zs    指明匹配由此开始
    ·s//\=n 对匹配模式进行替换,匹配模式为空,表示以上一次匹配成功的模式,
    并且指明替换是一个表达式;

    4. 高级递增替换

    把下面几句放到 _vimrc
    -------------------------------
    let g:I=0
    function! INC(increment)
    let g:I =g:I + a:increment
    return g:I
    endfunction
    ------------------------------
    ·对于上述问题,可以这样解决:
    -----------------------------------------------------
    :let I=-1 | %s/^ double\s\+data\zs\d\ze/\=INC(1)/
    -----------------------------------------------------
    ·还可以生成数字序列,如生成1~100间隔为5的数字序列:
    --------------------------------------
    :let I=0 | ‘a,’b s/^/\=INC(5)/
    --------------------------------------

    网友留言/评论

    我要留言/评论

    相关文章

    Social Game (SNS) 连载之流程设计:本文转自果伦的BLOG,作者整理出一个SNS game(social game)的设计流程,给团队留下一个可参考的方案。主要谈及的是策划流程设计,文章写的不错。
    手动安装MyEclipse 9.0 SVN插件解决方案:最近下载MyEclipse9.0 R2版本来做开发尝试。我们要求必须使用SVN来管理整个项目的源代码,这样就要求掌握如何在MyEclipse9.0 R2版本下手动安装SVN插件。下面通过网上的一些相关资料,我们将其汇总为两个方法.
    如何在面试时写出高质量的代码:程序员在职业生涯中难免要接受编程面试。有些程序员由于平时没有养成良好的编程习惯,在面试时写出的代码质量不高,最终遗憾地与心仪的公司和职位失之交臂。因此,如何在面试时能写出高质量的代码,是很多程序员关心的问题。
    10 个 WordPress 的代码语法高亮插件:如果你是一个开发人员而且又使用了wordpress建站的话,那么相信你肯定希望找到一款代码高亮的wordpress插件,方便在写教程的时候插入源代码。Wordpress插件库里有不少代码语法高亮插件,包括syntaxhighlighter、wp-synhighlight、wp-syntax、wp-codebox和codecolorer等,这些插件都是在其他的代码高亮开源组件的基础上实现的,综观所有的代码高亮插件,它们应用的开源组件不外乎两个,一个是SyntaxHighlighter,而另一个则是GeShi。
    【面试题】十天时间,如何学习一门新技术?:总监说:小V啊,给你十天时间,去学习一门"技术",你如何规划?规划具体到半天,即每个半天你在做什么?十天后要用此技术做项目;这个‘技术’不固定到某一种技术。你该如何去规划呢。
    JavaScript 创建对象方法列举:JavaScript 中没有类的概念,所以它的对象也与基于类的语言中的对象有所不同。创建一个JavaScript对象有如下的方式,由浅入深一 一列举对比。
    为程序员和设计师准备的10个流程图:流程图是一样很有用的工具。它可以用来帮助你做决策,给你一步一步的引导。对于很多复杂的设计和流程来说,流程图是必不可少的。和其他图形一样,流程图让你直观的理解一个流程,甚至有可能帮助你找出流程中的问题或者瓶颈。
    IOS APP设计流程步骤分享:移动平台是下一个战场,IOS又是其中占比非常大的平台,关于IOS的设计流程看到一篇不错的译文,根据原文整理了这11步,与大家分享一下.
    Facebook员工经验分享:重视数据但不盲从:本文作者曾在Facebook从事4年多的开发工作,这一段宝贵的工作经历汇聚成为10条人生箴言,希望每一位开发者阅读本文后,都能够从中获益。