Jeśli otworzę Vima i itest<Esc>:wq
piszę, to otrzymam plik, który nie ma w Vimie nowych linii, ale wydaje się, że zawiera nowy wiersz w kodzie:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Jeśli otworzę Vima i napiszę, itest<Return><Esc>:wq
to otrzymam plik, który ma jedną nową linię w Vimie, ale dwie nowe linie w kodzie:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Zauważ, że otwieram Vima za pomocą, -u NONE
więc nie jest używana konfiguracja lokalna. Zauważ też, że może to być związane z moim poprzednim pytaniem .
To są informacje o moim systemie:
$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35)
Included patches: 1-429
Modified by [email protected]
Compiled by buildd@
Mogę również potwierdzić dokładnie to samo zachowanie w tym systemie:
$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by [email protected]
Compiled by buildd@
Dlaczego Vim dodaje nową linię? Czy to konwencja?
Oto wyjaśnienie dotyczące hd
polecenia zainstalowanego na serwerze Ubuntu Server:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Odpowiedzi:
Konwencja dla plików tekstowych uniksowych jest taka, że każda linia jest zakończona nową linią, a nowe linie są zakończeniami linii, a nie separatorami linii.
Kiedy Vim zapisuje bufor jako plik, kończy każdą linię sekwencją końca linii dla tego formatu pliku, który dla Uniksa jest nową linią. Widzieć
Jeśli używasz narzędzi przetwarzania tekstu w systemie Unix, najlepiej trzymać się tej konwencji. Jeśli jednak nie musisz wstawiać nowego wiersza na końcu ostatniego wiersza pliku, możesz to zrobić. Vim uważa takie pliki za „binarne”. Widzieć
źródło
Vim nie dodaje niczego, czego sam tam nie umieściłeś.
Znak „nowej linii” nie jest „nową linią” i oba przykłady są całkowicie normalne:
źródło
printf "\x41" > /tmp/test.txt
następnie sprawdź, czy ma on tylko pojedynczy znak „A” zxxd /tmp/test.txt
. Terazvim /tmp/test.txt<ENTER>:wq
. Sprawdź ponownie, aby zobaczyć plik zawierający dwa bajty: „A \ n”.printf
tym nie miałem już dobrze uformowanych „linii”. Po vimie mam jeden. Dodaje więc coś, czego tam nie umieściłem.printf
nie jest linią, jeśli się nie dodasz\n
. Będąc edytorem tekstu, Vim domyślnie zajmuje się liniami, a każdy tekst, który wstawisz do pliku, jest przynajmniej w linii, chyba że wyraźnie powiesz Vimowi, aby tego nie robił.Niezakończone pliki tekstowe są złe z wielu powodów; oto taki, o którym jeszcze nie wspominałem:
W hipotetycznym świecie, w którym dopuszczalne są pliki tekstowe bez nowej linii, nie byłoby różnicy między plikiem zawierającym 0 linii a plikiem zawierającym 1 pustą linię. Oba byłyby reprezentowane przez plik 0-bajtowy.
Nie można zdecydować, ile wierszy znajduje się w pliku, byłoby złe.
źródło
Vim 8.0 zapewnia to teraz z
fixeol
opcją. W szczególności jeśli:potem Vim nie doda końcowego znaku nowej linii na końcu ostatniego wiersza, jeśli plik jeszcze go nie miał.
Może to być wtyczka typu pliku lub nawet Twoja
.vimrc
.(To jest poprawa na
:set binary
ponieważ wpływa tylko na końcowy znak podziału wiersza, abinary
jednocześnie zmienia wiele innych zachowań, których prawdopodobnie nie chcesz, chyba że faktycznie edytujesz plik binarny.)Nowo utworzony plik będzie domyślnie nadal miał znak końca linii. Możesz to zmienić (i zamienić plik, który ma już końcowy nowy wiersz na nie posiadający go), wykonując dodatkowo:
Należy to ustawić specjalnie dla każdego pliku, który chcesz zmienić: ładowanie pliku do bufora zawsze będzie ustawione tak,
eol
aby pasowało do bieżącego stanu pliku.źródło
Za pomocą polecenia „j” możesz połączyć wszystkie linie w jedną.
Jeśli chcesz również usunąć LF lub CRLF z ostatniego wiersza, wykonaj następujące czynności w vi.
źródło