2016-04-12 17 views
0

Vim in javascript'te kullanılmak üzere html kodunu bir dize ile birleştirilmiş forma biçimlendirmek için bu kod satırını bir kitaptan aldım. '1' ve '2 sayılarının neyi temsil ettiğini ve soru işaretlerinin nekahatler sonunda olduğunu anlayamıyorum. Ben % s/foo/bar/g gibi ikameler görmek için kullanılır, böylece eğik çizgi yokluğu beni biraz karıştırır. Özetle, '' ve '', dolar işaretinden sonra ve satırbaşı dönüşünden önce gelen soru işaretlerini ve neden eğik çizgileri kullanılmadığını anlamıyorum.VIM: bu ikameyi tam olarak anlayamıyorum

vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?<CR> 

cevap

0

Diğer yanıtlarda da belirtildiği gibi, / ayırıcı başka bir karakterle değiştirilebilir: komutta birçok eğik çizgi kullanıldığında daha açık olabilir; Bu konuda bir soru görmek, https://stackoverflow.com/a/36568901/3271687.

\1, \2, \n... eşleşme modeli kullanılan N inci alt ifadesi. Bir alt ifade, \( ve \) ile tanımlanır. sizin örnekte Yani:

:s?^\(\s*\)\(.*\)\s*$? \1 + '\2'? 
       \s* --> note that this part can't be reached, it's useless 

, \1 \(\s*\) bulunan boşluklar tarafından değiştirilir ve \2 \(.*\) bulunan tüm karakter (çizginin tam dinlenme) ile değiştirilir.

1

Düz eğik çizgiler tipik ayırıcı olarak kullanılır, ancak yerine komut bu, herhangi bir değiştirilmelidir sağlayan ayırıcı olarak 's' sonraki ilk karakterini kullanır. Yazar, tüm kesiklerin kafa karıştırıcı olabileceğini düşündü, bu yüzden onu '?' Olarak değiştirdi. Daha geleneksel ileri olarak görünecektir komut eğik budur:

:s/^\(\s*\)\(.*\)\s*$/ \1 + '\2'/<CR> 

Yani yukarıda ileri arama hiçbir karakter herhangi bir sayıda ardından boşluk herhangi bir miktar ile başlayan satırları bulma ve herhangi bir miktar, anlamına gelecektir boşluk ve sonra <space><the first whitespace><space>+<space>'<the other characters>' için yerine. Sonunda herhangi bir boşluk bırakmaya niyetlendiğimi düşünüyorum, fakat testlerimde bunu yapmıyor, çünkü. * Her şeyi çizginin sonuna kadar eşleştirecek.

+0

Aslında, ben test ettim ve '?' bir yedek komutta geriye doğru arama yapmaz. Ayırıcı olarak farklı bir karakter kullanıyor. Güncelleniyor ... – Daniel

+0

Teşekkürler. \ 1 ve \ 2 ne yapar? –

+0

@DarkNawg \ (ve \) arasındaki karakterler bir grup oluşturur ve bu ifadeyle eşleşen her şey daha sonra yedek dizede daha sonra kullanılabilir. \ 1 ve \ 2, birinci ve ikinci grupların olduğunu belirtmek için kullanılır. Yani, ilk grupta, her ne eşleştiysek * (herhangi bir miktar boşluk) ve ikincisinde ne eşleştiyse var. * (Herhangi bir karakterin miktarı). Daha fazla bilgi için buraya bakın: http://vimregex.com/#backreferences – Daniel