Secara otomatis menambahkan penutup "atau 'saat memasukkan satu, tetapi hanya jika kursor belum ada di dalam string

14

Saya telah menetapkan pemetaan di saya vimrcuntuk secara otomatis memasukkan kurung tutup dan kawat gigi ketika saya memasukkan yang membuka dengan inoremap ( ()<esc>i.

Saya ingin melakukan hal yang sama untuk "dan ', tetapi hanya ketika kursor saat ini tidak berada di dalam string - seperti di dalam string 'mungkin merupakan tanda kutip daripada pembatas string. Bagaimana saya bisa melakukan ini?

rlms
sumber

Jawaban:

5

Salah satu pendekatan mungkin menggunakan syn*fungsi. Sesuatu seperti:

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('"')

Ide adalah untuk mengambil keuntungan dari sintaks untuk buffer pada posisi kursor. Ini mungkin bisa diselesaikan dengan lebih baik. Tapi semoga awal.

Runium
sumber
Apa alasan di balik nama fungsi Qtx?
Martin Tournoij
@Carpetsmoker: Quouotix Menghentikan eXitus.
Runium
2

Seperti yang telah dikatakan, Anda harus memeriksa konteks sintaksis. Lama lh-kurung API menyediakan fungsi untuk tujuan itu: Map*Context()fungsi . Sejak itu definisi tanda kurung telah dirangkum di :Bracketmana akan mempertimbangkan konteks (string atau komentar).

Secara default pemetaan sadar pemetaan didefinisikan untuk semua pasangan kurung biasa seperti ini:

  :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>{
Luc Hermitte
sumber