1

我需要在 vim (MacVim) 中完成并在一行中使用它。

z.a2=cross(z.b, z.c)(z.b1, z.c1);

成为以下行:

z.b2=cross(z.c, z.a)(z.c1, z.a1);
4

3 回答 3

7

您可以使用字典:

:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/[abc]r\@!/\=replacements[submatch(0)]/g

r\@!防止被c改变cross

如果您想对整个文件而不是当前行执行此操作,请%在前面添加一个。s请注意,这将更改行上的任何“a”、“b”或“c”,包括单词中的那些(例如cin cross)。为了限制这一点,您可以将模式更改为\<[abc]\>,但这将无法匹配您拥有的位置a2,因此建议:(\<\([abc]\)\d*\>并替换为submatch(0)submatch(1)如果您只想匹配z前面的位置,这很容易:

:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/z\.\zs[abc]/\=replacements[submatch(0)]/g

看:

:help Dictionary
:help :substitute
:help :s\=
:help \@!
:help \zs
:help \(\)
:help \<
于 2010-10-28T08:11:17.677 回答
0

这个单排怎么样?

%s/\.a/*b*/g | %s/\.b/*c*/g | %s/\.c/*a*/g | %s/\*a\*/.a/g | %s/\*b\*/.b/g | %s/\*c\*/.c/g
于 2010-10-28T08:26:43.163 回答
0

搜索:z\.(a)(2)=cross\(z\.(b), (z\.c)\)\(z\.b(1), (z\.c1)\);

用。。。来代替:z.$3$2=cross($4, z.$1)($6, z.$1$5);

于 2010-10-28T08:35:45.157 回答