VIM Deaktiviert den automatischen Zeilenumbruch am Dateiende

250

Also arbeite ich in einem PHP-Shop, und wir verwenden alle unterschiedliche Editoren, und wir müssen alle an Windows arbeiten. Ich benutze vim und jeder im Shop beschwert sich immer wieder, dass bei jeder Bearbeitung einer Datei unten eine neue Zeile steht. Ich habe mich umgesehen und festgestellt, dass dies ein dokumentiertes Verhalten von vi & vim ist ... aber ich habe mich gefragt, ob es eine Möglichkeit gibt, diese Funktion zu deaktivieren. (Es wäre am besten, wenn ich es für bestimmte Dateierweiterungen deaktivieren könnte).

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

Boushley
quelle
23
Sie sollten ihnen sagen, dass sie albern sind - es gibt tatsächlich einen guten Grund, warum vim das tut: stackoverflow.com/questions/729692/… . Ich denke, es ist nur relevant, wenn Sie auf Unix-ähnlichen Servern bereitstellen.
HDGARROOD
5
Die offizielle empfohlene Vorgehensweise von PHP besteht darin, das letzte ?>schließende Tag nur aus diesem Grund wegzulassen .
Sebastián Grignoli
Diese Frage ist wahrscheinlich älter als der Superuser ... aber sie sollte da sein.
GCB
20
Die Frage sollte wirklich sein: Wie wir alle anderen Redakteure sagen Sie , dass die Menschen in Ihrem Shop verwenden die letzte Zeile der Datei , um sicherzustellen , tut Ende mit einem EOL. ;-)
TJ Crowder

Antworten:

360

Und für vim7.4+ können Sie (vorzugsweise auf Ihrer .vimrc) verwenden (danke an 罗泽轩 für die letzten Neuigkeiten!):

:set nofixendofline

Nun zu älteren Versionen von vim.

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

vim -b file und einmal in vim:

:set noeol
:wq

getan.

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

Noch eine Alternative:

:set binary
:set noeol
:wq
gcb
quelle
6
Sie können auch hinzufügen set binaryund set noeolin Ihre .vimrc
dryobs
17
Achtung : binaryÜberschreibungen expandtab, die dazu führen, dass Sie wörtliche Registerkarten in Ihrer Quelle erhalten.
Ciro Santilli 法轮功 冠状 病 六四 事件 13
4
@CiroSantilli danke! Ich habe für immer nach Nebenwirkungen von Binär gesucht und mich gefragt, warum es nicht die Standardeinstellung ist! Da ich meine Tabs liebe, denke ich, dass ich diesen zusätzlichen Vorteil in Betracht ziehen werde :)
GCB
11
Jetzt können Sie hinzufügen set nofixendofline, um das Problem in Vim 7.4+ zu lösen
罗泽轩
1
@TrevorBoydSmith ja, weil historisch gesehen POSIX (ich könnte mich im tatsächlichen Standard irren) eine neue Zeile am Ende einer Zeile in einer Textdatei erwarten. Aus diesem Grund mussten die meisten Lösungen als Binärdatei behandelt werden. Damals war es wahrscheinlich sehr praktisch, und heute ist es rückwärts, deshalb gibt es jetzt die bequeme Einstellung. Fügen Sie es einfach Ihrem vimrc hinzu. Es gibt sowieso schlimmere Probleme in anderen Editoren :)
GCB
23

Fügen Sie Ihrer .vimrc den folgenden Befehl hinzu, um die Option für das Zeilenende zu deaktivieren:

autocmd FileType php setlocal noeol binary fileformat=dos

Allerdings , PHP selbst wird die letzte End-of-line ignorieren - es sollte kein Problem sein. Ich bin mir fast sicher, dass es in Ihrem Fall noch etwas gibt, das das letzte Zeilenumbruchzeichen hinzufügt, oder möglicherweise eine Verwechslung mit Windows / Unix-Zeilenendetypen ( \noder \r\nusw.).

Aktualisieren:

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

