Unix vim是否可以在不将换行符(^@)字符视为“回车”键的情况下回显寄存器的内容?
我有几行文本试图输入寄存器,然后将寄存器的内容回显到产生vim进程的终端,这样在vim退出后,文本将在终端窗口中可见 我可以在一行文本中使用它,但是一旦添加了换行符/换行符,所有尝试都会失败 使用包含以下内容的示例文件: 1A 2 ab 3 abc 4 abce 5 abcef 6 abcefg 首先,我通过以下途径将文件内容放入注册表项:%y m 然后我尝试:exe'!回音'@m 这会将第一行文本回显到终端 a 但是vim将字母a后面的第一行馈送/中断处理为按Enter键,以便抛出以下错误消息 E492:不是编辑器命令:abce^@abcef^@abcefg^@^@ 我在调试模式下运行以下命令,希望用换行符替换^@字符\n :回声substitutestrtrans@m,^@,'\n',g :回声substitutestrtrans@m,'^@','\n',g 我尝试过双引号和单引号,我尝试过按字面输入插入符号和符号,以及使用特殊字符CTRL-V+CTRL-J 不幸的是,在调试模式下,我可以看到输出总是如下所示: a^@ab^@abc^@abce^@abcef^@abcefg^@ printf也是如此。 我已经对换行符、空字符的模糊性以及vim如何在寄存器中处理这些问题做了一些梳理,但我仍不清楚我试图实现的目标是否合理。:用于nul的h nl解释说,vim将换行符“\n”显示为“^@”。所以,是的,正如您已经说过的,您将实际的换行符发送到shell 接下来,用两个字符\n 0x5c 0x6e替换一个字符“\n”ASCII 0x0a的总体思路也是正确的。您希望shell接收foo\n bar 输出显然仍然包含实际的换行符,因此我们必须转义这些字符Unix vim是否可以在不将换行符(^@)字符视为“回车”键的情况下回显寄存器的内容?,unix,vim,vi,Unix,Vim,Vi,我有几行文本试图输入寄存器,然后将寄存器的内容回显到产生vim进程的终端,这样在vim退出后,文本将在终端窗口中可见 我可以在一行文本中使用它,但是一旦添加了换行符/换行符,所有尝试都会失败 使用包含以下内容的示例文件: 1A 2 ab 3 abc 4 abce 5 abcef 6 abcefg 首先,我通过以下途径将文件内容放入注册表项:%y m 然后我尝试:exe'!回音'@m 这会将第一行文本回显到终端 a 但是vim将字母a后面的第一行馈送/中断处理为按Enter键,以便抛出以下错误消息
: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对字符串求值,因此使用一级字符串。因此,我们必须再次转义换行,而对于每一级字符串,我们必须将转义的数量增加一倍
因此,我们不仅需要一个\nab\nabc,还需要一个\\nab\\nabc:
:h用于nul的nl解释了换行符“\n”由Vim显示为^@。所以,是的,正如您已经说过的,您将实际的换行符发送到shell
接下来,用两个字符\n 0x5c 0x6e替换一个字符“\n”ASCII 0x0a的总体思路也是正确的。您希望shell接收foo\n bar
输出显然仍然包含实际的换行符,因此我们必须转义这些字符
: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对字符串求值,因此使用一级字符串。因此,我们必须再次转义换行,而对于每一级字符串,我们必须将转义的数量增加一倍
因此,我们不仅需要一个\nab\nabc,还需要一个\\nab\\nabc:
我认为您正在寻找shellescape: 使用非零arg作为第二个参数,字符也将转义 有关更多帮助,请参阅:
:h shellescape()
我认为您正在寻找shellescape: 使用非零arg作为第二个参数,字符也将转义 有关更多帮助,请参阅:
:h shellescape()
我已经能够使用命令绕过这个问题:!cat%而不是echo。它确实需要先保存文件以使其具有名称,这对于我的情况并不理想,因为文件可能包含敏感信息。我仍然很想知道为什么我对echo的尝试失败了,以及为什么替换函数没有替换^@字符。我已经能够使用命令解决这个问题:!cat%而不是echo。它确实需要先保存文件以使其具有名称,这对于我的情况并不理想,因为文件可能包含敏感信息。我仍然很想知道为什么我的echo尝试失败了,为什么替换函数没有替换^@字符。谢谢@mhinz这是一个如此清晰的分解和伟大的例子!谢谢@mhinz这是一个如此清晰的细分和伟大的例子!