vim r! 在光标位置

vim r! 在光标位置

使用 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')EnterControlR=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 上进行了测试。

相关内容