Por que não vejo a diferença entre dois arquivos diferentes no modo de inserção no vim?

8

Vamos criar dois arquivos:

$ echo -n 'test' > test.txt
$ wc test.txt 
0 1 4 test.txt

O arquivo test.txtnão contém a nova linha à direita.

$ echo 'test' > test_n.txt
$ wc test_n.txt 
1 1 5 test_n.txt

O arquivo test_n.txtcontém a nova linha à direita.

O acima de dois arquivos são obviamente diferentes, mas a visualização dos arquivos em vimno modo de inserção não contém quaisquer diferenças:

$ vim test.txt

insira a descrição da imagem aqui

$ vim test_n.txt

insira a descrição da imagem aqui

Por que não há diferença (nova linha ou alguma distinção especial)?

E o que posso fazer para adicionar ou remover um caractere adicional vimno modo de inserção ?

simhumileco
fonte
4
": set list" mostra a diferença, e há um modo que você pode inspecionar. Ambos estão nos arquivos de ajuda.
22619 Thomas Thomas Dickey
Obrigado @ThomasDickey Eu não conhecia essa opção antes.
Simhumileco 02/03/19
1
@ThomasDickey, se você quiser adicionar uma resposta, provavelmente será a resposta aceita. Obrigado.
21719 Simhumileco 14/03/19
2
@filbranden, por favor, não poste respostas nos comentários. As respostas nos comentários não podem ser votadas pela comunidade e não marcam a pergunta como respondida.
terdon
2
@ThomasDickey veja acima. Por favor, poste isso como resposta.
terdon

Respostas:

12

O vim possui o modo "eol" (para final de linha) para dizer o que fazer se a última linha do arquivo não possuir um caractere de nova linha . Você pode ver todas as configurações de modo no vim (ou qualquer programa como o vi),

:set all

POSIX vi não tem um recurso para isso: os arquivos são ou comprimento zero, ou ter uma nova linha final. Isso ocorre porque o POSIX vi lida apenas com arquivos de texto, que por definição são linhas que terminam com novas linhas. Em uma verificação rápida, nvi e elvis não têm modos para isso. No meu comentário, eu havia esquecido um detalhe do vim: ao contrário do vil, um ": set list" não mostra prontamente a nova linha ausente. Aqui está o que eu vejo no vim:

ssss$
test$
~
~

enquanto no vil:

ssss^J
test
~
~

Para qualquer editor, você pode ler o arquivo, alterar o modo , por exemplo,

:set noeol

e escreva o arquivo para obter uma nova linha no arquivo atualizado. Em vez de mostrá-lo diretamente, você pode modificar a linha de status do vim para mostrar essas informações. Por padrão, ele não parece fazer isso, mas alguns empacotadores personalizaram isso, por exemplo,

"foo" [noeol] 2L, 9C                                          1,1           All

Um dos comentários sugere o uso do "?" modificador do setcomando, por exemplo,

:set eol?

o que pode mostrar algo como isto:

noendofline                                                   2,1           All

mas no modo de inserção, que é substituído por

-- INSERT --                                                  2,1           All

portanto, a linha de status parece o lugar certo para manter essas informações.

Os recursos já existem há algum tempo:

  • O eolrecurso apareceu pela primeira vez no vim 2.4 (julho de 1994), de acordo com um comentário em seu código-fonte.

  • vile's newlinemode apareceu em julho de 1993 .

( nvi, elvis, vim e vile manipulam arquivos binários , além dos arquivos de texto do POSIX vi ).

Thomas Dickey
fonte
2
quase 20 anos usando o vim, e ainda aprendo coisas novas sobre ele. e ainda tenho medo do emacs. : D
Tim Kennedy
1
No vim, você também pode :set eol?verificar se o eol está ativado ou desativado, para que você não precise examinar toda a saída do :set all.
Kevin
Uma maneira menos confusa de dizer "arquivos têm comprimento zero ou tem uma nova linha à direita" é "todas as linhas terminam com uma nova linha e um arquivo de texto é uma sequência de zero ou mais linhas".
R .. GitHub Pare de ajudar o gelo