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

xzh*_*zhu 69 vim

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

Chr*_*sen 71

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

在正常模式下:
<C-M>在这里意味着Control+ M,或者只是按Enter/ Return

"=strftime('%c')<C-M>p
Run Code Online (Sandbox Code Playgroud)

在插入模式:
<C-M>具有相同的含义如上,<C-R>装置Control+ R

<C-R>=strftime('%c')<C-M>
Run Code Online (Sandbox Code Playgroud)

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

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
Run Code Online (Sandbox Code Playgroud)

  • :put =strftime('%c')&lt;CM&gt; (5认同)
  • +1 当然!`"=` 寄存器。:-/ (3认同)
  • 获取vim变量的值(例如,sessionoptions):`&lt;CR&gt;=&amp;sessionoptions`——它甚至可以完成wildmode tab-completion! (2认同)

gle*_*man 61

:r!date +\%c

:help :r!

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

  • @Keith:是的,`!` 是一个调用 *external* 命令的 vi(m) 命令。你可能是对的 OP 不想只输出 vim 命令,但如果他这样做,`!` 不会。 (5认同)
  • @eelvex 不,他没有。和!是一个 vim 和 vi 命令。这是规范方法。也适用于许多其他事情。 (3认同)
  • `date` 是一个外部命令,`!` 调用外部命令,而 OP 请求 vim 命令。 (2认同)
  • 您可以将外部命令的输出与您定义的文本结合起来。例如,下面添加两个英镑符号和下周二的日期(“##星期二,2020-06-23”):`:exe 'r!date --date="next Tuesday" "+\%A, \%Y-\%m-\%d"' | 正常的我##` (2认同)

int*_*ted 15

如果要插入 vim命令的输出(与函数调用表达式返回值相反),则必须捕获它。这是通过:redir命令完成的,该命令允许您将 vim 的标准输出等价物重定向到变量、文件、寄存器或其他目标。

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

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!
Run Code Online (Sandbox Code Playgroud)

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

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

另请参阅/sf/ask/180111501/#2573054了解更多关于 about 的废话redir和链接一个相关的命令。

  • 这很好用。我在返回输出之前添加了一个 `set paste` 命令,然后添加了一个 `set nopaste`,以避免当行以空格开头时出现阶梯式缩进。实际上,我想保存当前粘贴选项的值并返回它,但我无法这样做。 (2认同)

Eel*_*vex 11

这些命令将strftime("%c")在光标所在的位置插入输出:

:exe ":normal i" . strftime("%c")
Run Code Online (Sandbox Code Playgroud)

:call feedkeys("i". strftime("%c"))
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以做你想做的事(例如,米克尔的回答中的那些)。

编辑:更好的是,对于就地插入,请使用Chris Johnsen 描述=寄存器


Mik*_*kel 5

:call append(line('.'), strftime("%c"))
Run Code Online (Sandbox Code Playgroud)

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

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

:call setline(line('.'), getline(line('.')) . strftime("%c"))
Run Code Online (Sandbox Code Playgroud)

或者

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
Run Code Online (Sandbox Code Playgroud)

取决于您是否希望在日期之前插入一个空格。


idb*_*rii 5

:put您可以与表达式寄存器一起使用=

:put =strftime('%c')
Run Code Online (Sandbox Code Playgroud)

此方法允许您创建一个替代命令来:echo调用:InsertExpr来插入您的表达式:

command! -nargs=* InsertExpr put =<args>
Run Code Online (Sandbox Code Playgroud)

或者插入如下命令:ls

command! -nargs=* InsertCmd put =execute('<args>')
Run Code Online (Sandbox Code Playgroud)

(不知道为什么我无法让 q-args 工作。)

用法:

:InsertExpr strftime('%c')
:InsertCmd ls
Run Code Online (Sandbox Code Playgroud)