Aşağıdaki metin varsa:
foo
bar
Görsel olarak seçiyorum ve kopyalıyorum.
Metin şimdi adlandırılmamış kayıtta saklanır "
ve içeriği (çıktısı :reg "
):
"" foo^Jbar^J
Bu grafiğe göre , ^J
bir Satır Beslemesi için düzeltme işareti olduğu anlaşılıyor .
Ben a
yazarak kayıttaki adsız kayıt çoğaltmak istiyorsanız : :let @a = @"
İşte içeriği (çıktı :reg a
):
"a foo^Jbar^J
Değişmedi.
Şimdi yazarak arama kaydında çoğaltırsanız :let @/ = @"
, işte içeriği (çıktısı :reg /
):
"/ foo^@bar^@
Önceki grafiğe göre, ^@
Null karakter için işaret gösterimi gibi görünüyor .
Neden Satır Besleme otomatik olarak arama kaydının içinde Boş karaktere dönüştürülür (ancak a
kayıt değil )?
Adsız kaydı komut satırına (veya sonra bir arama içine /
) eklersem :<C-R>"
, yazarak şunu eklersiniz:
:foo^Mbar^M
Yine, son grafiğe göre, ^M
bir Taşıt Dönüşü için caret gösterimi gibi görünüyor.
Bir Satır Beslemesi neden otomatik olarak komut satırında Satır Başı'na dönüştürülür?
Düzenle :
Genellikle aşağıdakileri yazarak bir gerçek kontrol karakteri ekleyebilirsiniz:
<C-V><C-{character in caret notation}>
Örneğin, <C-R>
yazarak bir değişmez değer ekleyebilirsiniz <C-V><C-R>
.
Görünüşe göre herhangi bir kontrol karakteri için yapabilirsiniz.
Ancak ben bir arabellek içine veya komut satırına değişmez bir LF ekleyemediğimi fark ettim, çünkü ben yazarsanız: <C-V><C-J>
ekler ^@
, yerine boş bir karakter ekler ^J
.
Aynı nedenden ötürü bir LF, arama yazmacı içinde NUL değerine dönüştürülür mü?
Düzenleme 2 :
İçinde :h key-notation
, bunu okuyabiliriz:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
stored as 10
İlk satırda ve bölüm used for <Nul>
ikinci satırda bir LF ve NUL arasındaki örtüşme çeşit var olduğunu gösterebilir ve aynı şey olarak yorumlanabilir. Sonra önceki komutu yürütülürken, çünkü Ama, aynı şey olamaz :let @/ = @"
ben yazarsanız, n
2 hatlarının sonraki geçtiği almak için normal modda foo
ve bar
yerine olumlu maçı alma, aşağıdaki hata mesajım var:
E486: Pattern not found: foo^@bar^@
Bu bağlantının yanı sıra , bir NUL değerinin bir dizenin sonunu, LF ise bir metin dosyasındaki satırın sonunu ifade ettiğini açıklamaktadır.
Ve bir NUL stored as 10
yardımın söylediği gibi, bir LF ile aynı kod ise, Vim 2 arasındaki farkı nasıl oluşturabilir?
Düzenleme 3 :
Belki bir LF ve bir NUL 10
yardımda belirtildiği gibi aynı ondalık kodla kodlanmıştır . Ve Vim bağlam sayesinde 2 arasındaki farkı yaratıyor. Ondalık kodu 10
arabellekte veya herhangi bir kayıtta bulunan, arama ve komut kayıtları dışında bir karakterle karşılaşırsa, karakteri LF olarak yorumlar.
Ancak arama kaydında ( :reg /
) onu bir NUL olarak yorumlar, çünkü bir arama bağlamında Vim, yalnızca bir kavramın end of line in a file
mantıklı olmadığı bir dizeyi arar, çünkü bir dize bir dosya değildir ( atomu \n
aranan bir desende kullanmaya devam ediyor , ama belki de bu normal ifade motorunun sadece bir özelliği?). Böylece otomatik 10
olarak bir NUL olarak yorumlanır çünkü en yakın kavramdır ( end of string
≈ end of line
).
Aynı şekilde, komut satırı / komut registerında ( :reg :
) kodu 10
CR olarak yorumlar , çünkü burada kavramı end of line in a file
mantıklı değildir. En yakın kavramdır end of command
Vim yorumladığını böylece 10
vurma, çünkü bir CR olarak Enter
bir komut çalıştırmak / sona yoludur ve CR isabet aynıdır Enter
olduğunda sizi bir edebi biri insert beri <C-V><Enter>
, ^M
görüntülenir.
Belki de kodu olan karakterin 10
bağlama göre değişmesi:
- arabellekte satır sonu (
^J
) - aramadaki dizenin sonu (
^@
) - komut satırında komutun sonu (
^M
)
someFunction(arg1, "")
arg 2 ""
yani "tam anlamıyla hiçbir şey olmayan tırnaklar arasındaki öğe - bir" boş ". NULL görünebilir, çünkü" dize sınırlandı gibi temel C uygulaması tarafından eklenmiştir ". bunu nasıl kontrol edeceğinizi - ancak olası bir neden olarak akla geliyor.
\r
ve \n
farklılığa bakın:substitute
.
NULL
karakterlerin ortaya çıkması , dizeleri işleyen temel C işlevinden kaynaklanır. Bu C dizeleri nasıl işlediğini açıklaması sen bağlantılı olduğu dahili C dizelerle sınırlayan açıklıyorNULL
.NULL
metinlerde nadiren bu amaç için iyi bir karakter olmasını sağlar. Bunun bir sonucu olarak, C programı (vim) dahili bir C fonksiyonuna "boş" bir dizge