VIM Désactive la nouvelle ligne automatique à la fin du fichier

Je travaille donc dans un magasin PHP et nous utilisons tous des éditeurs différents, et nous devons tous travailler sur Windows. J’utilise vim, et tout le monde dans la boutique ne cesse de se plaindre que chaque fois que je modifie un fichier, il y a une nouvelle ligne en bas. J’ai cherché autour de moi et j’ai constaté qu’il s’agissait d’un comportement documenté de vi & vim … mais je me demandais s’il était possible de désactiver cette fonctionnalité. (Il serait préférable que je puisse le désactiver pour des extensions de fichiers spécifiques).

Si quelqu’un le sait, ce serait génial!

même si le fichier était déjà enregistré avec de nouvelles lignes à la fin:

vim -b file et une fois dans vim:

 :set noeol :wq 

terminé.

Vous pouvez également ouvrir des fichiers en vim avec :e ++bin file

Encore une autre alternative:

 :set binary :set noeol :wq 

Et pour vim 7.4+, vous pouvez également utiliser à la place (de préférence sur votre .vimrc):

 :set nofixendofline 

(merci à 罗泽轩 pour ce dernier morceau de news!)

Ajoutez la commande suivante à votre fichier .vimrc pour désactiver l’option de fin de ligne:

 autocmd FileType php setlocal noeol binary fileformat=dos 

Cependant , PHP lui-même ignorera cette dernière fin de ligne – cela ne devrait pas poser de problème. Je suis presque certain que dans votre cas, il y a autre chose qui ajoute le dernier caractère de nouvelle ligne, ou peut-être qu’il y a un mélange avec les types de fin de ligne Windows / Unix ( \n ou \r\n , etc.).

Mettre à jour:

Une solution alternative pourrait être d’append cette ligne à votre fichier .vimrc:

 set fileformats+=dos 

Il y a une autre façon d’approcher cela si vous utilisez Git pour le contrôle de source. Inspiré par une réponse ici , j’ai écrit mon propre filtre pour l’utiliser dans un fichier gitatsortingbutes .

Pour installer ce filtre, enregistrez-le en tant que noeol_filter quelque part dans votre $PATH , rendez-le exécutable et exécutez les commandes suivantes:

 git config --global filter.noeol.clean noeol_filter git config --global filter.noeol.smudge cat 

Pour commencer à utiliser le filtre uniquement pour vous-même, placez la ligne suivante dans votre $GIT_DIR/info/atsortingbutes :

 *.php filter=noeol 

Cela garantira que vous ne commettez pas de nouvelle ligne à eof dans un fichier .php , peu importe ce que fait Vim.

Et maintenant, le script lui-même:

 #!/usr/bin/python # a filter that ssortingps newline from last line of its stdin # if the last line is empty, leave it as-is, to make the operation idempotent # inspired by: https://stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283 import sys if __name__ == '__main__': try: pline = sys.stdin.next() except StopIteration: # no input, nothing to do sys.exit(0) # spit out all but the last line for line in sys.stdin: sys.stdout.write(pline) pline = line # ssortingp newline from last line before spitting it out if len(pline) > 2 and pline.endswith("\r\n"): sys.stdout.write(pline[:-2]) elif len(pline) > 1 and pline.endswith("\n"): sys.stdout.write(pline[:-1]) else: sys.stdout.write(pline) 

Je n’ai pas essayé cette option, mais les informations suivantes sont données dans le système d’aide vim (c.-à-d. Aide eol):

 'endofline' 'eol' boolean (default on) local to buffer {not in Vi} When writing a file and this option is off and the 'binary' option is on, no  will be written for the last line in the file. This option is automatically set when starting to edit a new file, unless the file does not have an  for the last line in the file, in which case it is reset. 

Normalement, vous n’avez pas besoin de définir ou de réinitialiser cette option. Lorsque «binary» est désactivé, la valeur n’est pas utilisée lors de l’écriture du fichier. Lorsque «binary» est activé, il est utilisé pour mémoriser la présence d’une pour la dernière ligne du fichier, de sorte que lorsque vous écrivez le fichier, la situation du fichier d’origine peut être conservée. Mais vous pouvez le changer si vous le souhaitez.

Vous pouvez également être intéressé par la réponse à une question précédente: ” Pourquoi les fichiers devraient-ils se terminer par une nouvelle ligne “.

J’ai ajouté un conseil sur le wiki Vim pour un problème similaire (bien que différent):

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF

OK, être sur Windows complique les choses;)

Comme l’option ‘binary’ réinitialise l’option ‘fileformat’ (et que l’écriture avec ‘binary’ set écrit toujours avec des fins de ligne unix), sortons le gros marteau et faisons-le en externe!

Que diriez-vous de définir une autocommande (: help autocommand) pour l’événement BufWritePost? Cette autocommande est exécutée à chaque fois que vous écrivez un tampon entier. Dans cette autocommande, appelez un petit outil externe (php, perl ou autre script) qui supprime la dernière ligne de changement du fichier que vous venez d’écrire.

Donc, cela ressemblerait à ceci et irait dans votre fichier .vimrc:

 autocmd! "Remove all autocmds (for current group), see below" autocmd BufWritePost *.php !your-script  

Assurez-vous de lire toute la documentation vim sur les autocommandes si c’est la première fois que vous manipulez des autocommandes. Il y a quelques mises en garde, par exemple, il est recommandé de supprimer tous les autocmds dans votre fichier .vimrc au cas où votre fichier .vimrc pourrait être généré plusieurs fois.

J’ai implémenté les suggestions de Blixtor avec le post-traitement Perl et Python, soit en cours d’exécution dans Vim (s’il est compilé avec un tel support linguistique), soit via un script Perl externe. Il est disponible en tant que plug-in PreserveNoEOL sur vim.org.

Peut-être pourriez-vous voir pourquoi ils se plaignent. Si un fichier php a une nouvelle ligne après la fin?>, Php le publiera dans le cadre de la page. Ce n’est un problème que si vous essayez d’envoyer des en-têtes après avoir inclus le fichier.

Cependant, le?> À la fin d’un fichier php est facultatif. Pas de fin?>, Pas de problème avec une nouvelle ligne à la fin du fichier.

J’ajoute dans .vimrc

 set binary 

et ça aide, essayez

Je pense avoir trouvé une meilleure solution que la réponse acceptée. Les solutions alternatives ne fonctionnaient pas pour moi et je ne voulais pas travailler en mode binary tout le temps. Heureusement, cela semble faire le travail et je n’ai pas encore rencontré d’effets secondaires désagréables: préserver la fin de ligne manquante à la fin des fichiers texte . Je viens d’append le tout à mon ~ / .vimrc.

Serait-il possible d’utiliser une commande spéciale pour enregistrer ces fichiers?

Si vous faites: set binary,: w et: set nobinary le fichier sera écrit sans nouvelle ligne s’il n’y en avait pas pour commencer.

Cette séquence de commandes pourrait bien entendu être placée dans une commande définie par l’utilisateur ou dans un mappage.

J’ai trouvé ce plugin vimscript utile pour cette situation.

 Plugin 'vim-scripts/PreserveNoEOL' 

Ou lire plus à github