我已经看到了如何在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 /* ∴ */
答案 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方法。