Como atualizar uma data em um arquivo, se aplicável, e incrementar o último dígito por um se escrever no arquivo usando o Vim?

2

Objetivo

O objetivo é atualizar um número em um arquivo, se alguém gravar em um arquivo usando o Vim. Se a data estiver no arquivo, a parte da data deve permanecer inalterada, mas o último dígito precisa ser incrementado em um.

Tentativas

Tentativa 1

/home/user/.vimrc

autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/

/ temp / test

4014122100

escrevendo os resultados do arquivo:

2014122100

"/tmp/test" 2L, 29C written

Tentativa 2

/home/user/.vimrc

autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/
autocmd BufWritePre /tmp/test :%s/\d\{10}/\=submatch(0)+1

/ temp / test

4014122100

escrevendo os resultados do arquivo:

2014122101

"/tmp/test" 2L, 29C written

Tentativa 3

function! ChangeDateIfApplicableAndIncrementLastDigit()
  if !match(getline(1,"$"),strftime("%Y%m%d")) >= 0
    autocmd BufWritePre /tmp/test :%s/\d\{10}/\=strftime("%Y%m%d00")/
  endif
  autocmd BufWritePre /tmp/test :%s/\d\{10}/\=submatch(0)+1
endfunction

autocmd BufWriteCmd /tmp/test call ChangeDateIfApplicableAndIncrementLastDigit()

Resultados esperados

Número de gravações Resultado esperado
1 2014122101
2 2014122102
3 2014122103

Resultado atual

Número de escritas Resultado atual
1 2014122101
2 2014122101
3 2014122101

    
por 030 21.12.2014 / 14:58

1 resposta

0

Então, se eu acertar você, sua primeira e segunda tentativas mostram que o mecanismo básico funciona, mas você está lutando para colocar tudo junto, certo?

O problema é com o BufWriteCmd ; esse gancho deve gravar o conteúdo do buffer por conta própria. O plugin netrw usa aqueles para implementar o acesso remoto ao sistema de arquivos, por exemplo. Você só precisa definir um único BufWritePre hook para sua função e, em seguida, agir dependendo se você encontrou uma data atual:

function! ChangeDateIfApplicableAndIncrementLastDigit()
  if !match(getline(1,"$"),strftime("%Y%m%d")) >= 0
    %s/\d\{10}/\=strftime("%Y%m%d00")/
  else
    %s/\d\{10}/\=submatch(0)+1
  endif
endfunction

autocmd BufWritePre /tmp/test call ChangeDateIfApplicableAndIncrementLastDigit()
    
por 22.12.2014 / 09:50

Tags