彼らは納得していましたが、私の質問に対する回答には少しがっかりしました。解決策を見つけようとしましたが、ほぼ成功したようです。言うまでもなく、これは不器用な仕掛けですが、機能します。
まず、ファイル (テスト目的でわずかに変更) :
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 は 2 日ではなく 1 日で表示されます (浮動小数点計算を行っていないため)。しかし、実際には、これはプログラミングの不具合 (とりわけ…) であると考えていますが、心理的に健全な不具合であると考えています。
それは無益な練習かもしれませんが、これは純粋なVimの答えを出すために、キャプチャ、ループ、レジスタ、そしてもちろん以前のStackOverflowの貴重な答えを勉強させてくれました。
あなたが私の答えにもたらすすべての改善に感謝します。