我想在替换命令的替换字符串中使用十六进制 Unicode 转义,即使用示例字符 U+20AC:
:s#something#\x{20AC}#g
上面的例子不起作用,因为它在替换字符串中使用 Perl 语法,但我希望它在 Vim 中工作,并且我希望它也适用于许多不同的其他可能的 Unicode 字符,由它们的十六进制值(2 或4 位数字或可能更多)。由于这是由脚本生成的一系列替换语句,因此我希望替换语句本身仅是 ASCII,因为这样更容易使用。我认为必须有一个正确的语法,但我就是找不到它。 \%u20AC 在搜索模式中有效,但在替换字符串中无效。由于这不是交互式完成的,因此 CTRL-V + 4 个十六进制数字方法将不起作用。
答案1
:s#something#\=nr2char(0x20AC)#g
请参阅Vim 中的:help sub-replace-expression
和。:help nr2char()
或者,如果20AC
确实是一个常数,您可以输入:
s
#
something
#
<Ctrl-V>
u
20AC
#
g
<Enter>
,给出
:s#something#€#g
请参阅:help i_ctrl-v
Vim 中的内容。
答案2
其他答案都很好;字符串插值 via:execute
是一种特别适合脚本编写的方法,所以我也提到这一点。
您可以使用:help <Char>
双引号字符串中的表示法:
let char = "\<Char-0x20AC>"
execute 's#something#' . char . '#g'
或者通过以下方式转换数字nr2char()
:
let value = 0x20AC
execute 's#something#' . nr2char(value) . '#g'
答案3
经过更多的文档阅读后,我发现至少一种非常复杂的方法来做到这一点,使用替换表达式:
:s#something#\="\<Char-0x20AC>"#g
我更喜欢它,因为它直接构建到解析器中,而不是使用 Vimscript 函数调用。
不过,人们希望有一种更简单(更直接)的方法来做到这一点。