As abreviações substituem os comentários e o texto citado

0

Eu tenho a seguinte abreviação em VIM:

iab for for<Space>(<Space>{{<Esc>kA<Left><Left><Left><Left><C-R>=Eatchar('\s')<CR>

Isso substitui muito bem o for pelo seguinte texto:

for (  ) {

}

No entanto, gostaria que essa abreviação funcionasse apenas em código, não em comentários ou em strings com aspas simples ou duplas. Como essa restrição pode ser cumprida? Obrigado!

    
por dotancohen 14.10.2012 / 16:48

2 respostas

1
Em primeiro lugar, sua abreviação não insere o que você diz no seu exemplo; ele se comporta de maneira bastante estranha para mim, embora eu tenha Eatchar () definido. Meu melhor palpite é que ele está provocando outras abreviações / mapeamentos, e vou assumir que devo deixar isso em paz.

Minha solução é vincular-se ao mecanismo de sintaxe, o que significa que somente funcionará se você tiver o realce de sintaxe ativado. Tente isto:

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
    
por 15.10.2012 / 00:40
1

Você pode usar autocmd para impedir que a abreviação funcione em arquivos Python:

if has("autocmd")
  autocmd FileType php,c,java iab for for<Space>...<CR>
endif

Eu não acho que é possível impedir que ele trabalhe dentro de uma seção de texto particular, como strings entre aspas duplas ou simples.

    
por 14.10.2012 / 17:33

Tags