如何更新文件中的日期(如果适用)并在使用 Vim 写入文件时将最后一位数字加一?

如何更新文件中的日期(如果适用)并在使用 Vim 写入文件时将最后一位数字加一?

目的

目的是在使用 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()

相关内容