web-dev-qa-db-fra.com

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

Donc, je travaille dans un PHP magasin, et nous utilisons tous des éditeurs différents, et nous devons tous travailler sous Windows. J'utilise vim, et tout le monde dans la boutique continue de se plaindre à chaque fois que je modifie un fichier. J'ai effectué une recherche autour et trouvé qu'il s'agit d'un comportement documenté de vi & vim ... mais je me demandais s'il y avait un moyen de désactiver cette fonctionnalité (il serait préférable que je puisse désactiver cette fonctionnalité.) pour des extensions de fichiers spécifiques).

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

230
Boushley

Et pour vim 7.4+, vous pouvez utiliser (de préférence sur votre fichier .vimrc) (merci à pour cette dernière nouvelle!):

:set nofixendofline

Maintenant en ce qui concerne les anciennes versions de vim.

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é.

sinon, vous pouvez ouvrir des fichiers dans vim avec :e ++bin file

Encore une autre alternative:

:set binary
:set noeol
:wq
324
gcb

Ajoutez la commande suivante à votre fichier .vimrc pour activer 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 être un problème. I 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 un mélange avec les types de fin de ligne windows/unix (\n ou \r\n, etc).

Mise à jour:

Une solution alternative pourrait être simplement d'ajouter cette ligne à votre fichier .vimrc:

set fileformats+=dos
23
too much php

Il existe une autre façon d’aborder ceci si vous utilisez Git pour le contrôle de source. Inspiré par ne réponse ici , j'ai écrit mon propre filtre à utiliser dans un fichier gitattributes .

Pour installer ce filtre, enregistrez-le sous le nom 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, insérez la ligne suivante dans votre $GIT_DIR/info/attributes:

*.php filter=noeol

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

Et maintenant, le script lui-même:

#!/usr/bin/python

# a filter that strips 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 __== '__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

    # strip 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)
17
Amir

Je n’ai pas essayé cette option, mais les informations suivantes sont fournies dans le système d’aide vim (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 <EOL> 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 <EOL> 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 "binaire" est désactivé, la valeur n'est pas utilisée lors de l'écriture du fichier. Lorsque "binaire" est activé, il est utilisé pour rappeler 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 puisse être conservée. Mais vous pouvez le changer si vous le souhaitez.

La réponse à une question précédente pourrait également vous intéresser: " Pourquoi les fichiers doivent se terminer par une nouvelle ligne ".

11
Tim Henigan

J'ai ajouté une astuce 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

9
Jo Liss

OK, être sous Windows complique les choses;)

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

Pourquoi ne pas définir une autocommand (: 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 quel que soit le script) qui supprime la dernière nouvelle ligne du fichier que vous venez d'écrire.

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

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

Assurez-vous de lire toute la documentation de vim sur les autocommandes s'il s'agit de votre première utilisation avec des autocommandes. Il y a quelques mises en garde, par exemple Il est recommandé de supprimer tous les fichiers autocmds de votre fichier .vimrc au cas où votre fichier .vimrc serait obtenu plusieurs fois.

8
Blixtor

J'ai implémenté les suggestions de Blixtor avec Perl et Python, s'exécutant dans Vim (s'il est compilé avec un tel support de langage)), ou via un script Perl externe. Il est disponible en tant que - plugin PreserveNoEOL sur vim.org.

6
Ingo Karkat

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

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

3
Ken

J'ajoute dans .vimrc

set binary

et ça aide, essayez

2
IvanM

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 tout le temps en mode binaire. Heureusement, cela semble avoir été fait et je n'ai encore rencontré aucun effet secondaire désagréable: préserve la fin de ligne manquante à la fin des fichiers texte . Je viens d'ajouter le tout à mon ~/.vimrc.

2
Jay Paroline

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

Si vous définissez: set binary,: w et: set nobinary, le fichier sera écrit sans nouvelle ligne s'il n'y en a pas.

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

1
Blixtor

À partir de vim v7.4, vous pouvez utiliser

:set nofixendofline

Vous trouverez quelques informations sur ce changement ici: http://ftp.vim.org/vim/patches/7.4/7/7.7.785 .

0
Victor Yarema

J'ai trouvé ce plugin vimscript est utile dans cette situation.

Plugin 'vim-scripts/PreserveNoEOL'

Ou lisez plus sur github

0
Alan Dong