Si j'ouvre Vim et que itest<Esc>:wq
je tape, j'obtiens un fichier qui n'a pas de retour à la ligne dans Vim mais qui semble avoir une nouvelle ligne dans le code:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Si j'ouvre Vim et que itest<Return><Esc>:wq
je tape, j'obtiens un fichier qui a une nouvelle ligne dans Vim mais deux nouvelles lignes dans le code:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Notez que j'ouvre Vim avec -u NONE
donc aucune configuration locale n'est utilisée. Notez également que cela pourrait être lié à une question précédente .
Voici mes informations système:
$ 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@
Je peux également confirmer exactement le même comportement sur ce système:
$ 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@
Pourquoi Vim ajoute-t-il une nouvelle ligne? Est-ce une convention?
Voici quelques précisions sur la hd
commande telle qu'elle est installée sur le serveur Ubuntu:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Réponses:
La convention pour les fichiers texte Unix est que chaque ligne se termine par une nouvelle ligne et que les nouvelles lignes sont des terminateurs de ligne et non des séparateurs de ligne.
Lorsque Vim enregistre un tampon en tant que fichier, il termine chaque ligne avec la séquence de fin de ligne pour ce format de fichier, qui pour Unix est une nouvelle ligne. Voir
Si vous utilisez des outils de traitement de texte Unix, il est préférable de respecter cette convention. Cependant, si vous avez besoin de ne pas mettre de nouvelle ligne à la fin de la dernière ligne d'un fichier, vous pouvez le faire. Vim considère ces fichiers comme "binaires". Voir
la source
Vim n'ajoute rien que vous n'ayez pas mis vous-même.
Un caractère "nouvelle ligne" n'est pas une "nouvelle ligne" et les deux exemples sont parfaitement normaux:
la source
printf "\x41" > /tmp/test.txt
:, puis vérifiez qu'il n'a qu'un seul caractère 'A' avecxxd /tmp/test.txt
. Maintenantvim /tmp/test.txt<ENTER>:wq
. Vérifiez à nouveau pour voir le fichier contenant deux octets: 'A \ n'.printf
ici, je n'avais pas de "lignes" bien formées. Après vim j'en ai un. Donc, cela ajoute quelque chose que je n'ai pas mis là-bas.printf
pas une ligne, sauf si vous ajoutez\n
. En tant qu'éditeur de texte, Vim gère les lignes par défaut, et tout texte que vous insérez dans le fichier se trouve , à tout le moins, sur une ligne, sauf si vous dites explicitement à Vim de ne pas le faire.Les fichiers texte non terminés sont mauvais pour plusieurs raisons; en voici une que je n'ai pas encore vue mentionnée:
Dans un monde hypothétique où les fichiers texte sans retour à la ligne sont acceptables, il n'y aurait aucune différence entre un fichier contenant 0 lignes et un fichier contenant 1 ligne vierge. Ils seraient tous deux représentés par un fichier de 0 octet.
L'incapacité de décider du nombre de lignes dans un fichier serait mauvaise.
la source
Vim 8.0 prévoit désormais cela avec l'
fixeol
option. Plus précisément si vous le faites:alors Vim n'ajoutera pas de caractère de fin de ligne à la fin de la dernière ligne si le fichier n'en avait pas déjà un.
Cela pourrait aller dans un plugin de type de fichier, ou peut-être même dans votre
.vimrc
.(Il s'agit d'une amélioration
:set binary
car elle n'affecte que le caractère de saut de ligne final, tout enbinary
modifiant également un tas d'autres comportements, ce que vous ne voulez probablement pas sauf si vous modifiez réellement un fichier binaire.)Un fichier nouvellement créé aura toujours un caractère de saut de ligne de fin par défaut. Vous pouvez changer cela (et changer un fichier qui a déjà un retour à la ligne final pour n'en avoir pas) en faisant en outre:
Cela doit être défini spécifiquement pour chaque fichier que vous souhaitez modifier: le chargement d'un fichier dans un tampon sera toujours défini
eol
pour correspondre à l'état actuel du fichier.la source
En utilisant la commande «j», vous pouvez joindre toutes les lignes en une seule.
Si vous souhaitez également supprimer le LF ou le CRLF sur la dernière ligne, procédez comme suit en vi.
la source