O VIM está adicionando as novas linhas do Windows?

7

Observe os finais de linha de git diff :

-   IP_ADDR: 'http://1.2.3.4:143'
+   IP_ADDR: 'http://2.4.6.8:143'^M

Eu editei este arquivo colocando o cursor em 1 , em seguida, pressionando ct: e, em seguida, inserindo o novo endereço IP. Nenhuma linha completa foi adicionada ou removida do arquivo. Eu noto que o arquivo mostra o tipo dos no VIM.

Por que o VIM alteraria a linha se ela não editasse explicitamente essa parte do documento? Além disso, vendo como diff mostra que não havia ^M na linha original, de que outra forma o VIM decidiu que esse é um arquivo dos ?

    
por dotancohen 23.03.2014 / 17:14

2 respostas

6

O Vim detectará o formato de arquivo original (entre aqueles configurados em 'fileformats' ) e escreverá com o mesmo. A única maneira de o Vim mudar (por exemplo, do Unix para o Windows) é através de um :setlocal fileformat=dos explícito. É improvável que você tenha isso em sua configuração; :verbose setl ff? poderia te dizer.

Eu não ficaria muito preocupado com o Git diff ifself (desde que todas as linhas pareçam alteradas, então você realmente tem um switch de line endings), mas sim o que é comprometido está tudo bem.

Observe que com a configuração do Git autocrlf = true , o Git converterá novas linhas para o padrão do sistema ao fazer o check-out de arquivos, e para novas linhas do LF ao confirmar. Então, tudo pode ficar bem, somente a saída do diff do Git está confundindo você.

    
por 23.03.2014 / 17:37
4

Esta é uma evidência de que estamos todos vivendo na Matriz. Se este fosse realmente o século 21, então nós ainda não estaríamos lutando com diferentes finais de linha.

Vim faz um bom trabalho ao fazer a coisa certa com finais de linha. Os detalhes são explicados em :help 'ffs' . É claro que o vim não pode ler sua mente: se o seu arquivo tem terminações de linha inconsistentes , então o vim pode não fazer o que você quer.

Eu sugiro abrir o arquivo no vim e depois

:e! ++ff=unix

Isso recarregará o arquivo do disco, forçando o vim a usar finais de linha no estilo unix. Então você deve ver exatamente quais linhas, quaisquer, têm terminações CRLF, porque elas terminarão com caracteres ^M brutos.

Enquanto eu amo git, eu não conheço e confio tão bem quanto eu faço vim. Eu acho que algumas pessoas recomendam configurações do tipo "configure e esqueça" para configurações de crlf do git que podem causar confusão. Eu prefiro evitar o cenário que o @Ingo Karkat mencionou em sua resposta. Eu quero que o git verifique o mesmo arquivo que foi verificado, e deixe-me (e vim) cuidar dos finais da linha.

    
por 23.03.2014 / 18:07