4

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

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

开始:

blah blah...\U2234  

命令:

:s/\v.*\\U(\d{4})/& \/\*\\\\%u\1 \*\/  

结果:

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

目标:

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

3 回答 3

8

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

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

Protip:使用不同的分隔符(我选择+了 over /),那么你不需要逃避。

于 2013-02-02T18:26:34.987 回答
4

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

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

这将转换行

Bla bla ... \U2234

Bla bla ... \U2234 // ∴

我根据函数printf()的要求用于从十六进制数到十进制数的转换nr2char()。我确信这可以改进。

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

于 2013-02-02T18:26:01.303 回答
0

几乎没有那么优雅,但包括在这里供未来的读者阅读。

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

并键入 Control-V u 2 2 3 4 以在表达式中创建角色。

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

于 2018-05-29T19:10:12.363 回答