我有一个非常简单的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)
我们将不胜感激。
答案 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答案。
感谢您为我的答案带来的所有改进。