![vim r! 在光标位置](https://linux22.com/image/1324673/vim%20r!%20%E5%9C%A8%E5%85%89%E6%A0%87%E4%BD%8D%E7%BD%AE.png)
使用 vim,如果我使用
:r!date
vim 在下一行插入日期,类似
:r!pwd
如何在光标位置下插入输出命令而不在新行中插入?
答案1
使用“ :read
”时,Vim 总是会将输出插入到新行。遗憾的是,解决方案并不简单。
在插入模式下,您可以通过按下 然后ControlR输入将命令的输出插入到当前光标位置=system('command')
Enter。不幸的是,如果命令的输出有一个尾随换行符(大多数情况下都会有),它也会被插入,所以你的行会被打断。
可以通过添加一个substitute()
调用来删除尾随换行符来解决此问题,但这会使命令比手动输入更麻烦。
最终的解决方案是创建某种映射,但由于 Vim 处理所谓的“提前输入”的方式,这变得更加复杂;您可以执行以下操作:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
如果命令在映射中是“硬连线的”,则您不能执行以下操作:
:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>
您尝试提示用户运行命令,因为 Vim 会感到困惑,发出哔哔声并进入插入模式。
因此,您必须先提示运行命令,将其存储在变量中,然后插入处理后的输出。此时可能需要一个辅助函数来防止映射本身变得难以管理的混乱,因此我们最终得到如下结果:
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
请注意,nmap
创建的映射仅在正常模式下输入时执行。
顺便说一句,如果你只想插入日期或当前工作目录,我给出的初始答案是可行的。只需进入插入模式并输入ControlR=strftime('%c')
Enter或ControlR=getcwd()
Enter。
答案2
如果您希望它位于当前行,请尝试一下,但请记住该行的旧内容将被删除:
:.!date
如果您想要精确的光标位置,您可以:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
长话短说:您需要替换,因为您想删除 ^@(空字符),您也可以用 .s/\%x00//g 替换它。这是一个较短的版本,管道较少:
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
如果您想在同一行的各个点进行替换,您还可以设置标签:
鉴于第 1 行:
1 Date: <datehere> and also <datehere>
执行:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
更换后:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
在 Vim 7.2 上测试
答案3
你可以在 .vimrc 中添加这样的内容:
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me
标记当前位置。:r !date +\%F<CR>
将日期以 YYYY-MM-DD 格式放在下一行(您可以随意更改,只需使用 退出即可%
)\
。A <Esc>
在日期输出末尾附加一个空格。0D
删除日期,`e
返回标记位置,并将PJx
日期置于光标之前,连接行(以删除下面的空行)并删除尾随空格。根据需要修改映射。
如果你想从插入模式执行此操作,我今天在https://vimways.org/2018/the-mapping-business/
inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>
您可以修改日期输出以满足您的需要(man date
可以提供帮助)。
答案4
如果要在当前行上方插入,请运行:
:-1 read !date
或者
:-r!date
看:help [range]
和:help :range-offset
了解更多信息。这些命令在 Vim v9.0.1736 上进行了测试。