2008-12-08 18 views
20

Nie użyłem vima w systemie Unix od jakiegoś czasu, ale jak pamiętam, nie było \ r, zawsze było \ n.Vim: n vs. r

Używam gVim pod oknami, a kiedy I przeszukuję dla nowych znaków linii, używam \ n. Wyszukiwanie \ r nic nie zwraca. Ale kiedy I zamieniam na znaki, muszę użyć \ r. \ n daje mi^@

Czy ktoś może wyjaśnić, co tu się dzieje?

+0

Powinieneś zmienić zaakceptowaną odpowiedź; Odpowiedź Jonathana Leffera jest poprawna, ale nie ma nic wspólnego z pytaniem. – sjy

Odpowiedz

17

Lookup up:

:set fileformat=unix 
:set fileformat=dos 

ten może być stosowany na każdej platformie, aby przełączyć się do innego kodowania.

+0

Nie widzę, co format pliku EOL ma do czynienia ze sposobem, w jaki vim wyszukuje/zamienia znaki nowej linii/powrotu karetki. – graywh

+0

Zazwyczaj ustawiasz odpowiedni format pliku, a następnie nie musisz się martwić, czy potrzebne są powroty karetki, a co za tym idzie, nie musisz ich wyszukiwać. –

1

pod Unix, wewnątrz vim, ^V + <enter> daje mi ^M która jest postać \r.

Ponadto, nie można znaleźć \r wewnątrz vim, chyba że powiesz mu, aby edytować plik w trybie binarnym, to znaczy nie używając domyślnego trybu automatycznego, w którym automatycznie wykrywa zakończenie linii. (powinien wydrukować [dos] w statusie.)

+1

FWIW, jeśli twój plik zawiera mieszankę niektórych linii kończących się na \ n, ale inne linie kończące się na \ r \ n, zobaczysz^M znaków. Możesz otrzymać miks, jeśli ktoś wykonał edycję pliku tekstowego w systemie Windows. –

+0

Tak, oczywiście, vim wybierze zakończenie linii, które ma sens. – mat

2

Myślę, że problem może polegać na tym, że Windows i Unix tworzą nowe linie. Format dla Uniksa to \ n (wiersz), ale dla Windows jest to \ r \ n (powrót karetki, wiersz).

+0

Masz to w tył, UNIX nie \ n (co jest linią), Windows robi \ r \ n (powrót carra, line feed), – Powerlord

+0

Dzięki za poprawienie mnie. To był literówka z mojej strony. – Sean

0

W systemie Windows, jeśli otworzysz plik w trybie tekstowym, \ n zostanie zinterpretowany zarówno jako znak nowej linii, jak i do linii. Zwykle tak nie jest w przypadku systemów * nix.

3

vim robi trochę zamieszania z powrotem karetki (\ r) i nowymi liniami (\ n). Na przykład, jeśli jesteś w Uniksie i vi pokazuje linie kończące się na „^ M”, bo są pliki tekstowe Windows, łatwym sposobem na pozbycie się z nich ma wejść Komenda

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

nie robi Wygląda na to, że powinien zrobić wszystko, ale robi to.

25

Wygląda na to, że pytasz o dwie rzeczy. Jedna kwestia to \r vs. \n, którą inni omówili.

Inną kwestią jest \n po prawej stronie zmiany. Jeśli spojrzeć na :h s/\n, mówi, że \n w zastępczej części substytucji wstawia <NUL>/<NL>, a nie znak nowej linii.

Jeśli wykonasz :%s/\n/\n/ i zapiszesz i otworzysz plik w edytorze szesnastkowym, wszystkie znaki ^@ są znakami ASCII 0 (znaki NUL). Dlaczego twórcy Vima używają \n po lewej stronie do końca linii i \n po prawej stronie dla NUL jest poza mną. Ale to szczególne zachowanie nie ma nic wspólnego z Windows vs. Unix.

+1

Ten zawsze mnie dostaje - nigdy nie pamiętam, czy to \ r, czy \ n oznacza różne rzeczy w wyszukiwaniu i zamianie. Ostatnio (po tym, jak faktycznie przeczytałem dokumenty i stwierdziłem, na czym polega różnica) uważam, że warto pamiętać, że NUL zaczyna się od "n". –

+0

Bez wątpienia istnieje logika w dokonanych przez projektantów wyborów, ale za każdym razem mnie to wyzwala. Dla mnie bardziej sensownym byłoby użycie '\ r' * (lub \ n, pick you choice) * zarówno w wyszukiwaniu, jak i wymianie. Użycie 's/\ r/\ r/n' zwróci 1 zamiast" Pattern not found "i użycie' s/\ n/\ n' nie powinno niczego zmieniać. –

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

Podobnie następujące robi to samo (chyba), i łatwiej jest wpisać się.

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

Za kulisami Vim używa \ r (powrót karetki), aby zapisać End-of-Lines (niezależnie od fileformat, który liczy się tylko wtedy, gdy plik jest odczytywany lub pisemne). Vim używa \ n do reprezentowania NUL-ów. Jednakże wyszukujesz EOL jako \ n, ale w zastępstwie \ n oznacza NUL. Wyjaśniono to w: h sub-replace-sepcial. Wyszukiwanie \ r spowoduje znalezienie powrotów karetki, które nie były częścią EOL pliku fileformat. Istnieje długie wytłumaczenie dla: h formatów plików.