Vim'in otomatik olarak bir dosyanın sonuna yeni satır eklemesi nasıl sağlanır?


16

Vim normalde <EOL>son satır için yalnızca orijinal dosyada bir satır olduğunda yazar .

Bir dosyanın sonuna her zaman yeni bir satır yazmak için vim nasıl yapılır (dosya ikili değilse ve zaten bir tane olmadığında)?

eolSeçeneği test ettim , ancak beklendiği gibi çalışmadı.

Ayrıca bkz: Metin dosyalarının sonunda satır sonunu , ancak tersini koru . Ve: Dosyalar neden bir satırsonu ile bitmeli?

Yanıtlar:


17

Temel bilgi

Vim arabellekte en son yeni satırı göstermez ancak aslında vim, yazarken EOL'yi her zaman dosyanın sonuna yerleştirir, çünkü Unix sistemlerindeki metin dosyaları için standarttır. Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz . Kısacası vim'de dosyanın sonunda yeni satırların olmaması konusunda endişelenmenize gerek yok.

Deney 1

Bu davranışı denetlemek için bu küçük denemeyi yapabilirsiniz. Terminalde:

$ vim test_test

Karakteri girin 1ve dosyayı kaydedin :wq.

Dosyada sadece bir karakter var, değil mi? Aslında hayır :) Artık dosya 1ve LFkarakterleriniz var. Hexdump yardımcı programı ile kontrol edelim:

$ hexdump test_test
0000000 31 0a
0000002

31karakter için ASCII kodudur 1ve 0ayazdırılmamış LFkarakter için ASCII kodudur ve UNIX için satır sonu kodunu zaten biliyor olabilirsiniz.

Deney 2

Ama ya dosyanın eolsonunda sembolü olmayan bir dosyayı açacak olursak . Bunu da kontrol edelim. Sonunda eol olmadan dosya oluşturalım, örneğin:

$ echo -n "1" > test_without_eol

Sonra tekrar içine hexdump ile bakalım:

$ hexdump test_without_eol
000000 31
0000001

Yani burada hiç eolkarakter yok. Bu dosyayı vim'de açalım:

$ vim test_without_eol

Editörün altında şunları göreceksiniz:

"test_without_eol" [noeol] 1L, 1C

Ve eğer bu dosyayı kaydederseniz, eolkarakter otomatik olarak konacaktır.

Bu konuda ne yapabiliriz?

Gerçekten dosyanın sonunu görmeniz gerekiyorsa. Bu komutu kullanmayı deneyin:

:set listchars=eol:$

tüm eolkarakterleri $işaret olarak gösterecektir .


Harika. Karışıklığımdan sonra aynı sonuca vardım, çünkü Vim bana bu yeni çizgiyi göstermiyordu, ama kurtardıktan sonra oradaydı.
kenorb

1
@kenorb Bu arada komedi kullanarak tüm EOL karakterlerini gösterebilirsiniz:set listchars=eol:$
Alexander Myshov

"aslında bana bu yeni çizgiyi göstermiyordu" - Unix'te hiç çizgi yok. Satır, "LF karakterinde sona eren LF olmayan karakterlerin sayısı" olarak tanımlanır. LF'yi "sonraki satıra git" değil, "satır sonu" olarak düşünürseniz, Vim'in aniden yaptığı şey çok daha mantıklıdır.
Amadan

8

Vim yalnızca dosya olarak açılırsa EOL atlar 'binary' ve'endofline' (ne zaman açılış ikili dosya bir EOL yoktu veya açıkça seçeneği sıfırlamak olduğunda) seçeneği sıfırlanır. Başka bir deyişle, Vim ikili dosyalar için sadece eksik bir EOL'yi onurlandırır. Metin dosyaları için her zaman (eklenmiş) bir EOL ile yazar. (Bu yüzden metin dosyalarını EOL olmadan saklamak için PreserveNoEOL eklentim gibi çözümlere ihtiyacınız var .) Tüm ayrıntıları adresinde bulabilirsiniz :help 'endofline'.

Bu nedenle, Vim'in otomatik olarak bir EOL yazması için dosyayı ikili olmayan olarak açtığınızdan emin olmanız gerekir .


5

As Alexander bahsedildiği, Vim o kadar (özellikle kafamı karıştırıyor, bu yüzden EOF EOL göstermez boş / boş yeni hat , başka bir şeydir) dolayısıyla aslında kaydet dosya üzerinde her zamanı yazıyor.

İşte işe yarayıp yaramadığını test etmek için basit bir test:

$ 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

EOL olmadığında kabuk komut isteminin nasıl davrandığına dikkat edin (bir sonraki satırla karıştırılır). Vim ile dosyayı yeniden kaydederken ekler.

Kullanarak wckaydetmeden önce ve sonra satırları, kelimeleri ve karakterleri sayabiliriz, böylece gerçekten değiştiğini görebiliriz.

Bu neden bu kadar önemli? Dosyalarımızı POSIX uyumlu tutmak için .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.