У меня есть файл todo.txt, и я думаю, что было бы интересно установить курсор на элемент todo (строку в моем файле todo.txt), нажать комбинацию клавиш и заставить Vim начать считать минуты , Затем, когда я нажимаю другую комбинацию клавиш, она прекращает отсчет и вставляет количество прошедших минут, например, min:25 . Есть ли способ сделать это в VIM?

Также было бы замечательно, если бы я нажал комбинацию клавиш в строке, начинающейся с min: , это добавило бы минуты к существующим минутам.

1 ответ1

1

Я играл с ним и придумал следующий сценарий. Чтобы сделать его более надежным, мне пришлось настроить его на формат « 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .