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

donc je travaille dans une boutique PHP, et nous utilisons tous des éditeurs différents, et nous devons tous travailler sur windows. J'utilise vim, et tout le monde dans le magasin continue de se plaindre que chaque fois que je édite un fichier il y a une nouvelle ligne en bas. J'ai cherché et trouvé que c'est un comportement documenté de vi et vim... mais je me demandais si il y avait un moyen de désactiver cette fonctionnalité. (Il serait préférable si je pouvais le désactiver pour des extensions de fichiers spécifiques).

Si quelqu'un sait cela, ce serait super!

191
demandé sur Nemanja Boric 2009-06-26 22:52:34

12 réponses

même si le fichier a déjà été sauvegardé avec de nouvelles lignes à la fin:

vim -b file et une fois dans vim:

:set noeol
:wq

fait.

vous pouvez aussi ouvrir des fichiers dans 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

(grâce à ce dernier peu de nouvelles!)

266
répondu gcb 2017-09-19 00:15:19

Ajouter la commande suivante à votre .vimrc à son tour de la fin-de-ligne option:

autocmd FileType php setlocal noeol binary fileformat=dos

cependant , PHP lui-même ignorera ce dernier end-of - line-il ne devrait pas être un problème. Je suis presque certain que dans votre cas il y a quelque chose d'autre qui ajoute le dernier caractère newline, ou peut-être il y a un mélange avec les types de fin de ligne windows/unix ( \n ou \r\n , etc).

mise à Jour:

une solution alternative pourrait être d'ajouter cette ligne à votre .vimrc:

set fileformats+=dos
22
répondu too much php 2009-07-02 23:34:58

il y a une autre façon d'aborder cela si vous utilisez Git pour le contrôle des sources. Inspiré par une réponse ici , j'ai écrit mon propre filtre à utiliser dans un fichier gitattributes .

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

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

pour commencer à n'utiliser le filtre que pour vous-même, mettez ce qui suit: ligne dans votre $GIT_DIR/info/attributes :

*.php filter=noeol

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

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 __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

    # 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)
16
répondu Amir 2017-05-23 12:02:38

Je n'ai pas essayé cette option, mais l'information suivante est donnée dans le système d'aide vim (i.e. help 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 à définir ou réinitialisez cette option. Lorsque 'binaire' est la valeur n'est pas utilisée lors de l'écriture fichier. Lorsque 'binaire' est sur il est utilisé pour se souvenir de la présence d'un pour la dernière ligne du fichier, de sorte que lorsque vous écrivez le dossier situation du fichier original peut être conservés. Mais vous pouvez le changer si vous voulez.

vous pourriez également être intéressé par la réponse à une question précédente: " pourquoi les fichiers devraient-ils se terminer par une nouvelle ligne ".

11
répondu Tim Henigan 2017-05-23 12:26:20

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
répondu Jo Liss 2010-12-31 02:48:44

OK, vous étant sur Windows complique les choses ;)

comme l'option "binaire" réinitialise l'option "fileformat" (et l'écriture avec l'ensemble "binaire" écrit toujours avec les fins de ligne unix), sortons le gros marteau et faisons-le extérieurement!

Que Diriez-vous de définir un autocommand (:help autocommand) pour L'événement BufWritePost? Cette autocommand est exécuté après chaque fois que vous écrivez un tampon entier. Dans cet autocommand appeler un petit outil externe (php, perl ou n'importe quel script) qui supprime la dernière ligne du fichier juste écrit.

pour que ça ressemble à ça et que ça aille dans le tien .fichiers vimrc:

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

assurez-vous de lire toute la documentation vim sur les autocommands si c'est la première fois que vous avez affaire à des autocommands. Il ya quelques mises en garde, par exemple, il est recommandé de supprimer tous les autocmds dans votre .vimrc dans le cas où votre .vimrc peut être source plusieurs fois.

8
répondu Blixtor 2009-07-02 07:22:29

j'ai implémenté les suggestions de Blixtor avec le post-traitement Perl et Python, soit en tournant dans Vim (si elle est compilée avec un tel support de langage), soit via un script Perl externe. Il est disponible comme le PreserveNoEOL plugin sur vim.org.

6
répondu Ingo Karkat 2013-04-26 12:14:34

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

Toutefois, l' ?> à la fin d'un fichier php est facultatif. Pas de fin ?> pas de problème avec un saut de ligne à la fin du fichier.

3
répondu Ken 2009-06-28 17:04:03

j'ajoute.vimrc

set binary

et il permet, essayer

2
répondu IvanM 2013-05-30 05:43:58

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

2
répondu Jay Paroline 2013-08-16 05:47:01

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

si vous faites :set binaire, :w et :set nobinary le fichier sera écrit sans newline s'il n'y en avait pas au départ.

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

1
répondu Blixtor 2009-07-01 09:19:51

j'ai trouvé ce plugin vimscript utile pour cette situation.

Plugin 'vim-scripts/PreserveNoEOL'

ou pour en savoir plus, lisez github

0
répondu Alan Dong 2014-07-12 00:57:55