У меня есть следующее удобное сокращение в VIM:

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

Это прекрасно заменяет for со следующим текстом:

for (  ) {

}

Однако я хотел бы, чтобы эта аббревиатура работала только в коде, а не в комментариях или в строках с одинарными или двойными кавычками. Как это ограничение может быть выполнено? Спасибо!

2 ответа2

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
1

Вы можете использовать autocmd для предотвращения работы аббревиатуры в файлах Python:

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

Я не думаю, что возможно предотвратить его работу только внутри определенного текстового раздела, такого как строки в двойных или одинарных кавычках.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .