313 votes

Comment empêcher vim d'ajouter une nouvelle ligne à la fin du fichier ?

Alors je travaille 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 le magasin ne cesse de se plaindre que chaque fois que j'édite un fichier, il y a une nouvelle ligne en bas. J'ai cherché et découvert que c'est un comportement documenté de vi & vim... mais je me demandais s'il y avait un moyen de désactiver cette fonctionnalité. (Ce serait bien si je pouvais le désactiver pour des extensions de fichiers spécifiques).

Si quelqu'un sait quelque chose à ce sujet, ce serait génial !

31 votes

Vous devriez leur dire qu'ils se comportent de manière ridicule -- en réalité, il y a une bonne raison pour laquelle vim fait cela : stackoverflow.com/questions/729692/…. Je suppose que cela n'est pertinent que si vous déployez sur des serveurs de type Unix.

7 votes

La pratique recommandée officielle de PHP est d'omettre la dernière balise de fermeture ?>, juste pour cette raison.

0 votes

Cette question date probablement d'avant superuser... mais elle devrait être là.

457voto

gcb Points 2264

Et pour vim 7.4+ vous pouvez utiliser l'un de ces éléments (de préférence dans votre .vimrc) (merci à 罗泽轩 pour cette dernière nouvelle!) :

:set nofixeol
:set nofixendofline

Maintenant, en ce qui concerne les anciennes versions de vim.

Même si le fichier a déjà été enregistré avec des sauts de ligne à la fin :

vim -b fichier et une fois dans vim :

:set noeol
:wq

c'est fait.

alternativement vous pouvez ouvrir les fichiers dans vim avec :e ++bin fichier

Encore une autre alternative:

:set binary
:set noeol
:wq

voir plus de détails sur Pourquoi ai-je besoin de vim en mode binaire pour que 'noeol' fonctionne?

7 votes

Vous pouvez également ajouter set binary et set noeol dans votre .vimrc

21 votes

Méfiez-vous : binaire annule expandtab, ce qui vous conduira à obtenir des tabulations littérales dans votre source.

5 votes

@CiroSantilli merci ! J'ai cherché les effets secondaires de binaire depuis toujours et je me demandais pourquoi ce n'est pas la valeur par défaut ! Puisque j'aime mes onglets, je pense que je vais tenir compte de cet avantage ajouté :)

23voto

too much php Points 27983

Ajoutez la commande suivante à votre .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 quelque chose d'autre qui ajoute le dernier caractère de nouvelle ligne, ou peut-être qu'il y a une confusion avec les types de fin de ligne Windows/Unix (\n ou \r\n, etc).

Mise à jour:

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

set fileformats+=dos

0 votes

Je sais que php ne le parse pas mal... Je l'ai montré à mes collègues, mais WinMerge les considère comme étant différents... Je vais essayer cela et vous faire savoir comment cela se passe.

0 votes

Faire cela a l'effet désiré de ne pas de dernière ligne, mais cela convertit aussi le fichier en fins de ligne unix... (même sur une boîte windows)... Donc j'avais fait ça avant en passant en mode binaire... mais alors les fins de ligne n'apparaissent pas correctement dans le bloc-notes... tout est juste une ligne.

0 votes

Malheureusement, aucune de ces suggestions ne fonctionne. Ajouter le fileformat=dos à la commande autocmd n'a aucun effet, et set filetype+=dos ajoute toujours le \n final

18voto

Amir Points 347

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

Pour installer ce filtre, enregistrez-le sous noeol_filter quelque part dans votre $PATH, donnez-lui les droits d'exécution, 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, ajoutez la ligne suivante dans votre $GIT_DIR/info/attributes :

*.php filter=noeol

Cela garantira que vous ne commettrez pas de saut de ligne en fin de fichier dans un fichier .php, peu importe ce que Vim fait.

Et maintenant, le script lui-même :

#!/usr/bin/python

# un filtre qui supprime la saut de ligne de la dernière ligne de son stdin
# si la dernière ligne est vide, laissez-la telle quelle, pour rendre l'opération idempotente
# inspiré de : 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:
        # pas d'entrée, rien à faire
        sys.exit(0)

    # cracher tout sauf la dernière ligne
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # supprimer le saut de ligne de la dernière ligne avant de le cracher
    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)

