Vim strftime计算

时间:2013-08-22 16:05:22

标签: vim

我有一个非常简单的ToDo文件,如下所示:

130821 Go to the dentist
130824 Ask a question to StackOverflow
130827 Read the Vim Manual
130905 Stop reading the Vim Manual

我想计算 - 每次打开文件 - 剩余天数,直到不同的截止日期(今天是2013年8月22日,即巴黎的130822),从而获得如下内容:

130821 -1 Go to the dentist
130824 2 Ask a question to StackOverflow
130827 5 Read the Vim Manual
130905 14 Stop reading the Vim Manual

但我不知道如何实现(并且我不知道它是否合理:cf. glts' comment)

我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

此命令将执行所需的替换,但计算错误(它不会按原样运行):

%s#\v^(\d{6})( -?\d+)?#\=submatch(1).' '.(submatch(1)-strftime("%y%m%d"))

请参阅:help sub-replace-expression,:help submatch(),: help strftime()。

请注意我使用\v将Vim的正则表达式解析器置于“非常神奇”的模式。

只要使用BufReadPost autocmd加载文件,就可以轻松应用此功能。

类似的东西:

augroup TODO_DATE_CALC
au!
au BufReadPost myToDoFileName %s#\v^(\d{6})( -?\d+)?#\=submatch(1).' '.(submatch(1)-strftime("%y%m%d"))
augroup END

Find out the time since unix epoch for a certain date time?显示了如何获取特定日期的unix时间,您可以使用Vim中的system()函数来获取结果。但我目前还没有系统来测试它。我想你可能在Windows上运气不好。

除非您可以更改文件格式以包含unix时间......否则它应该相当容易。

答案 1 :(得分:0)

虽然他们深信不疑,但我对我的问题的答案感到很失望。我试图找到一个解决方案,似乎我几乎成功了。毋庸置疑,这是一个笨拙的装置,但它确实有效。

首先,文件(为了测试目的稍作修改):

130825 Past ToDo test 
130827 Today's ToDo test 
130829 In two days ToDo test 
130831 Another test 
130902 Change of month ToDo test 
131025 Another change of month test 

其次,http://www.epochconverter.com给出的数据:

1 day                   = 86400 seconds
1 month (30.44 days)    = 2629743 seconds
1 year (365.24 days)    = 31556926 seconds

第三,我修改的功能:

function! DaysLeft()

  :normal! gg

  let linenr = 1
  while linenr <= line("$")
  let linenr += 1
  let line = getline(linenr)

  :normal! 0"ayiw
  :.s/\(\(\d\d\)\)\(\d\d\)\(\d\d\)\>/\1
  :normal! 0"byiw
  :execute "normal! diw0i\<C-R>a"

  :normal! 0"ayiw
  :.s/\(\d\d\)\(\(\d\d\)\)\(\d\d\)\>/\2
  :normal! 0"cyiw
  :execute "normal! diw0i\<C-R>a"

  :normal! 0"ayiw
  :.s/\(\d\d\)\(\d\d\)\(\(\d\d\)\)\>/\3
  :normal! 0"dyiw
  :execute "normal! diw0i\<C-R>a"

  let @l = strftime("%s")

  :execute "normal! 0wi\<C-R>=((\<C-R>b+30)*31556926+(\<C-R>c-1)*2629743+(\<C-    R>d-1)*86400+1-\<C-R>l)/86400\<Enter>\<tab>"

  exe linenr
  endwhile

  endfunction
第四,结果:

130825 -2   Past ToDo test
130827 0    Today's ToDo test
130829 1    In two days ToDo test
130831 3    Another test
130902 5    Change of month ToDo test
131025 58   Another change of month test

正如您所看到的,有一个小问题:130829 ToDo显示为1天而不是2天(因为我没有进行浮点计算)。但实际上我认为这是一个编程故障(其中包括......),但心理上是合理的:实际上我只有一整天的工作可用。

这可能是徒劳的练习,但这让我学习:捕获,循环,寄存器,当然还有以前的StackOverflow珍贵答案,以便给出纯粹的Vim答案。

感谢您为我的答案带来的所有改进。