2011-05-12 16 views
14

Aşağıdaki örnekte söz dizimini açıklayabilir misiniz, yoksa tek tek sembollerin daha genel olarak dikkatli bir şekilde açıklandığı bir bağlantı gönderir misiniz? Vim'deki yardım tamamlanmamış ne demektir?Foldexpr sözdizimini açıklama

  1. Dizeler, çift tırnak yerine tek tırnak işaretleri arasında mı? Ya da ben seçebilirim?
  2. Açıklama işareti (?) Nedir? =~'\\S'?'<1':1
  3. 'string1'string2'string3 ifadesi ne demektir?
  4. :1 ne demektir?

size

cevap

31

sayı v:lnum küresel depolanır hattın katlama seviyesini belirten bir tamsayı sayı veya belirli formatının dizeye veren bir ifade içeren gerekiyordu foldexpr seçenek ederiz değerlendirme anında değişken.

Bu foldexpr örneğinin mantığını yukarıdan aşağıya doğru izleyelim. Üst düzeyde

getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1 

, bütün ekspresyon üçlü bir operatör A ? B : C olup. A sıfır olmayan olarak değerlendirilir ve C ifadesinin değeri aksi ( :help expr1 bakınız) operatör sonucu B ifade edilmesidir. Bu durumda, B '<1' değişmez dize ve C ( seviye belirticileri :help fold-expr bkz kat olarak '<1' ve 1 anlamını) numarası 1 olup. akım (
getline(v:lnum) =~ '^\\s*$' && getline(v:lnum+1) =~ '\\S' 

Hem koşullar

getline(N) =~ S 

getline İşlev hattının içeriğini geri aynı biçime sahiptir:

A sentezleme && operatör tarafından birleştirilmiş iki koşulları oluşur arabelleği, argüman olarak iletilen satır numarasıyla başvuruda bulunur (bkz. ). foldexpr değerlendirildiğinde, v:lnum değişkeni, katlama düzeyinin hesaplanacağı olmalıdır. , sol işleneninin sağ dize işlenen tarafından verilen düzenli ifadeyle eşleşir ve boolean değerini (expr4 bölümün sonuna yakın, özellikle, :help expr4 bakınız) döndürür olup olmadığını

=~ operatör testleri. Böylece A durum '^\\s*$' deseni ile eşleşen v:lnum inci hattı ve hat yanındaki v:lnum inci bir '\\S' deseni ile eşleşen kontrol etmek için tasarlanmıştır.

Normal ifade desenleri, ifadede dize değişmezleri olarak belirtilmiştir. Dize değişmezleri iki sözdizimsel biçime sahiptir ve çift veya tek tırnak işareti kullanılarak alıntılanan olabilir. Bu formları arasındaki fark, çift tırnaklı dizgenin ters eğik çizgi ile başlayan çeşitli kontrol dizilerini içerebilmesidir. Bu sekanslar, kolaylıkla yazılmayan özel karakterlerinin belirtilmesine izin verir (örneğin çift tırnak, örneğin; \" yazar). Diğer yandan tek tırnaklı dizgiler, diğer taraftan, , bu ters eğik sekanslara izin vermez. ( tek ve çift tırnaklı dizeleri tam açıklaması için :help expr-string ve :help literal-string bkz.)

çift tırnaklı dizeleri sözdizimi dikkate değer sonucu ters eğik çizgi sembolü kendisi kaçtı gerektiğini (\\) 'dir. Bu nedenle, tekil alıntı dizeleri, genellikle düzenli ifadeleri belirtmek için kullanılır: sürekli olarak istenen ters eğik çizgi sembolünden kurtulmak için gerek yoktur, . Bununla birlikte, sayılı belgede, yukarıdaki numaralı desenlerde ters bölenlerin yine de kaçtıldığını görebilirsiniz. Bunun nedeni, bazı komutların (ters eğik çizgi dahil), Ex komutlarında (:set, tabii ki dahil) özel anlamı vardır. Eğer isabet zaman (:help cmdline-special bakınız) komutunu Vim önce bazı karakter dizileri yorumlamaktadır

:set foldexpr=... 

başlatmak için girin. Özellikle, \\ dizisi, tek bir ters eğik çizgi olarak olarak işlem görür. , Satır numarası v:lnum yalnızca boş karakterleri içerip içermediğini ifade testleri sırasında hattı yanındaki birlikte (numara v:lnum+1) Bütün modülleri

bir boş olmayan karakter (:help pattern kavramak örnekbiçimlerin anlamı bakınız sahip). Eğer öyleyse, ifade '<1' dizgesini değerlendirir, aksi takdirde 1 numaralı sayıyı değerlendirir.

+2

Harika bir açıklama için teşekkür ederiz. – xralf

+0

Vay be .. gördüğüm en iyi ve ayrıntılı cevaplardan biri. Harika iş. – Cricrazy