Vim 用 unicode 字符替换
Posted
技术标签:
【中文标题】Vim 用 unicode 字符替换【英文标题】:Vim replace with unicode character 【发布时间】:2013-02-02 17:08:57 【问题描述】:我已经看到有关如何使用 :help regexp 和 \%u 在 vim 中搜索 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:使用不同的分隔符(我选择了+
而不是/
),那么你就不需要转义了。
【讨论】:
哈,打败我了,还有一个更好的答案,很好地使用\zs
和str2nr()
。请注意,'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 字符替换的主要内容,如果未能解决你的问题,请参考以下文章