如何将视觉选择从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.
这里有很多……
:help i_ctrl-v
与插入模式有关,范围在 command-line 模式下很重要,因此 :help command-mode
完全不相关。
当它们处理文本时,Ex 命令只对行有效,而不是任意文本。这使得像 '<,'>
这样的范围在这种情况下无关紧要。
仔细阅读:help i_ctrl-v_digit
,链接自:help i_ctrl-v
,我们可以得出结论,应该使用:
- 小写
u
,
- 没有
+
,
- 不用担心值的大小写。
所以这两个应该是正确的:
<C-v>u00a9
<C-v>u00A9
但是你的输入是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 模式下执行并在选定的 行 范围内工作。
我正在尝试将多个 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.
这里有很多……
:help i_ctrl-v
与插入模式有关,范围在 command-line 模式下很重要,因此:help command-mode
完全不相关。当它们处理文本时,Ex 命令只对行有效,而不是任意文本。这使得像
'<,'>
这样的范围在这种情况下无关紧要。仔细阅读
:help i_ctrl-v_digit
,链接自:help i_ctrl-v
,我们可以得出结论,应该使用:- 小写
u
, - 没有
+
, - 不用担心值的大小写。
所以这两个应该是正确的:
<C-v>u00a9 <C-v>u00A9
- 小写
但是你的输入是
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 模式下执行并在选定的 行 范围内工作。