Como fazer com que o vim adicione automaticamente uma nova linha ao final de um arquivo?

16

O Vim normalmente grava <EOL>para a última linha somente quando havia uma no arquivo original.

Como fazer com que o vim escreva uma nova linha no final de um arquivo o tempo todo (quando o arquivo não é binário e ainda não existe)?

Eu testei a eolopção, mas não funcionou como esperado.

Consulte também: Preserve o final de linha ausente no final dos arquivos de texto , mas oposto. E: Por que os arquivos devem terminar com uma nova linha?

kenorb
fonte

Respostas:

17

Informação básica

O Vim não mostra a nova linha mais recente no buffer, mas na verdade o vim sempre coloca o EOL no final do arquivo quando você o escreve, porque é padrão para arquivos de texto nos sistemas Unix. Você pode encontrar mais informações sobre isso aqui . Em resumo, você não precisa se preocupar com a ausência de novas linhas no final do arquivo no vim.

Experiência 1

Você pode fazer este pequeno experimento para verificar esse comportamento. No terminal, execute:

$vim test_test

digite, por exemplo, apenas caractere 1e salve o arquivo :w.

Você tem apenas um caractere no arquivo, certo? Na verdade não :) Agora você tem em seu arquivo 1e LFcaracteres. Vamos verificar, com o utilitário hexdump:

$hexdump test_test

resultado:

0000000 31 0a
0000002

31é código ASCII para caractere 1e 0aé código ASCII para LFcaractere não imprimível que, para o UNIX, como você já deve saber o código para final de linha.

Experiência 2

Mas e se abrirmos o arquivo que não possui eolsímbolo no final do arquivo. Vamos verificar também. Vamos criar um arquivo sem eol no final, por exemplo:

$echo -n "1" > test_without_eol

e então, novamente, vamos olhar para dentro com hexdump

$hexdup test_without_eol

a saída será:

000000 31
0000001

Portanto, não há eolcaracteres aqui. Vamos abrir este arquivo no vim:

$vim test_without_eol

Na parte inferior do editor, você verá:

"test_without_eol" [noeol] 1L, 1C

E se você salvar esse arquivo, o eolcaractere será colocado automaticamente.

O que podemos fazer sobre isso?

Se você realmente precisa ver o final do arquivo. Tente usar este comando:

:set listchars=eol:$

mostrará todos os eolcaracteres como $sinal.

Alexander Myshov
fonte
Ótimo. Cheguei à mesma conclusão depois da minha confusão, porque o Vim não estava realmente me mostrando essa nova linha, mas estava lá depois de salvar.
Kenorb 16/05
11
@kenorb pela forma como você pode mostrar todos os charachters EOL usando este comand:set listchars=eol:$
Alexander Myshov
"não estava realmente me mostrando essa nova linha" - no Unix, não há linha. Uma linha é definida como "número de caracteres não LF, terminando em um caracter LF". Se você pensa em LF não como "vá para a próxima linha", mas "fim de linha", o que o Vim faz de repente faz muito mais sentido.
Amadan 10/03/16
8

O Vim omite o EOL apenas se o arquivo for aberto 'binary' e a 'endofline'opção for redefinida (quando o arquivo binário não tiver um EOL ao abrir ou você redefinir explicitamente a opção). Em outras palavras, o Vim apenas honra um EOL ausente para arquivos binários. Para arquivos de texto, ele sempre grava com um EOL (adicionado). (É por isso que você precisa de soluções como o meu plugin PreserveNoEOL para manter arquivos de texto sem o EOL.) Você pode encontrar todos os detalhes em :help 'endofline'.

Portanto, você só precisa garantir a abertura do arquivo como não-binário para que o Vim grave automaticamente um EOL.

Ingo Karkat
fonte
5

Como Alexander mencionou, o Vim não mostra EOL na EOF, é por isso que é tão confuso (especialmente com a nova linha vazia / em branco que é outra coisa), portanto, na verdade, ele grava todas as vezes no salvamento de arquivos.

Aqui está um teste simples de como testar se isso funciona:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Observe como o prompt do shell se comporta quando não há EOL (ele se mistura com a próxima linha). Ao salvar novamente o arquivo com o Vim, ele é adicionado.

Usando wcpodemos contar linhas, palavras e caracteres antes de salvar e depois, para que possamos ver que ele realmente muda.

Por que isso é tão importante? Para manter nossos arquivos compatíveis com POSIX .

kenorb
fonte