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

How to convert visual selection from unicode to the corresponding character in vim command?

我正在尝试将多个 Unicode 代码实例转换为其对应的字符。

我有一些这种格式的文本:

U+00A9

我想在它旁边生成以下内容:

©

我曾尝试 select 可视模式下的代码,并在命令模式下使用 selection 范围 '<,'> 作为 i_CTRL_V 的输入,但我没有知道如何在命令中使用特殊键。

我在使用 :help command-mode 的手册中没有找到任何有用的信息。我可以使用其他工具解决这个问题,但我想提高我的 vim 知识。任何提示表示赞赏。

编辑: 正如@m_mlvx 所指出的,我的目标是在视觉上 select,然后 运行 一些查找 Unicode 并进行替换的命令。手动输入像 :s/U+00A9/U+00A9 ©/g 这样的替换不是我感兴趣的,因为它需要在每次替换时手动输入每个特殊字符。

Any hint is appreciated.

这里有很多……

  1. :help i_ctrl-v 与插入模式有关,范围在 command-line 模式下很重要,因此 :help command-mode 完全不相关。

  2. 当它们处理文本时,Ex 命令只对有效,而不是任意文本。这使得像 '<,'> 这样的范围在这种情况下无关紧要。

  3. 仔细阅读:help i_ctrl-v_digit,链接自:help i_ctrl-v,我们可以得出结论,应该使用:

    • 小写 u,
    • 没有 +,
    • 不用担心值的大小写。

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

    <C-v>u00a9
    <C-v>u00A9
    
  4. 但是你的输入是U+00A9所以,即使你以某种方式设法“捕获”那个U+00A9,你也无法使用它as-is:必须先消毒。我会选择替换,但取决于您最终想如何使用该值,可能有许多方法:

    substitute('U+00A9', '\(\a\)+\(.*\)', '\L', '')
    

    解释:

    • \(\a\) 捕获一个字母字符。
    • + 匹配文字 +.
    • \(.*\) 捕获其余部分。
    • \L 将其后的所有内容小写。
    • </code> 重复使用上面的两个捕获组。</li> </ul> </li> <li><p>从那里,我们可以想象一个substitution-based方法。假设“And I want to generate the following next to it”表示你想获取:</p> <pre><code>U+00A9©

      你可以这样做:

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

      解释:

      • v<motion> 视觉选择被 <motion>.
      • 覆盖的文本
      • y 将它拉到“未命名寄存器”@"
      • :help feedkeys() 被用作 low-level 发送一系列复杂字符到 Vim 的输入队列的方式。它允许我们在执行之前以编程方式构建宏。
      • '> 将光标移动到视觉选择的末尾。
      • a 在光标后开始插入模式。
      • <C-v> + 替换的输出插入适当的字符。

      不过,该片段请求转换为映射。

如果您只想将 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) 获得完整匹配,使用 . 追加)

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

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

正则表达式是:

  • 单词开头
  • 字母“U”或“u”
  • 文字“加号”
  • 一个或多个十六进制数字(放入“捕获组”)
  • 单词结束

然后替换为(:h sub-replace-expression)串联:

  • 整个匹配字符串
  • 单身space
  • 来自“捕获组”的 UTF-8 十六进制代码的字符

这将在 Visual/command 模式下执行并在选定的 范围内工作。