Escrevendo buffer modificado em um arquivo temporário

7

Gostaria de escrever o buffer modificado que atualmente estou editando em um arquivo temporário periodicamente. Em segundo plano, eu poderia, por exemplo, usar ferramentas externas para analisar o arquivo.

Não quero gravar o arquivo no local real nesse processo - quero que o usuário seja o responsável por meio do :wcomando normal .

Como posso fazer isso em um vimscript chamado pelo CursorHoldautocommand? O Vim 7.4 e superior estão bem.

Edouard Poor
fonte
Você pode executar ferramentas externas diretamente no conteúdo (ou partes) do seu buffer :[range]w !command.
romainl

Respostas:

8

Isto é bastante simples:

:autocmd CursorHold *
\   let save_modified = &modified |
\       silent! execute 'write' fnameescape(tempname()) |
\   let &modified = save_modified

No entanto, isso tem o efeito colateral de nomear um :newbuffer no primeiro disparo. (Isso não afeta os arquivos existentes; esta é a diferença entre :writee :saveas.) Você pode adicionar outra verificação ( empty(bufname(''))) e desfazê-la via :0file, ou passar para as funções de nível inferior:

:autocmd CursorHold * call writefile(getline(1, '$'), tempname())

A ressalva dessa abordagem é que o conteúdo do arquivo sempre será mantido

  • com a 'encoding'configuração do Vim , ou seja, você perde qualquer costume 'fileencoding'do buffer original e
  • com terminações de linha Unix (LF) (que você pode restaurar com uma map()lista sobre retornada por getline()).
Ingo Karkat
fonte