set fileformats+=dos
zu viel php
quelle
Ich weiß, dass PHP es nicht falsch analysiert ... Ich habe das meinen Kollegen gezeigt, aber Winmerge sieht sie als anders an ... Ich werde das versuchen und Sie wissen lassen, wie es ausgeht.
Boushley
Dies hat den gewünschten Effekt, dass keine letzte Zeile vorhanden ist, aber es konvertiert die Datei auch in Unix-Zeilenenden ... (sogar auf einer Windows-Box) ... Also hatte ich das vorher getan, indem ich in den Binärmodus gewechselt habe ... aber dann Die Zeilenenden werden nicht im Notizblock angezeigt. Alles ist nur eine Zeile.
Boushley
Leider funktioniert keiner dieser Vorschläge. Das Hinzufügen des Dateiformats = dos zum Autocmd hat keine Auswirkung, und das Festlegen des Dateityps + = dos fügt weiterhin das
nachfolgende
Entschuldigung, ich habe das falsch verstanden. Verwenden Sie 'set filetypes + = dos', nicht 'set fileformats ...'
zu viel PHP
17

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

Um diesen Filter zu installieren, speichern Sie ihn noeol_filterirgendwo 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 sich selbst zu verwenden, setzen Sie die folgende Zeile in Ihre $GIT_DIR/info/attributes:

*.php filter=noeol

Dadurch wird sichergestellt, dass Sie bei eof keine Zeilenumbrüche in einer .phpDatei festschreiben , unabhängig davon, was Vim tut.

Und jetzt das Drehbuch 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: /programming/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)
Amir
quelle
Das ist eine großartige Lösung ... obwohl ich leider kein Git verwendet habe. Ich habe svn verwendet, obwohl ich vermute, dass ein ähnlicher Ansatz gewählt worden sein könnte. Wie auch immer, ich bin von dieser Position weitergezogen und muss mir darüber keine Sorgen mehr machen :)
Boushley
12

Ich habe diese Option nicht ausprobiert, aber die folgenden Informationen werden im vim-Hilfesystem (dh help eol) angegeben:

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

Normalerweise müssen Sie diese Option nicht einstellen oder zurücksetzen. Wenn 'binär' deaktiviert ist, wird der Wert beim Schreiben der Datei nicht verwendet. Wenn 'binär' aktiviert ist, wird es verwendet, um das Vorhandensein eines für die letzte Zeile in der Datei zu speichern, sodass beim Schreiben der Datei die Situation aus der Originaldatei beibehalten werden kann. Sie können es jedoch ändern, wenn Sie möchten.

Möglicherweise interessiert Sie auch die Antwort auf eine frühere Frage: " Warum sollten Dateien mit einem Zeilenumbruch enden? ".

Tim Henigan
quelle
Ich war auch auf die EOL-Einstellung gestoßen ... aber sie erfüllt diese Aufgabe nicht. Es ist eher eine Variable, die bestimmt, ob eine bereits am Ende der Datei platziert wurde oder nicht. Es hat auch keine Auswirkungen auf Textdateien, sondern nur auf Binärdateien.
Boushley
3
In der vim-Hilfe heißt es außerdem: "Wenn 'binär' deaktiviert ist, wird der Wert beim Schreiben der Datei nicht verwendet." über eol
Boushley
1
+1 für VonCs Antwort auf diese Frage, die hervorhebt, dass "newline" und EOL zusammengeführt werden. Minderwertige Editoren zeigen aufgrund einer EOL fälschlicherweise eine zusätzliche neue Zeile an. Vim fügt keine "neue Zeile" hinzu!
ches
9

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

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

Jo Liss
quelle
5
„Vim 7.4.785 fügt die fixeolOption hinzu, die deaktiviert werden kann, um fehlende EOL am Ende der Datei automatisch beizubehalten . Dieses Skript ist für Vim 7.4.785 und höher nicht mehr erforderlich. “ (Quelle: dieselbe Wiki-Seite.) Danke, mir war diese neue Option nicht bekannt.
Amir
1
Ich musste beides einstellen noeolund nofixeoldas gewünschte Ergebnis erzielen.
Selurvedu
8

OK, Sie unter Windows erschweren die Sache;)

Da die Option 'binär' die Option 'Dateiformat' zurücksetzt (und das Schreiben mit 'binär' immer mit Unix-Zeilenenden schreibt), nehmen wir den großen Hammer heraus und tun es extern!

Wie wäre es mit der Definition eines Autocommands (: help autocommand) für das BufWritePost-Ereignis? Dieser automatische Befehl wird jedes Mal ausgeführt, wenn Sie einen ganzen Puffer schreiben. Rufen Sie in diesem Autocommand ein kleines externes Tool (PHP, Perl oder ein beliebiges Skript) auf, das die letzte neue Zeile der gerade geschriebenen Datei entfernt.

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

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

