如何将命令的结果插入到vim中的文本中?

如何将命令的结果插入到vim中的文本中?

例如,:echo strftime(%c)将在底部显示当前时间,但是如何将此时间字符串插入到文本中(就在光标之后)?

答案1

:r!date +\%c

:help :r!

请注意,这是针对外部命令(它们在您的 shell 中运行),而不是 vim 命令。

答案2

您可以使用表达式寄存器"=,,p(或者P在正常模式下或<C-R>在插入模式下:

在正常模式下:(
这里<C-M>表示Control+ M,或者直接按Enter/ Return)

"=strftime('%c')<C-M>p

插入模式下:(
同上<C-M><C-R>表示Control+ R)

<C-R>=strftime('%c')<C-M>

如果你想多次插入同一个表达式的结果,那么你可能需要将它们映射到.vimrc:中的键上
(这里的<C-M><C-R>应该按字面输入(五个可打印字符的序列 — Vim 将在内部翻译它们))

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>

答案3

如果你想插入vim的输出命令(就像 shell 中的 stdout 一样,而不是函数调用的返回值或一个表达),你必须捕捉它。这是通过:redir命令完成的,该命令允许您将 vim 的标准输出等效项重定向到变量、文件、寄存器或其他目标。

:redir使用起来有点不方便;我会编写一个函数以更方便的方式封装其功能,例如

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

一旦声明了这样的函数,您就可以使用表达式寄存器(如 Chris Johnsen 所解释的)在光标位置插入命令的输出。因此,在正常模式下,点击:put =Exec('ls')插入 vim 当前缓冲区列表。

请注意,该命令将在函数命名空间中执行,因此如果您使用全局变量,则必须通过在其前面加上g:.另请注意Exec(),如上所述,即使是单行输出,也会附加一个终止换行符。您可能需要添加对substitute()函数的调用以避免这种情况。

另请参阅https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054有关更多内容redir以及相关命令的链接。

答案4

:call append(line('.'), strftime("%c"))

将其放在下一行,然后您可以按JShift+ J)将其连接到当前位置。

或者,如果您需要在一个命令中完成所有操作,您可以这样做

:call setline(line('.'), getline(line('.')) . strftime("%c"))

或者

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

取决于您是否想要在日期之前插入空格。

相关内容