Isso funciona para todos os três casos para mim:
function InsertIfEmpty()
if @% == ""
" No filename for current buffer
startinsert
elseif filereadable(@%) == 0
" File doesn't exist yet
startinsert
elseif line('$') == 1 && col('$') == 1
" File is empty
startinsert
endif
endfunction
au VimEnter * call InsertIfEmpty()
Provavelmente, isso pode ser condensado apenas na última verificação de um arquivo vazio, já que nenhum nome de arquivo ou arquivo que não existe geralmente inicia como buffers vazios. No entanto, provavelmente é possível que algum outro plug-in preencha algumas coisas em um dos dois primeiros casos (como alguns plug-ins de modelo), portanto, é melhor verificar os três.
O primeiro teste que você já teve.
O segundo teste precisa verificar filereadable
o valor de zero (não existe) para decidir se é novo (oposto ao que você tinha).
O último teste verifica se o número da última linha do arquivo é 1 (que também é a primeira linha, o que significa que há apenas uma linha) e o número da coluna do final da linha (coluna após o último caractere em a linha) é 1, o que significa que existem 0 caracteres. Se houver apenas 1 linha com 0 caracteres, o arquivo deverá estar vazio.
Uma observação final: a maneira como você coloca suas declarações na pergunta pode resultar em alguns resultados surpreendentes. Ou seja, você está definindo BufRead
e BufNewFile
somente se as condições forem atendidas na inicialização, mas esses comandos automáticos existem para o restante da sua sessão. Portanto, se você iniciar um arquivo vazio, que define esses comandos, todos os arquivos subseqüentes abertos (novos ou não, vazios ou não) serão iniciados no modo de inserção.
O comando automático VimEnter
é executado no final da inicialização do Vim e apenas uma vez durante toda a sessão. Dessa forma, seus testes só são executados quando você inicia o Vim e não em nenhum outro momento.