カーソルが既に文字列内にない場合にのみ、挿入時に自動的に閉じ「または」を追加します


14

vimrc開き括弧を入力すると、閉じ括弧と中括弧を自動的に入力するマッピングを定義しましたinoremap ( ()<esc>i

私は同じことをやってみたい"'、しかし、カーソルが現在の文字列内にない場合にのみ、 -文字列の中のように'、おそらくアポストロフィではなく、ストリング区切り文字です。これどうやってするの?

回答:


5

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

アイデアは、カーソル位置のバッファの構文を利用することです。これはおそらくよりよく解決できます。しかし、うまくいけば始まりです。


関数名の背後にある理論的根拠は何Qtxですか?
マーティントゥールノイジ

@Carpetsmoker:QuouotixはeXitusを終了します。
ルニウム

2

既に述べたように、構文コンテキストを確認する必要があります。古い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>{
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.