如何将视觉选择从unicode转换为vim命令中相应的字符?

voase2hg  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(109)

我正在尝试将Unicode代码的多个示例转换为相应的字符。
我有一些文本格式如下:
U+00A9
我想在它旁边生成以下内容:
版权所有
我试过在可视化模式下选择代码,并在命令模式下使用选择范围'〈,'〉作为i_CTRL_V的输入,但我不知道如何在命令中使用特殊键。
我没有在使用手册中找到任何有用的:help命令模式。我可以用其他工具解决这个问题,但我想提高我的vim知识。任何提示都很感激。
编辑:正如@m_mlvx所指出的,我的目标是可视化地选择,然后运行一些命令来查找Unicode并进行替换。手动输入:s/U+00A9/U+00A9 ©/g这样的替换不是我感兴趣的,因为它需要手动输入每个替换的特殊字符。

aoyhnmkz

aoyhnmkz1#

任何提示都是感激不尽的。
这里有很多...

  1. :help i_ctrl-v与插入模式有关,而范围在命令行模式中很重要,因此:help command-mode完全无关。
    1.当它们处理文本时,Ex命令只对 * 行 * 起作用,而不是任意文本。这使得像'<,'>这样的范围在这种情况下无关紧要。
  • 仔细阅读:help i_ctrl-v_digit(链接自:help i_ctrl-v)后,我们可以得出结论,它应该用于:
  • 使用小写的u
  • 如果没有X1 M6 N1 X,
  • 而不用担心值的情况。

所以这两个都应该是正确的:

<C-v>u00a9
<C-v>u00A9
  • 但是,您的输入是U+00A9,因此,即使您设法“捕获”了U+00A9,您也无法按原样使用它:首先必须对它进行消毒。2我会用一个替换,但是,取决于你最后想如何使用这个值,可能有几十种方法:
substitute('U+00A9', '\(\a\)+\(.*\)', '\L\1\2', '')

说明:

  • \(\a\)捕获字母字符。
  • +与文字+匹配。
  • \(.*\)捕获其余部分。
  • \L将其后的所有内容小写。
  • \1\2会重复使用上述两个撷取群组。
  • 从这里,我们可以想象一个基于替换的方法,假设“And I want to generate the following next to it”意味着你想获得:
U+00A9©

您可以执行以下操作:

v<motion>
y
:call feedkeys("'>a\<C-v>" . substitute(@", '\(\a\)+\(.*\)', '\L\1\2', '') . "\<Esc>")<CR>

说明:

  • v<motion>可视地选择<motion>覆盖的文本。
  • y会将它硬拉到“未命名的寄存器”@"
  • :help feedkeys()是一种低级的方法,用于将一系列复杂的字符发送到Vim的输入队列。它允许我们在执行宏之前以编程方式构建宏。
  • '>将光标移动到可视选择的末尾。
  • a在光标后启动插入模式。
  • <C-v>+替换的输出将插入相应的字符。

不过,这段代码需要转换成Map。

f45qwnt8

f45qwnt82#

如果你只想将unicode转换成相应的字符,你可以使用这样的nr2char函数:

:%s/U+\(\x\{4\}\)/\=nr2char('0x'.submatch(1))/g

简要说明

U+\(\x\{4\}\) - search for a specific pattern (U+ and four hexadecimal characters which are stored in group 1)
\= - substitute with result of expression
'0x'.submatch(1) - append 0x to our group (U+00A9 -> 0x00A9)

如果您想在文本旁边使用unicode字符,则需要稍微修改右侧(使用submatch(0)获得完全匹配,使用.进行追加)

fcg9iug3

fcg9iug33#

如果有人想知道如何编写替换命令:

'<,'>s/\<[uU]+\(\x\+\)\>/\=submatch(0)..' '..nr2char(str2nr(submatch(1), 16), 1)/g

正则表达式为:

  • 字起始
  • 字母“U”或“u”
  • 文字“plus”
  • 一个或多个十六进制数字(放入“捕获组”)
  • 字尾

然后替换为以下项的(:h sub-replace-expression)串联:

  • 整个匹配字符串
  • 单空格
  • 从“捕获组”中获取的UTF-8十六进制代码字符

这将在可视/命令模式下执行,并在选定线范围内工作

相关问题