插入时自动添加结束符“或”,但前提是光标不在字符串中


14

我已经在自己中定义了映射,vimrc以在使用输入括号时自动输入括号和括号inoremap ( ()<esc>i

我想对"和进行相同的操作',但仅当光标当前不在字符串内时-因为字符串'内可能是撇号而不是字符串定界符。我怎样才能做到这一点?

Answers:


5

一种方法可能是使用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。
Runium

2

如前所述,您必须检查语法上下文。旧的lh-brackets API为此提供了功能:Map*Context()functions。从那时起,方括号定义被封装,: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>{
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.