Я играл с ним и придумал следующий сценарий. Чтобы сделать его более надежным, мне пришлось настроить его на формат « minMM:SS
», где MM
и SS
- минуты и секунды.
Я подозреваю, что вам нужно как-то изменить это в соответствии с вашими реальными потребностями, но скрипт в основном начинает считать, когда вы набираете в обычном режиме последовательность клавиш: \sc
Затем он прекратит считать и добавит к позиции курсора вышеупомянутый формат при наборе последовательности клавиш: \ec
Если в строке уже есть отметка времени, соответствующая указанному выше формату, она добавится к ней.
Обратите внимание, что если вы изменили свой mapleader
вы бы использовали это вместо \
в приведенных выше последовательностях клавиш.
function! s:Start()
if exists('b:CountMinutesStart')
echohl ERROR
echomsg "Already counting."
echohl NONE
return
endif
echohl TODO
echomsg "Counting started."
echohl NONE
let b:CountMinutesStart = localtime()
endfunction
function! s:Stop()
if !exists('b:CountMinutesStart')
echohl ERROR
echomsg "Not counting."
echohl NONE
return -1
endif
let l:start = b:CountMinutesStart
let l:end = localtime()
unlet b:CountMinutesStart
let l:elapsed = l:end - l:start
echohl TODO
echomsg "Elapsed time since start: " . s:Format(l:elapsed)
echohl NONE
return l:elapsed
endfunction
function! s:Format(seconds)
let l:minutes = a:seconds / 60
let l:seconds = a:seconds % 60
return printf('min%02d:%02d', l:minutes, l:seconds)
endfunction
function! s:InsertTime()
let l:seconds = s:Stop()
if l:seconds == -1
return
endif
let l:line = getline('.')
if l:line =~ 'min\d\{2}:\d\{2}'
let l:tmp = split(substitute(l:line, '.*min\(\d\{2}\):\(\d\{2}\).*', '\1 \2', ''), ' ')
let l:seconds = l:seconds + (l:tmp[0] * 60 + l:tmp[1])
call setline('.', substitute(l:line, 'min\d\{2}:\d\{2}', s:Format(l:seconds), ''))
else
exe 'normal a' . s:Format(l:seconds)
endif
endfunction
command! StartCounting call s:Start()
command! StopCounting call s:InsertTime()
nmap <silent> <leader>sc :StartCounting<cr>
nmap <silent> <leader>ec :StopCounting<cr>