Comment faire pour que vim ajoute automatiquement une nouvelle ligne à la fin d'un fichier?

16

Vim écrit normalement <EOL>pour la dernière ligne uniquement lorsqu'il y en avait une dans le fichier d'origine.

Comment faire pour que vim écrive une nouvelle ligne à la fin d'un fichier tout le temps (quand le fichier n'est pas binaire et qu'il n'y en a pas déjà un)?

J'ai testé l' eoloption, mais cela n'a pas fonctionné comme prévu.

Voir aussi: Conserver la fin de ligne manquante à la fin des fichiers texte , mais ci-contre. Et: Pourquoi les fichiers devraient-ils se terminer par une nouvelle ligne?

Kenorb
la source

Réponses:

17

Informations de base

Vim n'affiche pas la dernière nouvelle ligne dans le tampon, mais en fait, vim place toujours EOL à la fin du fichier lorsque vous l'écrivez, car il est standard pour les fichiers texte dans les systèmes Unix. Vous pouvez trouver plus d'informations à ce sujet ici . Bref vous n'avez pas à vous soucier de l'absence de nouvelles lignes à la fin du fichier dans vim.

Expérience 1

Vous pouvez faire cette petite expérience pour vérifier ce comportement. Dans le terminal, exécutez:

$ vim test_test

Saisissez le caractère 1et enregistrez le fichier :wq.

Vous n'avez qu'un seul caractère dans le fichier, non? En fait non :) Vous avez maintenant dans votre fichier 1et vos LFpersonnages. Vérifions-le, avec l'utilitaire hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31est le code ASCII pour le caractère 1, et 0aest le code ASCII pour le caractère non imprimable LFqui pour UNIX comme vous le savez peut-être déjà le code pour la fin de la ligne.

Expérience 2

Mais que faire si nous ouvrons un fichier qui n'a pas de eolsymbole à la fin du fichier. Vérifions-le aussi. Créons un fichier sans eol à la fin, par exemple comme ceci:

$ echo -n "1" > test_without_eol

Ensuite, regardons à l'intérieur avec hexdump:

$ hexdump test_without_eol
000000 31
0000001

Il n'y a donc aucun eolpersonnage ici. Ouvrons ce fichier dans vim:

$ vim test_without_eol

Au bas de l'éditeur, vous verrez:

"test_without_eol" [noeol] 1L, 1C

Et si vous enregistrez ce fichier, le eolcaractère sera automatiquement ajouté.

Que pouvons-nous faire à ce sujet?

Si vous avez vraiment besoin de voir la fin du fichier. Essayez d'utiliser cette commande:

:set listchars=eol:$

il montrera tous les eolcaractères comme $signe.

Alexander Myshov
la source
Génial. Je suis arrivé à la même conclusion après ma confusion, car Vim ne me montrait pas réellement cette nouvelle ligne, mais elle était là après la sauvegarde.
kenorb
1
@kenorb par la façon dont vous pouvez montrer tous les personnages EOL en utilisant cette commande:set listchars=eol:$
Alexander Myshov
"ne me montrait pas réellement cette nouvelle ligne" - sous Unix, il n'y a pas de ligne. Une ligne est définie comme "nombre de caractères non LF, se terminant par un caractère LF". Si vous pensez que LF n'est pas "aller à la ligne suivante" mais "fin de ligne", ce que Vim fait soudainement est beaucoup plus logique.
Amadan
8

Vim omet uniquement l'EOL si le fichier est ouvert en tant que 'binary' et l' 'endofline'option est réinitialisée (lorsque le fichier binaire n'avait pas d'EOL à l'ouverture, ou si vous réinitialisez explicitement l'option). En d'autres termes, Vim n'honore qu'un EOL manquant pour les fichiers binaires. Pour les fichiers texte, il écrit toujours avec un EOL (ajouté). (C'est pourquoi vous avez besoin de solutions comme mon plugin PreserveNoEOL pour conserver les fichiers texte sans EOL.) Vous pouvez trouver tous les détails sur :help 'endofline'.

Ainsi, vous devez uniquement vous assurer d' ouvrir le fichier en tant que non binaire afin que Vim écrive automatiquement un EOL.

Ingo Karkat
la source
5

Comme Alexander l'a mentionné, Vim ne montre pas EOL à EOF, c'est pourquoi c'est si déroutant (en particulier avec une nouvelle ligne vide / vide qui est une autre chose), donc il écrit en fait à chaque fois lors de l'enregistrement du fichier.

Voici un test simple pour tester si cela fonctionne:

$ 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

Remarquez le comportement de l'invite du shell lorsqu'il n'y a pas de fin de vie (elle est mélangée à la ligne suivante). Lors de la ré-enregistrement du fichier avec Vim, il l'ajoute.

En utilisant, wcnous pouvons compter les lignes, les mots et les caractères avant d'enregistrer et après, afin que nous puissions voir qu'il change réellement.

Pourquoi c'est si important? Pour garder nos fichiers conformes POSIX .

Kenorb
la source