例如,: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"))
将其放在下一行,然后您可以按J
(Shift+ J)将其连接到当前位置。
或者,如果您需要在一个命令中完成所有操作,您可以这样做
:call setline(line('.'), getline(line('.')) . strftime("%c"))
或者
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
取决于您是否想要在日期之前插入空格。