2008-12-08 22 views
20

Ich habe vim nicht in einem Unix-System in einer Weile verwendet, aber wie ich mich erinnere, gab es keine \ r, es war immer \ n.Vim: n vs r

Ich benutze gVim unter Windows und wenn ich suche für neue Zeile Zeichen verwende ich \ n. Suchen nach \ r gibt nichts zurück. Aber wenn ich ersetzen die Zeichen, die ich \ r's verwenden muss. \ ns gib mir^@

Kann mir jemand erklären, was hier vor sich geht?

+0

Sie sollten die angenommene Antwort ändern; Jonathan Leffers Antwort ist richtig, hat aber nichts mit der Frage zu tun. – sjy

Antwort

17

Lookup up:

:set fileformat=unix 
:set fileformat=dos 

auf die andere Codierung wechseln Dies kann auf jeder Plattform verwendet werden.

+0

Ich sehe nicht, was das EOL-Format der Datei mit der Art und Weise zu tun hat, wie vim Suchen/Ersetzen von Zeilenvorschub/Wagenrücklauf. – graywh

+0

Normalerweise legen Sie das Dateiformat entsprechend fest, und Sie müssen sich dann keine Gedanken darüber machen, ob Wagenrücklauf erforderlich ist, und müssen daher nicht danach suchen. –

1

unter Unix, innerhalb vim, ^V + <enter> gibt mir ein ^M welches den \r Charakter.

Sie können \r auch nicht innerhalb von vim finden, es sei denn, Sie weisen es an, die Datei im Binärmodus zu bearbeiten, dh nicht den automatischen Standardmodus, in dem die Zeilenendung automatisch erkannt wird. (Es sollte [dos] im Status drucken.)

+1

FWIW, wenn Ihre Datei eine Mischung aus einigen Zeilen hat, die in \ n enden, aber anderen Zeilen, die in \ r \ n enden, sehen Sie die^M Zeichen. Sie können eine Mischung erhalten, wenn jemand die Textdatei mit Windows bearbeitet hat. –

+0

Ja, natürlich wählt vim die Zeilenendung, die Sinn macht. – mat

2

Ich denke, das Problem könnte in der Art liegen, wie Windows und Unix Zeilenumbrüche machen. Das Format für Unix ist \ n (Zeilenvorschub), aber für Windows ist es \ r \ n (Wagenrücklauf, Zeilenvorschub).

+0

Sie haben das rückwärts, UNIX tut \ n (das ist Zeilenvorschub), Windows tut \ r \ n (Carraige Rückkehr, Zeilenvorschub), – Powerlord

+0

Danke für die Korrektur mich. Es war ein Tippfehler meinerseits. – Sean

0

Wenn Sie in Windows eine Datei im Textmodus öffnen, wird \ n sowohl als Zeilenvorschub als auch als Zeilenvorschub interpretiert. Dies ist normalerweise bei den * nix-Systemen nicht der Fall.

3

vim macht einige Unordnung mit Wagenrücklauf (\ r) und Zeilenumbrüchen (\ n). wenn Sie in Unix Zum Beispiel sind und vi zeigt Ihnen Linien enden in ‚^ M‘, weil sie Windows-Textdateien sind, eine einfache Möglichkeit, sie loszuwerden, ist, den Befehl

:%s/^V^M/^V^M/g 

Es spielt keine eingeben Sieht nicht so aus, als ob es irgendwas tun sollte, aber es tut es.

25

Sieht aus wie du zwei Dinge fragst. Ein Problem ist \r vs. \n, die andere abgedeckt haben.

Das andere Problem ist \n auf der rechten Seite einer Substitution. Wenn Sie sich :h s/\n anschauen, heißt es, dass \n im Ersatzteil einer Substitution ein <NUL>/<NL>, kein newline.

Wenn Sie eine :%s/\n/\n/ machen und die Datei in einem Hex-Editor speichern und öffnen, sind alle ^@ Zeichen ASCII-Zeichen (NUL-Zeichen). Warum die Vim Entwickler \n auf der linken Seite für End-of-Line und \n auf der rechten Seite für NUL verwenden, ist mir ein Rätsel. Aber dieses spezielle Verhalten hat nichts mit Windows vs. Unix zu tun.

+1

Dieser bekommt mich immer - ich kann mich nie erinnern, ob es verschiedene Dinge sind, die suchen und ersetzen. Kürzlich (nachdem ich die Dokumente gelesen und herausgefunden habe, worin der Unterschied besteht), finde ich es nützlich, daran zu denken, dass NUL mit 'n' beginnt. –

+0

Kein Zweifel, es gibt Logik in den Entscheidungen der Designer gemacht, aber es stolpert mich auch immer. Für mich hätte es viel mehr Sinn gemacht, '\ r' * (oder \ n, wähle deine Wahl) * sowohl beim Suchen als auch beim Ersetzen zu verwenden. Die Verwendung von 's/\ r/\ r/n' sollte 1 anstelle von nicht gefundenem Muster zurückgeben und mit' s/\ n/\ n' nichts ändern. –

3
:%s/^V^M/^V^M/g 

In ähnlicher Weise (glaube ich) das folgende tut das Gleiche, und ist einfacher tippen.

:%s/\r/\r/g 
6

Hinter den Kulissen verwendet Vim \ r (Wagenrücklauf) End-Of-Linien zu speichern (unabhängig vom Dateiformat, das nur von Bedeutung, wenn die Datei gelesen oder geschrieben wird). Vim verwendet \ n um NULs darzustellen. Sie suchen jedoch nach EOL als \ n, aber in der Ersetzung steht \ n für NUL. Es wird erklärt in: h sub-replacate-special. Die Suche nach \ r findet Wagenrücklauf, die nicht Teil der EOL des Dateiformats waren. Es gibt eine lange Erklärung bei: h Dateiformaten.

Verwandte Themen