假设我在文件中以XXXX为占位符的一行,是通过以下方式通过v选择的:

XXXX Some other text


如何仅更改XXXX的输出外部命令,例如date +%Y%m%d吗?

我已经了解到

:'<,'>!date +\%Y\%m\%d 


,但替换了整行。

评论

有关stackoverflow的相关问题:stackoverflow.com/q/8403599/…

#1 楼

您可以使用CtrlR- =删除文本并插入命令的输出:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)


对于表达式,可以使用system()函数运行外部命令。 br />
选择文本后,按c,然后按<c-r>=并使用system('date +%Y%m%d')作为表达式。

评论


那在被替换的文本和行的其余部分之间添加了换行符,不是吗?

–muk.li
16年4月17日在20:10

@ muk.li是日期输出的一部分。如果您尝试使用诸如system('printf%s foo')之类的方法,但不会输出结尾的换行符,则会发现两者之间存在差异。

–muru
16 Apr 17 '20:12



@ muk.li如果您只想在文本中输入日期,则可以使用strftime函数代替system('date…')。格式字符串是相同的。

–muru
16 Apr 17 '20:27



您不需要删除选定的文本。您可以在视觉选择上使用“ = system('date +%Y%m%d')p。

– Hauleth
16年4月18日在8:03

#2 楼

如果将光标放在这样的行上,可以执行以下操作:




0将光标放置在第一列中。

f放置空格将光标移到第一个空格中。

i输入Esc分割行。

l将光标向上移动一行。

:.!date +\%Y\%m\%d至执行命令。

J重新加入这些行。

:h :visual_example开始:


当前,“:”命令适用仅整行。当你选择某一行的一部分,执行一个类似“:!日期”将取代整条生产线。如果只希望替换部分行,则必须为其进行映射。在将来的版本中,“:”可能会在部分行上使用。


有关详细信息,请参见:h visual-operators

从此注释:您也可以尝试使用vis或NrrwRgn插件。两者都应该处理得很好。 (感谢@ christian-brabandt的提示)。

#3 楼

为此类替换创建临时映射。例如:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>


然后在可视模式下,您可以选择文本,键入qq,它将由命令输出替换。在此示例中,wc -c将处理您的选择,这是@"参数。需要perl -pe chomp才能从输出中删除尾随换行符。

评论


请注意,此解决方案是muru答案的包装,创建一次性使用的映射可能不是最有效的方法。

–statox♦
18年11月13日在16:06

#4 楼

尝试以下操作:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g



第一行将date命令的输出保存到寄存器a中,并删除结尾的换行符。
第二行全局检查您的选择并标记包含XXXXg/XXXX/)的行,并
XXXX的所有实例替换为寄存器a(s/XXXX/\=@a/g)的内容

请参阅:h let-@:h :global以及:h list-index中的“子列表”部分

#5 楼

插件:DrChip的Visual Block Commands(vis)

vis.vba.gz和依赖项cecutil.vba.gz安装到vim8 packpath

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil


OP示例变为

:'<,'>B !date +\%Y\%m\%d