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?

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.


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>{
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.