回答:
1つのアプローチは、syn*関数を使用することです。何かのようなもの:
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('"')
アイデアは、カーソル位置のバッファの構文を利用することです。これはおそらくよりよく解決できます。しかし、うまくいけば始まりです。
既に述べたように、構文コンテキストを確認する必要があります。古いlh-brackets APIは、そのための関数、functionsを提供しMap*Context()ます。それ以来、括弧の定義はカプセル化され:Bracket、コンテキスト(文字列またはコメント)が考慮されます。
デフォルトでは、次のようなすべての通常の括弧ペアに対してコンテキスト認識マッピングが定義されます。
  :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>{
Qtxですか?