Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix vim是否可以在不将换行符(^@)字符视为“回车”键的情况下回显寄存器的内容?_Unix_Vim_Vi - Fatal编程技术网

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

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键,以便抛出以下错误消息

我有几行文本试图输入寄存器,然后将寄存器的内容回显到产生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

输出显然仍然包含实际的换行符,因此我们必须转义这些字符

: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这是一个如此清晰的细分和伟大的例子!