Existe uma maneira de inserir uma contagem de minutos decorridos no vim?

0

Eu tenho um arquivo todo.txt, e acho que seria divertido posicionar meu cursor em um item todo (uma linha no meu arquivo todo.txt), pressionar uma combinação de teclas e fazer com que o Vim comece contando os minutos. Então, quando pressiono outra combinação de teclas, ela para de contar e insere o número de minutos transcorridos, como min:25 . Existe uma maneira de fazer isso no vim?

O que também seria fantástico é se eu pressionasse a combinação de teclas em uma linha que já iniciava em min: , ela acrescentaria os minutos aos minutos existentes.

    
por Jon 05.10.2015 / 17:56

1 resposta

1

Eu brinquei com ele e criei o seguinte script. Para torná-lo confiável, tive que fazê-lo lidar com o formato " minMM:SS ", em que MM e SS são minutos e segundos.

Eu suspeito que você precise modificar isso de alguma forma para atender às suas necessidades reais, mas o script basicamente começa a contar quando você digita, no modo normal, a seqüência de teclas: \sc

Em seguida, ele interromperá a contagem e anexará à posição do cursor o formato mencionado acima quando você digitar a seqüência de teclas: \ec

Se a linha já contiver um registro de data e hora correspondente ao formato acima, ela será adicionada a ela.

Observe que, se você alterou seu mapleader , você usaria isso em vez de \ nas sequências de teclas acima.

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}\).*', ' ', ''), ' ')
        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>
    
por 06.10.2015 / 05:17

Tags