VIM:在对称的代码块中交换字符串的一部分

时间:2014-02-10 09:15:27

标签: regex search vim replace swap

所以这个问题必须和编程本身一样古老。如果我有这段代码:

Arequest : A.state == IDLE & B.state == OUT     -> A.state == RUNNING
           A.state == IDLE & B.state == IN      -> A.state == POLLING
           A.state == IDLE & B.state == RUNNING -> A.state == WAITING

我要输入的下一个代码块是这个(A与B交换)

Brequest : B.state == IDLE & A.state == OUT     -> B.state == RUNNING
           B.state == IDLE & A.state == IN      -> B.state == POLLING
           B.state == IDLE & A.state == RUNNING -> B.state == WAITING

所以基本上任何foo(A,B)都变成了foo(B,A)。我如何使用VIM做到这一点?一直在寻找很多,但无济于事。 Dr Chip's Swapstrings只会交换分隔符(点,括号,空格等)之间的A和B的出现,但Arequest(要交换的字符串是较大字符串的一部分)将不会交换到Brequest中。 Tim Pope's Abolish也不会这样做(同样的原因)。

3 个答案:

答案 0 :(得分:2)

在执行一次更改时创建一个宏,然后转到下一行并重新启动。像这样:

qq/A<CR>cwB<ESC>/B<CR>cwA<ESC>/A<CR>cwB<ESC>^jq

首次使用@q运行宏,然后重复@@直到完成

答案 1 :(得分:1)

如果您的系统有tr命令,请使用该命令。

:%!tr AB BA

BTW,A中的WAITING将被替换。

答案 2 :(得分:1)

既然你提到Abolish我想我会告诉你这是怎么做的:

%S/{A,B}/{B,A}/wg

秘诀是使用w标志,这意味着它只会改变单词。唯一缺失的部分是将Arequest更改为Brequest,也可以通过:Subvert或手动更改{

}。

%S/{A,B,Arequest}/{B,A,Brequest}/wg