Answers:
使用“ :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。
如果您希望在当前行中尝试,则可以尝试一下,但是请记住,该行的旧内容将被删除:
:.!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上测试
您可以在.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
可以帮助您完成此操作)。
在普通模式(退出/提示模式)下粘贴
:exec 'normal i'.system("date \| tr '\n' ' '")
获取插入到当前位置的日期。如果用回车键复制该行,则Shift + Insert会成为您的DateTime-Here命令。
另外,您可以使用以下命令将F12绑定到命令
:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>
那么您可以在插入模式处于活动状态时使用功能键12插入日期。我用
:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>
(发现粘贴ADHERE触发后,我从DHERE更改了),因为我已经将F12用于其他用途。
我用
grep -iE "dhere" /usr/share/dict/words
检查与现有单词的明显冲突,这表明您使用起来相对安全:
:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>
(除非您正在编写某些文档。)