VIM搜索和替换

har*_*ari 6 vim

我正在做一些拼图,其中每个英文字符被2个字符高级替换.例如,"apple"将被写为"crrng"a + 2 = c,...并且类似于pple.在python maketrans我能够做到.

我想知道在VIM搜索和替换中是否可能有类似的事情?

有任何想法吗???

ib.*_*ib. 10

如果字母字符在目标编码1中顺序排列,则使用以下替换命令2.

:%s/./\=nr2char(char2nr(submatch(0))+2)/g
Run Code Online (Sandbox Code Playgroud)

但是,这种替换实现了非圆形的字母移位.可以通过分别处理小写和大写字母的两个替换来实现循环移位.

:%s/\l/\=nr2char(char2nr('a') + (char2nr(submatch(0)) - char2nr('a') + 2) % 26)/g
:%s/\u/\=nr2char(char2nr('A') + (char2nr(submatch(0)) - char2nr('A') + 2) % 26)/g
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用该tr()函数翻译字符.让我们假设变量a包含以正确顺序排列的字母表的小写字符,并且变量a1保存与其中的字符串相对应的字符串a(下面是英文字母的示例).

:let a = 'abcdefghijklmnopqrstuvwxyz'
:let a1 = a[2:] . a[:1]
Run Code Online (Sandbox Code Playgroud)

为避免手工输入整个字母,a可以按如下方式生成值,

:let a = join(map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)'), '')
Run Code Online (Sandbox Code Playgroud)

然后,要用字母表中的两个字母替换一行中的每个字母,请使用替换

:%s/.*/\=tr(submatch(0), a . toupper(a), a1 . toupper(a1))
Run Code Online (Sandbox Code Playgroud)

1 对于ASCII和UTF-8中的一些字母表都是如此,例如英语.

2 在运行命令之前,请确保相应地encoding设置了该选项.