2013-02-02 117 views
2

我已經看到如何在vim中使用help regexp和\%u搜索unicode字符的提示,但我一直無法弄清楚如何用十六進制定義的unicode替換文本字符。Vim替換爲unicode字符

特殊情況是DefaultKeyBindings.dict需要註釋,該註釋將在評論中打印該行中映射的字符。

開始:

blah blah...\U2234 

命令:

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

結果:

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

目標:

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

回答

7

您需要將十六進制Unicode值的字符串表示形式轉換爲由其表示的實際字符。這是nr2char()任務,可以通過:help sub-replace-expression被嵌入到替代:

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

普羅蒂普:使用不同的分隔符(我選擇了+/),那麼你就需要逃跑。

+0

哈,打我和它,還有一個更好的答案,用'\ zs'和'str2nr()'很好用。請注意,'encoding'必須設置爲UTF-8才能使'nr2char()'工作,請參閱[':h nr2char()'](http://vimdoc.sourceforge.net/htmldoc/eval.html# nr2char%28%29)。 – glts

+0

很棒的迴應。謝謝。 – user1992284

2

您可以在替代文本中使用\=中的表達式。將此功能與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()