Vim neden bir satırsonu ekliyor? Bu bir konvansiyon mu?


22

Ben Vim açıp yazarsanız itest<Esc>:wqo zaman hiçbir yeni satır olan bir dosyayı almak Vim ama kodda bir yeni satır var gibi görünüyor:

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

Vim'i açıp yazdığımda Vim'de itest<Return><Esc>:wqbir satırsonu ancak kodda iki satır satır olan bir dosya alıyorum :

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

-u NONEKullanılan yerel yapılandırma olmadığından Vim'i açtığımı unutmayın . Bunun daha önceki bir soru ile ilgili olabileceğini de unutmayın .

Bu benim sistem bilgim:

$ 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 pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

Bu sistemde de aynı davranışı doğrulayabilirim:

$ 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 pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

Vim neden bir satırsonu ekliyor? Bu bir konvansiyon mu?

hdUbuntu Sunucusunda yüklü komut hakkında bazı açıklamalar :

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump

8
Bu bir kongre gibi görünüyor. İsterseniz nasıl devre dışı bırakacağınız aşağıda açıklanmıştır . İşte bunun tarihi.
jliv902

Yanıtlar:


28

Unix metin dosyaları için kural, her satırın bir satırsonu tarafından sonlandırılması ve satırların ayırıcılar değil satır sonlandırıcıları olmasıdır.

Vim bir arabelleği dosya olarak kaydettiğinde, Unix için bir yeni satır olan bu dosya biçimi için satır sonu dizisiyle her satırı sonlandırır. Görmek

:help 'fileformat'

Unix metin işleme araçlarını kullanıyorsanız, bu kurala uymak en iyisidir. Ancak, bir dosyanın son satırının sonuna yeni satır koymamanız gerekiyorsa, bunu yapabilirsiniz. Vim bu tür dosyaları "ikili" olarak kabul eder. Görmek

:help 'binary'
:help edit-binary

1
Vay ilginçmiş. Yani ünlü \ r \ n vs \ n yanında. Windows satır ayırıcılar, unix satır sonlandırıcılar kullanıyor? ve bu herhangi bir yerde belgeleniyor mu? Burada muhtemelen ISO / IEC 9899: 2011 unix'e uygulandığını biliyorum, Bölüm §7.21.2 Akışlar diyor ki: Bir metin akışı, satırlardan oluşan sıralı bir karakter dizisidir, her satır sıfır veya daha fazla karakter artı bir sonlandırmadan oluşur.
-çizgi

ancak pencerelerin bir çizgi ayırıcısı kullandığı belgelenmiştir?
barlop

2

Vim oraya kendin koymadığın hiçbir şey eklemiyor.

Bir "satır" karakteridir değil "yeni hat" ve her iki örnekler gayet normal şunlardır:

  • ilkinde, dosya yalnızca bir satır içerir, böylece bir "yeni satır" karakteri alırsınız,
  • ikincisinde, dosya iki satır içerir, böylece iki "yeni satır" karakteri alırsınız.

2
Yeni satırı ekler. Aşağıdaki gibi test edin: printf "\x41" > /tmp/test.txtardından yalnızca tek bir 'A' karakteri ile kontrol edin xxd /tmp/test.txt. Şimdi vim /tmp/test.txt<ENTER>:wq. İki bayta sahip dosyayı görmek için tekrar kontrol edin: 'A \ n'.
Ruslan

Satırlar yeni satır karakteri ile biter. Bir satırınız var, böylece bir satırsonu karakteriniz var.
romainl

Bundan sonra printfiyi biçimlendirilmiş bir “çizgim” yoktu. Vim'den sonra bir tane var. Yani, oraya koymadığım bir şey ekliyor.
Ruslan

Ne printfsen eklemek sürece bir çizgi değildir \n. Bir metin editörü, varsayılan olarak hatları ile Vim fırsatlar, ve olmak herhangi dosyada eklemek metin olduğunu siz açık bir şekilde bunu için Vim anlatmak sürece çok az bir çizgi, en, üzerinde.
romainl