0 votes

C'est une excellente solution... même si malheureusement je n'utilisais pas git. J'utilisais svn, bien que je soupçonne qu'une approche similaire aurait pu être adoptée. Quoi qu'il en soit, j'ai changé de poste et je n'ai plus à m'en préoccuper :)

13voto

Tim Henigan Points 19948

Je n'ai pas essayé cette option, mais les informations suivantes sont données dans le système d'aide de vim (c'est-à-dire l'aide eol):

'endofline' 'eol'   boolean (par défaut activé)
            local au buffer
            {non présent dans Vi}

Lors de l'écriture d'un fichier et que cette option est désactivée et que l'option 'binaire'
est activée, aucun  ne sera écrit pour la dernière ligne du fichier. Cette
option est automatiquement activée lors du début de l'édition d'un nouveau fichier, sauf si
le fichier n'a pas de  pour la dernière ligne du fichier, auquel cas elle est réinitialisée.

Normalement, vous n'avez pas besoin de définir ou 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é, elle est utilisée pour se souvenir de la présence d'un pour la dernière ligne du fichier, afin que lorsque vous écrivez le fichier, la situation du fichier original puisse être conservée. Mais vous pouvez la modifier si vous le souhaitez.

Vous pourriez également être intéressé par la réponse à une question précédente: "Pourquoi les fichiers doivent-ils se terminer par un saut de ligne".

0 votes

J'avais également rencontré le paramètre eol... mais cela ne permet pas d'accomplir cette tâche. C'est plutôt une variable qui détermine si un saut de ligne a déjà été placé à la fin du fichier ou non. De plus, cela n'a aucun effet sur les fichiers texte, mais seulement sur les fichiers binaires.

3 votes

La rubrique d'aide de Vim dit aussi "Lorsque 'binaire' est désactivé, la valeur n'est pas utilisée lors de l'écriture du fichier." à propos de eol

1 votes

+1 pour la réponse de VonC à cette question, qui met en avant que "newline" et EOL sont confondus. Les éditeurs inférieurs affichent incorrectement une nouvelle ligne supplémentaire en raison d'un EOL, vim n'ajoute pas de "newline"!

8voto

Blixtor Points 287

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

Comme l'option 'binary' réinitialise l'option 'fileformat' (et écrire avec 'binary' défini écrit toujours avec des fins de ligne unix), utilisons le grand marteau et faisons-le de manière externe !

Et si on définissait une autocommande (:help autocommand) pour l'événement BufWritePost ? Cette autocommande est exécutée après chaque fois que vous écrivez un tampon entier. Dans cette autocommande, appelez un petit outil externe (php, perl ou tout autre script) qui supprime le dernier saut de ligne du fichier que vous venez d'écrire.

Donc cela ressemblerait à quelque chose comme ça et irait dans votre fichier .vimrc :

autocmd!   "Supprimer toutes les autocommandes (pour le groupe actuel), voir ci-dessous"
autocmd BufWritePost *.php !your-script 

Assurez-vous de lire toute la documentation de Vim sur les autocommandes si c'est la première fois que vous travaillez avec les autocommandes. Il y a quelques précautions à prendre, par exemple il est recommandé de supprimer toutes les autocommandes dans votre fichier .vimrc au cas où celui-ci serait sourcé plusieurs fois.

0 votes

Eh bien... J'espérais qu'il y avait une meilleure solution que celle-ci... mais cela fonctionne certainement!

3 votes

Cela fonctionne très bien! Yay! Cependant, j'ai une question... y a-t-il un moyen de ne pas devoir appuyer deux fois sur Entrée après chaque enregistrement. Je dois appuyer sur Entrée dans la fenêtre cmd qui s'est ouverte, puis encore une fois parce que vim me dit que le script s'est exécuté avec succès... Y a-t-il un moyen de simplement les faire tous disparaître?

2 votes

Pour éviter les invites , il suffit de préfixer la commande avec silent. Par exemple, silent !votre-script .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X