Vim替换为unicode字符

时间:2013-02-02 17:08:58

标签: regex unicode vim

我已经看到了如何在vim中搜索unicode字符的提示:help regexp和\%u,但是我还没弄清楚如何用十六进制定义的unicode字符替换文本。

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

开始:

blah blah...\U2234  

命令:

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

结果:

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

目标:

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

3 个答案:

答案 0 :(得分:8)

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

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

Protip:使用不同的分隔符(我选择+而非/),然后您无需逃避。

答案 1 :(得分:3)

您可以在替换文本中使用\=的表达式。将其与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()

答案 2 :(得分:0)

不是那么优雅,但包含在这里供未来的读者使用。

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

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

相关说明' ga'在一个字符上将告诉你Unicode值以及如果可用的键入它的digraph方法。