目的
目的是在使用 Vim 写入文件时更新文件中的数字。如果日期驻留在文件中,则日期部分应保持不变,但最后一位数字需要增加 1。
尝试
尝试1
/home/用户/.vimrc
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/
/临时/测试
4014122100
写入文件的结果是:
2014122100
"/tmp/test" 2L, 29C written
尝试2
/home/用户/.vimrc
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=submatch(0)+1
/临时/测试
4014122100
写入文件的结果是:
2014122101
"/tmp/test" 2L, 29C written
尝试3
function! ChangeDateIfApplicableAndIncrementLastDigit()
if !match(getline(1,"$"),strftime("%Y%m%d")) >= 0
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/
endif
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=submatch(0)+1
endfunction
autocmd BufWriteCmd /tmp/test call ChangeDateIfApplicableAndIncrementLastDigit()
预期成绩
Number of writesExpected result
1 2014122101
2 2014122102
3 2014122103
目前的结果
Number of writesCurrent outcome
1 2014122101
2 2014122101
3 2014122101
答案1
所以,如果我没猜错的话,你的第一次和第二次尝试表明基本机制是有效的,但你正在努力将所有东西放在一起,对吗?!
问题在于BufWriteCmd
;该钩子应该自己写入缓冲区内容。这网络例如,插件使用它们来实现远程文件系统访问。您只需为您的函数定义一个BufWritePre
钩子,然后根据是否找到当前日期来执行操作:
function! ChangeDateIfApplicableAndIncrementLastDigit()
if !match(getline(1,"$"),strftime("%Y%m%d")) >= 0
%s/\d\{10}/\=strftime("%Y%m%d00")/
else
%s/\d\{10}/\=submatch(0)+1
endif
endfunction
autocmd BufWritePre /tmp/test call ChangeDateIfApplicableAndIncrementLastDigit()