我在 VIM 中有以下方便的缩写:
iab for for<Space>(<Space>{{<Esc>kA<Left><Left><Left><Left><C-R>=Eatchar('\s')<CR>
这很好地替换了for
以下文本:
for ( ) {
}
但是,我希望这个缩写只在代码中起作用,而不是在注释或单引号或双引号字符串中起作用。如何实现这一约束?谢谢!
答案1
首先,您的缩写并没有插入您在示例中所说的内容;尽管我确实定义了 Eatchar(),但它的行为对我来说相当奇怪。我最好的猜测是它触发了其他缩写/映射,我假设我应该不管它。
我的解决方案是与语法引擎相结合,这意味着它将仅有的如果你启用了语法高亮,那么这个功能就可以正常工作。试试这个:
iab <buffer> <expr> for <SID>CodeInsert("for", "for<Space>(<Space>{{<Esc>kA<Left><Left><Left><Left><C-R>=Eatchar('\s')<CR>")
function! s:CodeInsert(abbr,str)
let syn = synIDattr(synIDtrans(synID(line('.'), col('.') - 1, 1)), 'name')
if syn ==? 'comment' || syn ==? 'constant'
return a:abbr
else
return a:str
endif
endfunction
答案2
您可以使用autocmd
它来防止缩写在 Python 文件中起作用:
if has("autocmd")
autocmd FileType php,c,java iab for for<Space>...<CR>
endif
我认为不可能阻止它在特定文本部分(如双引号或单引号字符串)内工作。