web-dev-qa-db-fra.com

Pourquoi Vim ajouterait-il une nouvelle ligne à la fin d'un fichier?

Je travaille beaucoup avec wordpress et, parfois, je modifiais temporairement les fichiers core de wordpress afin de comprendre ce qui se passait, en particulier lors du débogage. Aujourd'hui, j'ai une petite surprise. Lorsque j'étais prêt à valider mes modifications dans mon référentiel git, j'ai remarqué que git status marquait l'un des fichiers wordpress comme non mis en scène pour la validation. Je me souviens d’avoir annulé tous les changements que j’avais apportés à ce fichier avant de le fermer; j’ai donc décidé d’utiliser diff pour voir ce qui avait changé. J'ai comparé le fichier de mon projet avec celui de la copie wordpress que je garde dans mon répertoire de téléchargements. Il s'avère que les fichiers diffèrent à la toute fin. diff indique qu'il manque une nouvelle ligne à la fin du fichier d'origine:

1724c1724
< }
\ No newline at end of file
---
> }

Je n'ai même jamais touché cette ligne. Les modifications que j'ai apportées se situaient quelque part au milieu d'un fichier volumineux. Cela me porte à penser que vim a ajouté un caractère de nouvelle ligne à la fin du fichier. Pourquoi cela arriverait-il?

34
Buzu

Toutes les réponses que j'ai vues ici répondent à la question "comment empêcher Vim d'ajouter un caractère de nouvelle ligne à la fin du fichier?", Alors que la question était "Pourquoi Vim ajouterait-il une nouvelle ligne la fin d'un fichier? ". Le moteur de recherche de mon navigateur m'a amené ici et je n'ai pas trouvé de réponse à cette question.

Cela est lié à la manière dont la norme POSIX définit une ligne (voir Pourquoi les fichiers doivent-ils se terminer par une nouvelle ligne? ). Donc, en gros, une ligne est:

3.206 Ligne
Une séquence de zéro ou plusieurs caractères non <nouvelle ligne> plus un caractère <nouvelle ligne> de fin.

Et, par conséquent, ils doivent tous se terminer par un caractère de nouvelle ligne. C'est pourquoi Vim ajoute toujours une nouvelle ligne par défaut (car, selon POSIX, elle devrait toujours être là).

Ce n'est pas le seul éditeur à le faire. Gedit , l'éditeur de texte par défaut dans GNOME , fait exactement la même chose.


Modifier

De nombreux autres outils s’attendent également à ce caractère de nouvelle ligne. Voir par exemple:

Vous pouvez aussi être intéressé par: Vim show newline à la fin du fichier .

40
Peque

Étant donné que vim est un éditeur texte, il peut parfois "nettoyer" les fichiers pour vous.

Voir http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4 pour plus de détails sur la façon d'écrire sans fin de nouvelle ligne, paraphrasée ci-dessous:


Comment puis-je écrire un fichier sans saut de ligne (EOL) à la fin du fichier?

Vous pouvez désactiver l'option eol et activer l'option binary pour écrire un fichier sans EOL à la fin du fichier: 

:set binary
:set noeol
:w

Alternativement, vous pouvez utiliser: 

:set noeol
:w ++bin
10
paxdiablo

L'ajout d'une nouvelle ligne est le comportement par défaut de Vim. Si vous n'en avez pas besoin, utilisez cette solution: VIM Désactiver la nouvelle ligne automatique à la fin du fichier

Pour le désactiver, ajoutez ceci à votre fichier .vimrc

set fileformats+=dos
6
ATOzTOA

Vous pouvez mettre la ligne suivante dans votre fichier .vimrc

autocmd FileType php setlocal noeol binary

Ce qui devrait faire l'affaire, mais en réalité, votre approche est un peu fausse. Tout d'abord, php ne verra pas d'inconvénient à cette fin et deuxièmement, si vous ne souhaitez pas enregistrer vos modifications, n'appuyez pas sur u ou, pire, essayez de recréer manuellement l'état du fichier, mais quittez sans enregistrer q!. Si vous avez quitté l'éditeur et enregistré pour une raison quelconque, essayez git checkout <file>

3
Max

3.206 Ligne Une séquence de zéro ou plusieurs non-caractères plus un caractère de fin.

Fait intéressant, vim vous permettra d’ouvrir un nouveau fichier, d’écrire le fichier et le fichier aura zéro octet. Si vous ouvrez un nouveau fichier et ajoutez une ligne à l'aide de "o", écrivez le fichier. Il comportera deux caractères. Si vous ouvrez ce fichier, sauvegardez, supprimez la deuxième ligne 'dd' et écrivez le fichier, il aura une longueur d'un octet. Ouvrez le fichier de sauvegarde et supprimez la seule ligne restante et écrivez le fichier, il sera zéro octet. Vim vous permettra donc d’écrire un fichier de zéro octet seulement tant qu’il est complètement vide. Semble défier la définition de posix ci-dessus. Je suppose...

0
Dr. Wolfe