我已经在我的vimrc中定义了映射,以在我使用inoremap ( ()<esc>i输入打开括号和大括号时自动输入它们。

我想对"'做相同的操作,但仅当光标当前不在字符串内-因为在字符串'内可能是撇号而不是字符串定界符。我该怎么办?

#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背后的原理是什么?

–马丁·图尔诺伊(Martin Tournoij)
2015年2月19日在20:47



@ Carpetsmoker:Quouotix终止eXitus。

– Runium
15年2月20日在7:27

#2 楼

就像已经说过的那样,您必须检查语法上下文。旧的lh-brackets API提供了用于此目的的函数: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>{