Lesen Sie unbedingt die gesamte vim-Dokumentation zu Autobefehlen, wenn Sie sich zum ersten Mal mit Autobefehlen befassen. Es gibt einige Einschränkungen, z. B. wird empfohlen, alle Autocmds in Ihrer .vimrc zu entfernen, falls Ihre .vimrc möglicherweise mehrmals bezogen wird.

Blixtor
quelle
Nun ... ich hatte gehofft, dass es eine bessere Lösung als diese gibt ... aber das funktioniert definitiv!
Boushley
3
Das funktioniert super! Yay! Ich habe jedoch eine Frage ... gibt es eine Möglichkeit, dies zu tun, damit ich nach jedem Speichern nicht zweimal die Eingabetaste drücken muss. Ich muss die Eingabetaste im angezeigten Cmd-Fenster drücken und dann noch einmal, weil vim mir mitteilt, dass das Skript erfolgreich zurückgegeben wurde ... Gibt es eine Möglichkeit, sie alle verschwinden zu lassen?
Boushley
2
Um die Eingabeaufforderungen <Drücken Sie die Eingabetaste> zu vermeiden, stellen Sie dem Befehl einfach das Präfix voran silent. ZB silent !your-script <afile>.
Dash-Tom-Bang
6

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

Ingo Karkat
quelle
Ich habe es nicht gründlich getestet, aber das scheint eine bessere Lösung zu sein.
Boushley
Plugin funktioniert, aber nach der Installation musste ich let g:PreserveNoEOL = 1in meine .vimrcDatei setzen! Musste Vimscript lernen, um das aus der Plugin-Beschreibung herauszufinden! : D
DarthVanger
1
@DarthVanger: :help PreserveNoEOL-usagehätte es dir auch gesagt. RTFM :-)
Ingo Karkat
@IngoKarkat Oh, sorry. War auf der Suche nach unter INSTALLATIONund CONFIGURATION. USAGE
Ich habe
3

Vielleicht könnten Sie sich ansehen, warum sie sich beschweren. Wenn eine PHP-Datei nach dem Ende einen Zeilenumbruch hat?>, Gibt PHP diesen als Teil der Seite aus. 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.

Ken
quelle
2
Sie haben Recht, aber wir als Shop haben entschieden, dass es besser aussieht, das Ende zu haben?> Ich weiß, wir könnten es nicht mehr verwenden ... aber ich würde es vorziehen, meinen Editor an meinen Codierungsstil anzupassen, als umgekehrt.
Boushley
1
Damit Sie wissen, dass PHP Ihr Ending-Tag automatisch als?> Oder als?> \ N analysiert (da unter Linux alle gültigen Dateien mit einem \ n enden sollten) ... Mein Code verursacht diese Probleme also nicht ... Sie mögen den Look einfach nicht.
Boushley
2

Ich füge in .vimrc hinzu

set binary

und es hilft, versuchen Sie es

IvanM
quelle
2

Ich denke, ich habe eine bessere Lösung gefunden als die akzeptierte Antwort. Die alternativen Lösungen funktionierten nicht für mich und ich wollte nicht die ganze Zeit im Binärmodus arbeiten müssen. Glücklicherweise scheint dies die Arbeit zu erledigen, und ich habe noch keine bösen Nebenwirkungen festgestellt: Bewahren Sie das fehlende Zeilenende am Ende der Textdateien auf . Ich habe das Ganze einfach zu meinem ~ / .vimrc hinzugefügt.

Jay Paroline
quelle
1

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

Wenn Sie Folgendes tun: set binary ,: w und: set nobinary, wird die Datei ohne Zeilenumbruch geschrieben, wenn zu Beginn keine vorhanden war.

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

Blixtor
quelle
Da ich mit Windows arbeite und es im Binärmodus speichere, wird das Speichern leider im Unix-Modus ausgeführt. Selbst wenn ich es tue: set binary: set fileformat = dos: w: set nobinary Nach dem Beenden wurde die Datei im Unix-Format gespeichert ... Ich kann nicht glauben, dass es keine Möglichkeit gibt, dies einfach auszuschalten.
Boushley
0

Ich fand dieses Vimscript-Plugin für diese Situation hilfreich.

Plugin 'vim-scripts/PreserveNoEOL'

Oder lesen Sie mehr bei Github

Alan Dong
quelle