Por que o Vim está adicionando uma nova linha? Isto é uma convenção?

16

Se eu abrir o Vim e digitar itest<Esc>:wq , recebo um arquivo que não tem novas linhas no Vim , mas parece ter uma nova linha no código:

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

Se eu abrir o Vim e digitar itest<Return><Esc>:wq , recebo um arquivo que tem uma nova linha no Vim , mas duas novas linhas no código:

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

Observe que estou abrindo o Vim com -u NONE , portanto, não há configuração local sendo usada. Observe também que isso pode estar relacionado a uma pergunta anterior minha .

Esta é a informação do meu sistema:

$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May  4 2012 04:25:35)
Included patches: 1-429
Modified by [email protected]
Compiled by buildd@

Posso confirmar o mesmo comportamento exato neste sistema:

$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by [email protected]
Compiled by buildd@

Por que o Vim está adicionando uma nova linha? Essa é uma convenção?

Aqui estão alguns esclarecimentos sobre o comando hd como instalado no Ubuntu Server:

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump
    
por dotancohen 23.04.2014 / 17:04

4 respostas

26

A convenção para arquivos de texto Unix é que cada linha é terminada por uma nova linha e que novas linhas são terminadores de linha, não separadores de linha.

Quando o Vim salva um buffer como um arquivo, ele encerra todas as linhas com a sequência de fim de linha para esse formato de arquivo, que para o Unix é uma nova linha. Veja

:help 'fileformat'

Se você estiver usando ferramentas de processamento de texto Unix, é melhor seguir essa convenção. No entanto, se você tiver alguma necessidade de não colocar uma nova linha no final da última linha de um arquivo, poderá fazê-lo. O Vim considera esses arquivos como "binários". Veja

:help 'binary'
:help edit-binary
    
por 23.04.2014 / 17:33
2

O Vim não está adicionando nada que você mesmo não colocou lá.

Um caractere "newline" não é uma "nova linha" e ambos os exemplos são perfeitamente normais:

  • no primeiro, o arquivo contém apenas uma linha para você obter um caractere de "nova linha",
  • no segundo, o arquivo contém duas linhas para você obter dois caracteres "newline".
por 23.04.2014 / 17:46
2

Arquivos de texto não terminados são ruins por vários motivos; aqui está um que eu não vi mencionado ainda:

Em um mundo hipotético onde os arquivos de texto sem uma nova linha são aceitáveis, não haveria diferença entre um arquivo contendo 0 linhas e um arquivo contendo 1 linha em branco. Ambos seriam representados por um arquivo de 0 bytes.

Incapacidade de decidir quantas linhas estão em um arquivo seria ruim.

    
por 23.04.2014 / 21:00
1

Usando o comando 'j', você pode unir todas as linhas em uma.

Se você também quiser remover o LF ou CRLF na última linha, faça o seguinte no vi.

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
    
por 15.02.2017 / 15:46