spaced-repetition.vim (2558B)
1 vim9script 2 3 sign_define("TodaySign", { 4 "text": ">>", 5 "texthl": "Search", 6 # "linehl": "DiffAdd", 7 }) 8 9 def g:SRSign() 10 sign_unplace("SRGroup") 11 const now = localtime() 12 const lines = getline(1, '$') 13 for idx in range(len(lines)) 14 if lines[idx][ : 5] != '% SR: ' 15 continue 16 endif 17 const line_split = lines[idx][6 : ]->split() 18 const scheduled = float2nr(strptime("%Y-%m-%dT%H:%M:%S%z", line_split[0]) + str2float(line_split[1]) * 24 * 60 * 60) 19 if now > scheduled 20 sign_place(0, "SRGroup", "TodaySign", bufnr(), {lnum: idx + 1}) 21 endif 22 endfor 23 enddef 24 25 def g:SRQuickFix() 26 const now = localtime() 27 final qf_list = [] 28 for file_path in glob('*.tex', 1, 1) 29 if file_path < "lecture_07" 30 continue 31 endif 32 const file_lines = readfile(file_path) 33 for idx in range(len(file_lines)) 34 if file_lines[idx][ : 5] != '% SR: ' 35 continue 36 endif 37 var line_split = file_lines[idx][6 : ]->split() 38 var scheduled = float2nr(strptime("%Y-%m-%dT%H:%M:%S%z", line_split[0]) + str2float(line_split[1]) * 24 * 60 * 60) 39 if now > scheduled 40 qf_list->add({ 41 filename: fnamemodify(file_path, ':p'), 42 lnum: idx + 1, 43 text: strftime("%Y-%m-%dT%H:%M:%S%z ", scheduled) .. file_lines[idx + 1]->substitute('\\begin{\(.[^}]\+\)}\[\(.*\)\]', '\1: \2', ''), 44 scheduled: scheduled, 45 }) 46 endif 47 endfor 48 endfor 49 50 #qf_list->sort((a, b) => a.scheduled - b.scheduled) 51 52 if !empty(qf_list) 53 setqflist(qf_list, 'r') 54 copen 55 echo $"Found {len(qf_list)} items across all .tex files." 56 else 57 cclose 58 echo "No SR tasks found for now." 59 endif 60 enddef 61 62 def g:SRReview() 63 var line_split = getline('.')[6 : ]->split() 64 var interval = str2float(line_split[1]) 65 var easiness_factor = str2float(line_split[2]) 66 var quality = str2nr(line_split[3]) 67 var new_interval = interval * easiness_factor 68 var new_easiness_factor = easiness_factor + (0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02)) 69 setline('.', $'% SR: {strftime('%Y-%m-%dT%H:%M:%S%z')} {printf("%.02f", new_interval)} {printf("%.02f", new_easiness_factor)} {quality}') 70 enddef 71 72 73 nnoremap <localleader>sq <CMD>call SRQuickFix()<CR> 74 nnoremap <localleader>sr <CMD>call SRReview()<CR> 75 nnoremap <localleader>ss <CMD>call SRSign()<CR> 76 77 # vim: et sts=4 sw=4