Eklerken otomatik olarak bir kapanış "veya" ekleyin, ancak yalnızca imleç zaten bir dizenin içinde değilse


14

Ben vimrcaçılış olanları girerken otomatik olarak yakın parantez ve parantez girmek için eşlemeler tanımladım inoremap ( ()<esc>i.

Ben için aynı şeyi istiyorum "ve 'ancak imleç şu anda bir dize içinde değil yalnızca - Bir dizge içinde olarak ', muhtemelen bir kesme işareti yerine bir dize sınırlayıcısı olduğunu. Bunu nasıl yapabilirim?

Yanıtlar:


5

Bir yaklaşım, syn*işlevleri kullanmak olabilir . Gibi bir şey:

fun! Qtx(qt)
    let x = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "name")
    if x != "String" && x != "Comment" && x != "Constant"
        return a:qt . a:qt
    endif
    return a:qt
endfun


inoremap <silent> <expr> ' Qtx("'")
inoremap <silent> <expr> " Qtx('"')

Fikir, imleç konumundaki tampon sözdiziminden yararlanmaktır. Bu belki daha iyi çözülebilir. Ama umarım bir başlangıçtır.


İşlev adının ardındaki mantık nedir Qtx?
Martin Tournoij

@Carpetsmoker: Quouotix eXitus'u Sonlandırır.
Runium

2

Söylendiği gibi, sözdizimi bağlamını kontrol etmeniz gerekir. Eski lh-parantez API'si bu amaç için işlevler sağlar: Map*Context()işlevler . O zamandan beri :Bracket, bağlamı (dizeler veya yorumlar) dikkate alacak olan parantez tanımları kapsüllenmiştir .

Varsayılan olarak, bağlama duyarlı eşlemeler aşağıdaki gibi olağan parantez çiftleri için tanımlanır:

  :Brackets! ( )
  :Brackets! [ ] -visual=0
  :Brackets! [ ] -insert=0 -trigger=<leader>[

  :Brackets! " " -visual=0 -insert=1
  :Brackets! " " -visual=1 -insert=0 -trigger=""
  :Brackets! ' ' -visual=0 -insert=1 -but=function('lh#ft#is_text')
  :Brackets! ' ' -visual=1 -insert=0 -trigger=''

  :Brackets! < > -visual=1 -insert=0 -trigger=<localleader><

  :Brackets! { }
  :Brackets! { } -visual=1 -insert=0 -nl -trigger=<leader>{
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.