![在 vim 中的当前位置插入系统命令的输出](https://linux22.com/image/962856/%E5%9C%A8%20vim%20%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE%E6%8F%92%E5%85%A5%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA.png)
在 vim 中,当我使用
:r !ls somefilename
它将命令的输出插入到当前行下方的新行中。
如果我做
let @a = system("ls")
然后
"ap
它仍然会在当前行下方的新行上插入输出。
有没有办法让 vim 在当前位置插入输出?
答案1
:r !command
将读取命令的输出并将其插入到当前行的下一行。这就是 vi 的编程方式,您无法更改此行为。
但是假设您在第 3 行。如果您尝试:r !date
。它会将日期值插入到第 4 行。
如果您希望日期值出现在第 3 行,那么您可以尝试:2r !date
将日期值插入第 3 行。
答案2
您可以在插入模式下使用 Ctrl-R * 将剪贴板缓冲区的内容粘贴在字符之间(其他缓冲区的方法类似)。因此,如果您可以将系统命令放入缓冲区,那么就应该可以了。(来源:https://stackoverflow.com/questions/1491135/paste-multi-line-string-into-gvim-at-cursor-position)。
:let @a=system("ls -l")
会将 的输出放入ls -l
寄存器a
。然后您可以使用 粘贴它(在插入模式下)^R-a
。
答案3
以下是在光标前粘贴外部命令的输出的另一种方法:
:exe 'norm i' . system("ls -l")
或者使用表达式寄存器( :help @=
):
"=system('ls -la')
然后点击P。或者更简单的方法是:
<CTRL-R>=system('ls -la')<CR>
答案4
该:r
命令接受一个行范围,结果将被读入该范围。在 vim 命令行中,.
范围中的“ ”表示“当前行”。因此,:r ...
相当于:.r ...
,表示“将我正在读取的内容放在当前行之后”。
您可以自由地使用基于的表达式指定要写入的范围.
。具体来说,您要求的事情应该可以轻松完成:
:.-1r !ls somefilename