Vim 用 unicode 字符替换

Posted

技术标签:

【中文标题】Vim 用 unicode 字符替换【英文标题】:Vim replace with unicode character 【发布时间】:2013-02-02 17:08:57 【问题描述】:

我已经看到有关如何使用 :help regexp 和 \%u 在 vi​​m 中搜索 unicode 字符的提示,但我无法弄清楚如何用十六进制定义的 unicode 字符替换文本。

特殊情况是 DefaultKeyBindings.dict 需要 cmets 将在注释中打印该行中映射的字符。

开始:

blah blah...\U2234  

命令:

:s/\v.*\\U(\d4)/& \/\*\\\\%u\1 \*\/  

结果:

blah blah...\U2234 /*\%u2234 */  

目标:

blah blah...\U2234 /* ∴ */

【问题讨论】:

【参考方案1】:

您需要将十六进制 Unicode 值的字符串表示形式转换为它所表示的实际字符。这是nr2char() 的任务,可以通过:help sub-replace-expression 嵌入到替换中:

:substitute+\v.*\\U(\d4)\zs+\='/* '.nr2char(str2nr(submatch(1),16)).' */'+

Protip:使用不同的分隔符(我选择了+ 而不是/),那么你就不需要转义了。

【讨论】:

哈,打败我了,还有一个更好的答案,很好地使用\zsstr2nr()。请注意,'encoding' 必须设置为 UTF-8 才能使nr2char() 工作,请参阅:h nr2char()【参考方案2】:

您可以在替换文本中使用带有\= 的表达式。将此与nr2char() 函数结合起来,以获得可行的解决方案。这是一个开始:

s^.*\\U\(\d\4\)^\=submatch(0).' // '.nr2char(printf('%d','0x'.submatch(1)))

这将转换行

Bla bla ... \U2234

Bla bla ... \U2234 // ∴

根据nr2char() 函数的要求,我使用printf() 将十六进制数转换为十进制数。我确信这可以改进。

请注意,您必须将 'encoding' 设置为 UTF-8 才能使其正常工作,请参阅 :h nr2char()

【讨论】:

【参考方案3】:

几乎没有那么优雅,但包含在此处以供将来的读者阅读。

:%s#\U2234#/* ∴ */#

然后输入 Control-V u 2 2 3 4 在表达式中创建角色。

字符上的相关注释“ga”将告诉您 Unicode 值以及键入它的二合字母方法(如果有)。

【讨论】:

以上是关于Vim 用 unicode 字符替换的主要内容,如果未能解决你的问题,请参考以下文章

python unicode用空字符串替换反斜杠u

中文字符替换为其unicode编码值小3的字符

vim怎么替换每行出现的第一个指定字符

nth-child自定义:用Unicode字符替换项目符号,并且不适用于嵌套的

如何从雪花中删除 Unicode 替换字符

如何在 Vim 中用换行符替换字符