注释和引用文本中的缩写优先

注释和引用文本中的缩写优先

我在 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

我认为不可能阻止它在特定文本部分(如双引号或单引号字符串)内工作。

相关内容