VIM Deaktivieren Sie den automatischen Zeilenumbruch am Ende der Datei

Also arbeite ich in einem PHP-Shop, und wir alle benutzen verschiedene Editoren, und wir müssen alle an Windows arbeiten. Ich benutze vim, und jeder im Shop beschwert sich darüber, dass, wenn ich eine Datei bearbeite, unten ein Zeilenumbruch ist. Ich habe gesucht und festgestellt, dass dies ein dokumentiertes Verhalten von vi & vim ist … aber ich habe mich gefragt, ob es eine Möglichkeit gibt, diese function zu deaktivieren. (Es wäre am besten, wenn ich es für bestimmte Dateiendungen deaktivieren könnte).

Wenn jemand davon weiß, wäre das großartig!

auch wenn die Datei am Ende bereits mit neuen Zeilen gespeichert wurde:

vim -b file und einmal in vim:

 :set noeol :wq 

erledigt.

alternativ können Sie Dateien in vim öffnen mit :e ++bin file

Noch eine Alternative:

 :set binary :set noeol :wq 

Und für vim 7.4+ kannst du stattdessen auch (vorzugsweise auf deiner .vimrc) verwenden:

 :set nofixendofline 

(Danke an 罗泽轩 für diese letzte Nachricht!)

Fügen Sie Ihrer .vimrc den folgenden Befehl hinzu, um die Zeilenendeoption zu deaktivieren:

 autocmd FileType php setlocal noeol binary fileformat=dos 

Allerdings wird PHP selbst dieses letzte Ende der Zeile ignorieren – es sollte kein Problem sein. Ich bin fast sicher, dass es in Ihrem Fall etwas anderes gibt, das das letzte Zeilenumbruchzeichen hinzufügt, oder möglicherweise gibt es ein Verwechseln mit Windows / Unix-Zeilenenden-Typen ( \n oder \r\n , usw.).

Aktualisieren:

Eine alternative Lösung könnte darin bestehen, diese Zeile einfach zu Ihrer .vimrc hinzuzufügen:

 set fileformats+=dos 

Es gibt eine andere Möglichkeit, dies zu erreichen, wenn Sie Git für die Quellcodeverwaltung verwenden. Inspiriert von einer Antwort hier , schrieb ich meinen eigenen Filter für die Verwendung in einer gitattributes- Datei.

Um diesen Filter zu installieren, speichern Sie ihn als noeol_filter irgendwo in Ihrem $PATH , machen Sie ihn ausführbar und führen Sie die folgenden Befehle aus:

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

Um den Filter nur für dich selbst zu verwenden, lege die folgende Zeile in dein $GIT_DIR/info/attributes :

 *.php filter=noeol 

Dadurch wird sichergestellt, dass Sie keine neue Zeile in einer .php Datei bei eof .php , ganz gleich, was Vim tut.

Und jetzt das Skript selbst:

 #!/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) 

Ich habe diese Option nicht ausprobiert, aber die folgenden Informationen sind im vim Hilfesystem angegeben (zB Hilfe 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. 

Normalerweise müssen Sie diese Option nicht festlegen oder zurücksetzen. Wenn ‘binary’ deaktiviert ist, wird der Wert beim Schreiben der Datei nicht verwendet. Wenn ‘binary’ aktiviert ist, wird das Vorkommen von a für die letzte Zeile in der Datei gespeichert, so dass beim Schreiben der Datei die Situation aus der ursprünglichen Datei beibehalten werden kann. Aber Sie können es ändern, wenn Sie möchten.

Vielleicht interessiert Sie auch die Antwort auf eine vorhergehende Frage: ” Warum sollten Dateien mit einem Zeilenumbruch enden? ”

Ich habe einen Tipp auf das Vim-Wiki für ein ähnliches (wenn auch anderes) Problem hinzugefügt:

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

OK, Sie sind auf Windows kompliziert Dinge;)

Da die ‘binäre’ Option die Option ‘Dateiformat’ zurücksetzt (und Schreiben mit ‘binär’ setzt immer mit Unix-Zeilenendungen), nehmen wir den großen Hammer raus und machen es extern!

Wie wäre es mit einem Autocommand (: help autocommand) für das BufWritePost Event? Dieser Autokommand wird nach jedem Schreiben eines ganzen Puffers ausgeführt. In diesem Autocommand rufen Sie ein kleines externes Tool (php, perl oder welches Skript auch immer) auf, das den letzten Zeilenumbruch der gerade geschriebenen Datei entfernt.

Das würde also ungefähr so ​​aussehen und würde in deine .vimrc Datei gehen:

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

Lesen Sie die gesamte vim-Dokumentation über Autokommandos, wenn Sie sich zum ersten Mal mit Autokommandos beschäftigen. Es gibt einige Vorbehalte, z. B. wird empfohlen, alle AutoCAD-Dateien in Ihrer .vimrc-Datei zu entfernen, falls Ihre .vimrc-Datei möglicherweise mehrfach abgerufen wird.

Ich habe die Vorschläge von Blixtor mit Perl- und Python-Nachbearbeitung implementiert, entweder in Vim (wenn es mit einer solchen Sprachunterstützung kompiliert wurde) oder über ein externes Perl-Skript. Es ist als PreserveNoEOL-Plugin auf vim.org verfügbar.

Vielleicht könntest du sehen, warum sie sich beschweren. Wenn eine PHP-Datei nach dem Ende eine neue Zeile hat, wird sie von php als Teil der Seite ausgegeben. Dies ist kein Problem, es sei denn Sie versuchen, Header zu senden, nachdem die Datei enthalten ist.

Das?> Am Ende einer PHP-Datei ist jedoch optional. Kein Ende?>, Kein Problem mit einem Zeilenumbruch am Ende der Datei.

Ich füge in .vimrc hinzu

 set binary 

und es hilft, probier es aus

Ich denke, ich habe eine bessere Lösung gefunden als die angenommene Antwort. Die alternativen Lösungen funktionierten nicht für mich und ich wollte nicht ständig im binären Modus arbeiten müssen. Glücklicherweise scheint dies die Aufgabe zu erledigen und ich habe noch keine unangenehmen Nebenwirkungen festgestellt: Das fehlende Ende der Zeile am Ende der Textdateien beibehalten . Ich habe das Ganze einfach zu meinem ~ / .vimrc hinzugefügt.

Wäre es möglich, dass Sie einen speziellen Befehl zum Speichern dieser Dateien verwenden?

Wenn Sie das tun: setze binary,: w und: setze nobinary, wird die Datei ohne newline geschrieben, wenn es keine gibt.

Diese Befehlsfolge könnte natürlich in einen benutzerdefinierten Befehl oder eine Zuordnung eingefügt werden.

Ich fand dieses vimscript Plugin ist hilfreich für diese Situation.

 Plugin 'vim-scripts/PreserveNoEOL' 

Oder lesen Sie mehr bei GitHub