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('"')
想法是利用游标位置的缓冲区语法。这也许可以更好地解决。但希望是一个开始。
#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>{
评论
函数名称Qtx背后的原理是什么?
–马丁·图尔诺伊(Martin Tournoij)
2015年2月19日在20:47
@ Carpetsmoker:Quouotix终止eXitus。
– Runium
15年2月20日在7:27