繁体   English   中英

vim是否可以在不将换行符(^ @)视为“ Enter”键的情况下回显寄存器的内容?

[英]Can vim echo the contents of a register without treating linefeed(^@) characters as “Enter” key press?

我尝试输入一些文本行,然后将寄存器的内容回显到产生vim进程的终端,以便在退出vim后在终端窗口中可见该文本。

我可以使它与一行文本一起正常工作,但是一旦添加了换行符/换行符,所有尝试执行此操作的尝试都会失败。

使用包含以下内容的示例文件:

1个
2 Ab
3 abc
4位
5 abcef
6 abcefg

首先,我通过“:%ym”将文件内容放入一个register(“ m)中,然后尝试”:exe'!echo'@m“

这将文本的第一行回显到终端

一种

但是vim像按Enter键一样对待字母“ a”后的第一行换行/换行,从而引发以下错误消息

E492:不是编辑器命令:abce ^ @ abcef ^ @ abcefg ^ @ ^ @

我在“:debug”模式下运行以下命令,希望用换行符(\\ n)替换^ @字符

:echo replace(strtrans(@m),“ ^ @”,'\\ n',“ g”)
:echo replace(strtrans(@m),'^ @','\\ n',“ g”)

我已经尝试过使用双引号和单引号,并且已经尝试键入插入符号和&符号,以及使用特殊字符CTRL-V + CTRL-J不幸的是,在调试模式下,我可以看到输出始终是以下内容:

a ^ @ ab ^ @ abc ^ @ abce ^ @ abcef ^ @ abcefg ^ @ ^ @

对于printf同样如此。 我已经对换行符,空字符以及vim如何在寄存器中对待它们的歧义进行了一些梳理,但仍不清楚我要实现的目标是否合理。

:h nl-used-for-nul解释换行符'\\n'由Vim显示为^@ 因此,是的,正如您已经说过的,您将实际的换行符发送到外壳。

接下来,将一个字符'\\n' (ASCII 0x0a)替换为两个字符"\\n" (0x5c 0x6e)的一般想法也是正确的。 您希望外壳程序接收foo\\nbar

:echo substitute(@m, '\n', '\n', 'g')
a
ab
abc
abce
abcef
abcefg

输出显然仍然包含实际的换行符,因此我们必须对此进行转义。

:echo substitute(@m, '\n', '\\n', 'g')
a\nab\nabc\nabce\nabcef\nabcefg\n

看起来不错! 因此,让我们尝试一下您想到的整个命令:

:execute '!echo' substitute(@m, '\n', '\\n', 'g')
anabnabcnabcenabcefnabcefgn

Press ENTER or type command to continue

嗯? :execute计算字符串,因此消耗 “一级字符串”。 因此,我们必须再次对换行符进行转义,而对于每个“字符串级别”,我们必须将转义量加倍

因此,我们不仅需要a\\nab\\nabc ,还需要a\\\\nab\\\\nabc

:echo substitute(@m, '\n', '\\\\n', 'g')
a\\nab\\nabc\\nabce\\nabcef\\nabcefg\\n

:execute '!echo' substitute(@m, '\n', '\\\\n', 'g')
a
ab
abc
abce
abcef
abcefg


Press ENTER or type command to continue

🎉

补充笔记:

  • 当使用双引号(用于处理转义符)而不是单引号的字符串时,我们将不得不再次将转义量加倍: substitute(@m, '\\n', "\\\\\\\\\\\\\\\\n", 'g')
  • 如果要删除尾随的换行符,请使用trim(@)

我认为您正在寻找shellescape()

:execute "!echo " . shellescape(@@, 1)

使用非零参数作为第二个参数, <NL>字符也被转义。

有关更多帮助,请参见:

:h shellescape()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM