XXXX
为占位符的一行,是通过以下方式通过v
选择的:XXXX Some other text
如何仅更改
XXXX
的输出外部命令,例如date +%Y%m%d
吗?我已经了解到
:'<,'>!date +\%Y\%m\%d
,但替换了整行。
#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中,并删除结尾的换行符。第二行全局检查您的选择并标记包含
XXXX
(g/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
评论
有关stackoverflow的相关问题:stackoverflow.com/q/8403599/…