在使用 :r!date 和其他 shell 命令时,如何防止在 Vim 中出现前导换行符?

在使用 :r!date 和其他 shell 命令时,如何防止在 Vim 中出现前导换行符?

大多数情况下,当我插入日期时,我都会尝试在行的中间插入。默认情况下,:r!插入方式似乎总是将结果放在新行上。这对我来说是有道理的,因为大多数 shell 命令在显示命令结果之前都会输出一个换行符,这在终端中当然是更好的选择。在从 Vim 中执行像 这样的小命令的情况下date +%x,这不是我喜欢的行为。我该如何解决这个问题?

答案1

在插入模式下,您可以使用Ctrl-R=在当前光标位置插入表达式。

例如,您可以使用system()函数,但不幸的是,这只能解决一半的问题,因为的输出system()总是至少会添加最后一个换行符,因此它会在输入后换行。有关如何避免出现这些最后的换行符的解决方案system(),请查看此我在 vi.stackexchange 上回答

(因此您可以使用Ctrl-R=systemlist('date')[0] Enter)。


在当前光标位置插入日期的另一种方法是使用Ctrl-R=strftime('%c')Enter

Ctrl-R=正在使用表达式寄存器插入内容。您可以使用命令了解更多信息:help i_ctrl-r,或者查看 appspot 上的文档

答案2

我认为问题不在于 shell 命令通常结尾带有换行符,但这read是一个面向行的命令(即前任ed命令)。它在20 世纪 70 年代的原始版本中就已经存在,当时还没有出现,常见的用例是将一个文件中的一组行(例如,C 函数或一段文本)读入另一个文件中。大多数用户大多数时候都希望将它们插入为新的单独行。:r!command

您可以通过执行 来检查/演示这一点:r!printf Tuesday。即使printf Tuesday命令没有写出换行符(因为您没有指定\n),您也会Tuesday自己得到一行。

也许最简单的解决方法是执行 i Enter Esc(中断当前行), -或者k向上移动一行,然后执行,然后将行重新合并。如果您经常这样做,那么为其映射宏可能会有所帮助。:r!commandJJoin

披露:我vi相当了解,但还有很多东西vim我还没学会。也许有更简单的方法可以做到这一点vim

相关内容