Jak zmusić vima do automatycznego dodawania nowego wiersza na końcu pliku?

16

Vim zwykle pisze <EOL>dla ostatniego wiersza tylko wtedy, gdy był w oryginalnym pliku.

Jak zmusić Vima do ciągłego pisania nowego wiersza na końcu pliku (gdy plik nie jest binarny i nie ma go jeszcze)?

Przetestowałem eolopcję, ale nie działała zgodnie z oczekiwaniami.

Zobacz także: Zachowaj brakujący koniec linii na końcu plików tekstowych , ale odwrotnie. I: Dlaczego pliki powinny kończyć się nową linią?

kenorb
źródło

Odpowiedzi:

17

Podstawowa informacja

Vim nie wyświetla najnowszej nowej linii w buforze, ale w rzeczywistości vim zawsze umieszcza EOL na końcu pliku, gdy go piszesz, ponieważ jest standardem dla plików tekstowych w systemach uniksowych. Więcej informacji na ten temat można znaleźć tutaj . Krótko mówiąc, nie musisz się martwić brakiem nowych wierszy na końcu pliku w vimie.

Eksperyment 1

Możesz wykonać mały eksperyment, aby sprawdzić to zachowanie. W terminalu wykonaj:

$ vim test_test

Wpisz znak 1i zapisz plik :wq.

W pliku jest tylko jeden znak, prawda? Właściwie nie :) Masz teraz w swoim pliku 1i LFpostaciach. Sprawdźmy to za pomocą narzędzia hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31jest kodem ASCII dla znaku 1i 0ajest kodem ASCII dla niedrukowalnego LFznaku, który dla systemu UNIX, jak być może już znasz, kod końca linii.

Eksperyment 2

Ale co, jeśli otworzymy plik, który nie ma eolsymbolu na końcu pliku. Sprawdźmy to też. Utwórzmy na końcu plik bez eol, na przykład tak:

$ echo -n "1" > test_without_eol

Następnie spójrzmy do środka z zrzutem heksadecymalnym:

$ hexdump test_without_eol
000000 31
0000001

Więc nie ma eoltutaj żadnych znaków. Otwórzmy ten plik w vimie:

$ vim test_without_eol

Na dole edytora zobaczysz:

"test_without_eol" [noeol] 1L, 1C

A jeśli zapiszesz ten eolznak postaci zostanie wstawiony automatycznie.

Co możemy z tym zrobić?

Jeśli naprawdę potrzebujesz zobaczyć koniec pliku. Spróbuj użyć tego polecenia:

:set listchars=eol:$

pokaże wszystkie eolznaki jako $znak.

Aleksander Myszow
źródło
Świetny. Doszedłem do tego samego wniosku po zamieszaniu, ponieważ Vim tak naprawdę nie pokazywał mi tej nowej linii, ale był po zapisaniu.
kenorb
1
@kenorb, przy okazji, możesz pokazać wszystkim postaciom EOL za pomocą tej :set listchars=eol:$
komendy
„tak naprawdę nie pokazywał mi tej nowej linii” - w Uniksie nie ma linii. Linia jest zdefiniowana jako „liczba znaków spoza LF, kończących się znakiem LF”. Jeśli myślisz o LF nie jako o „przejściu do następnej linii”, ale o „końcu linii”, to, co robi Vim, nagle zyskuje znacznie więcej sensu.
Amadan,
8

Vim pomija tylko EOL, jeśli plik jest otwierany jak 'binary' i'endofline' opcja jest resetowany (gdy plik binarny nie miał EOL podczas otwierania lub jawnie zresetować opcję). Innymi słowy, Vim honoruje tylko brakujące EOL dla plików binarnych. W przypadku plików tekstowych zawsze pisze z (dodanym) EOL. (Właśnie dlatego potrzebujesz rozwiązań takich jak moja wtyczka PreserveNoEOL, aby przechowywać pliki tekstowe bez EOL.) Wszystkie szczegóły znajdziesz na :help 'endofline'.

Musisz tylko upewnić się, że plik jest otwarty jako plik binarny , aby Vim automatycznie napisał EOL.

Ingo Karkat
źródło
5

Jak wspomniał Alexander , Vim nie pokazuje EOL na EOF, dlatego jest tak mylący (szczególnie z pustą / pustą nową linią, co jest inną rzeczą), dlatego faktycznie zapisuje za każdym razem przy zapisywaniu pliku.

Oto prosty test, jak sprawdzić, czy to działa:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Zauważ, jak zachowuje się znak zachęty powłoki, gdy nie ma EOL (miesza się z następnym wierszem). Podczas ponownego zapisywania pliku w Vimie dodaje go.

Za pomocą wcmożemy policzyć wiersze, słowa i znaki przed zapisaniem i po, abyśmy mogli zobaczyć, że faktycznie się zmienia.

Dlaczego to takie ważne? Aby zachować zgodność naszych plików z POSIX .

kenorb
źródło