2

Sonlandırılmamış metin dosyaları birçok nedenden dolayı kötüdür; burada henüz görmediğim bir tane var:

Sondaki yeni satır içermeyen metin dosyalarının kabul edilebilir olduğu varsayımsal bir dünyada, 0 satır içeren bir dosya ile 1 boş satır içeren bir dosya arasında hiçbir fark yoktur. Her ikisi de 0 baytlık bir dosya ile temsil edilir.

Bir dosyada kaç satır olduğuna karar verememek kötü olur.


Unix olmayan sistemlerde metin dosyaları sıfır veya daha fazla tam satır ve tamamlanmamış sıfır veya daha fazla karakter içerir. Boş bir dosyada boş satır yok; sıfır tam satır ve kısmi sıfır karakter içerir. Belirsizlik nerede?
supercat

Bu "kısmi çizgi" hoş olmayan bir kavramdır. Dosya sonu dışında bir yere sahip olamazsınız ve "kısmi satır" içermeyen bir dosya oluşturamazsınız . Dosya birleştirmesine daha fazla kırılma ekler - dosyalar arasında yeni bir satır ekleseniz bile, orijinal dosya çiftine semantik olarak eşdeğer olmayan bir şeyle karşılaşırsınız (çünkü 2 dosyada 2 kısmi satırınız vardı ve bunlardan biri bir şey haline geldi) Farklı bir teklif.

Dosyaların birleştirilmesi, ilk satırın sonunda herhangi bir kısmi satırın bir sonraki dosyaya eklenmesine neden olacağı gerçeği, her iki dosyanın da tam satır içerdiği durumlarda genellikle etkilidir (bazen tam satır içermeyen dosyaları birleştirmek yararlı olabilir ), ama ne olduğu. Unix, kısmi satırlarla biten metin dosyalarının oluşturulmasını yasaklamaz ve bu tür dosyaları birleştirmenin MSDOS'taki gibi davranacağına inanıyorum. Bence fark birçok DOS tabanlı editör tarihsel bir dosya yükleme ve hemen kaydetme yeni bir dosya vermelidir ...
supercat

... eskisiyle biraz aynı (PC-Write'ın ilk sürümlerinin kayıtlı kullanıcılarına, yürütülebilir dosyanın bir kopyasını açmak, üzerine yazma moduna geçmek, belirli bir dizeyi bulmak ve onların yerine koymak için talimat verildi. seri numarası!). Dosyaları kaydederken yeni satırlarla bitmeye zorlamak bu kısıtlamayı ihlal eder.
supercat

2

Vim 8.0 şimdi bu fixeolseçeneği sunuyor. Özellikle şunları yaparsanız:

:set nofixeol

Sonra Vim olmaz dosya zaten bir tane olmasaydı nihai satırın sonunda eğik satır karakteri ekleyin.

Bu bir filetype eklentisinde, hatta muhtemelen sizin .vimrc.

(Bu, :set binaryyalnızca son satır sonu karakterini etkilediğinden, ancak binaryikili bir dosyayı düzenlemediğiniz sürece muhtemelen istemediğiniz diğer davranışları da değiştirdiği için bir gelişmedir .)

Yeni oluşturulan bir dosya varsayılan olarak yine de bir satır sonu karakterine sahip olacaktır. Bunu ek olarak (ve zaten son satırsonu olan bir dosyayı bir taneye sahip olmayacak şekilde) değiştirebilirsiniz:

:set noeol

Bu, değiştirmek istediğiniz her dosya için özel olarak ayarlanmalıdır: bir dosyayı arabelleğe yüklemek her zaman eoldosyanın geçerli durumuna uyacak şekilde ayarlanır .


1

'J' komutunu kullanarak tüm satırları tek bir satırda birleştirebilirsiniz.

Son satırdaki LF veya CRLF'yi de kaldırmak istiyorsanız vi'de aşağıdakileri yapın.

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
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.