В lh-скобках , я частично делаю это, когда открывающиеся фигурные скобки набираются в той же строке, что и декларация struct
, class
, union
или enum
.
Это сделано благодаря двум вещам: сначала он позволяет зарегистрировать хук для каждой части пары, а затем анализируется хук, который я зарегистрировал по умолчанию.
" in after/ftplugin/c/c_brackets.vim
" NB: that's how bracket mappings are defined for insert, normal and visual modes
:Brackets { } -default -visual=0 -insert=1
\ -open=function('lh#cpp#brackets#curly_open')
\ -clos=function('lh#cpp#brackets#curly_close')
" in autoload/lh/cpp/brackets.vim
function! lh#cpp#brackets#curly_open() abort
let c = col('.') - 1
let l = getline('.')
let l = strpart(l, 0, c)
let close = l =~ 'struct\|class\|enum\|union' ? '};' : '}'
if lh#brackets#usemarks()
return '{!cursorhere!'.close.'!mark!'
else
return '{!cursorhere!'.close
endif
endfunction
Как вы Можно увидеть анализ довольно просто c. Это может быть улучшено.
Теперь, хотя ваша идея обоснована для вашего примера, на самом деле это довольно сложно сделать правильно. Я вижу несколько других ситуаций, которые нелегко отличить guish от Vim:
- N массивов измерений (
int t[2][2] = { {1,2}, {3,4}};
) - C ++ 11 единорог синтаксис инициализации (
std::complex<double> i{0,1};
) - C ++ 11 лямбда-определений (
auto pred = [](int i){ return i < 42};
) - C ++ 11 прямое лямбда-использование (
auto it = std::find_if(beg, end, [](int i){ return i < 42});
) - встроенные искусственные прицелы
Вот почему я не трачу время на расширение этой функции. Для анализа текущего контекста требуется нечто большее, чем просто регулярные выражения.
PS: Это можно легко переопределить, вызвав :Brackets
в файле ~/.vim/after/ftplugin/c_brackets.vim
, где вы определяете свой собственный хук для {
.