[tips]更灵活的数字递增替换

  ch.linghu@gmail.com
  (未分类)
  2012-06-11
  增加更多TAG »
  2,778次

之前写过一篇[tips]vim替换技巧一则(数字递增),可以解决一部分问题。不过有的时候我们需要更加灵活的替换方案。

比如我们需要把代码中的一个片段进行替换处理。

这个时候,VisIncr插件可以派上不小的用场。不过VisIncr主要适用于替换内容整整齐齐的排成一列的情况,我们还需要一些更加灵活的方案对付一些更加不规则的情况。

举个例子。

现在我们有这样一段代码:

            deliv.delivTradingDay = None
            deliv.delivExchangeID = None
            deliv.delivProductID = None
            deliv.delivDate = None
            deliv.delivHedgeFlag = None
            deliv.delivDirection = None
            deliv.delivPayVolume = None
            deliv.delivUnDeliveryVolume = None
            deliv.delivOpenPrice = None
            deliv.delivPosition = None
            deliv.delivDeliveryPrice = None
            deliv.delivDelivery = None
            deliv.delivDelivFee = None

我们想把它替换成:

            deliv.delivTradingDay = row[0]
            deliv.delivExchangeID = row[1]
            deliv.delivProductID = row[2]
            deliv.delivDate = row[3]
            deliv.delivHedgeFlag = row[4]
            deliv.delivDirection = row[5]
            deliv.delivPayVolume = row[6]
            deliv.delivUnDeliveryVolume = row[7]
            deliv.delivOpenPrice = row[8]
            deliv.delivPosition = row[9]
            deliv.delivDeliveryPrice = row[10]
            deliv.delivDelivery = row[11]
            deliv.delivDelivFee = row[12]

因为None的位置不规则,所以VisIncr也帮不上什么忙。当然可以使用插件去把等号排整齐然后再使用VisIncr,但终归麻烦,另外等号排整齐也不符合python的编码规范。所以替换完之后还要再换回来,又要多一步操作。

其实vim内置的搜索替换功能就可以做这件事。首先我们选中这一段代码,然后执行如下的命令:

:let @a=0 | '<,'>s/None/\='row['.(@a+setreg('a', @a+1)) .']'/

就OK了。

这个代码原理上跟我前一篇的类似,不过经过了简化所以适应性更强了。这个命令里我没有使用g命令,而是直接使用s命令,在替换内容部分使用 \= 插入表达式。用@a而不是a是为了可以在执行过程中使用setreg动态改变寄存器a的内容。

另外要注意的是选中之后按:时,默认光标是在 '<, '> 的后面,我们需要手工移动到开头去加上 let @a=0 | 这一段。

(本文收录于[go4pro.org]


除非另有来自Go4Pro.org或原作者的显式声明,本站点所有文章都按照知识共享许可协议知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。

Go4Pro.org,V3.0,2009-2014。本站点采用SymfonyBootstrapTwig等技术开发。