Прежде всего, ваша аббревиатура не вставляет то, что вы говорите, она делает в вашем примере; это ведет себя довольно странно для меня, даже если у меня определен 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