Короткий ответ: нет.
Долгий ответ: есть способы достичь этого, но вам придется пожертвовать множеством других довольно важных функций подсветки.
Существует, конечно, нет способа сделать это с помощью простого варианта. Проблема, с которой вы столкнетесь, заключается в том, что Vim не позволяет перекрывать области, поэтому, если у вас установлено rainbow.vim или что-то еще, что делает регион в области вашего блока, он потерян. Также сложно (хотя я бы приветствовал любые исправления), чтобы иметь несколько выделенных групп, так что он устанавливает цвет фона и другой, который устанавливает передний план. Это очень важно, как вы увидите.
Однако, если вы хотите поиграть, прочитайте дальше.
Я делаю предположение здесь, что вы используете код C в том же стиле кодирования, как и я, но это может быть легко изменен ...
Вот простая функция, которая должна помочь вам показать, что участие :
function! HighlightBlock()
" Search backwards and forwards for an opening and closing brace
" at the start of the line (change this according to your coding
" style or how you define a block).
let startmatch = search('^{', 'bcnW')
let endmatch = search('^}', 'cnW')
" Search in the other direction for each to catch the situation
" where we're in between blocks.
let checkstart = search('^{', 'cnW')
let checkend = search('^}', 'bcnW')
" Clear BlockRegion if it exists already (requires Vim 7 probably)
try
syn clear BlockRegion
catch
endtry
" If we're not in a block, give up
if ((startmatch < checkstart) && (endmatch > checkstart))
\ || ((startmatch < checkend) && (endmatch > checkend))
\ || (startmatch == 0)
\ || (endmatch == 0)
return
endif
" Create a new syntax region called "BlockRegion" that starts
" on the specific lines found above (see :help \%l for more
" information).
exec 'syn region BlockRegion'
\ 'start=' . '"\%' . startmatch . 'l"'
\ 'end=' . '"\%' . (endmatch+1) . 'l"'
" Add "contains=ALL" onto the end for a different way of
" highlighting, but it's not much better...
" Define the colours - not an ideal place to do this,
" but good for an example
if &background == 'light'
hi default BlockRegion guibg='#AAAAAA'
else
hi default BlockRegion guibg='#333333'
endif
endfunction
Чтобы использовать эту функцию, отправьте ее откуда-нибудь, а затем создайте автозапуск, чтобы вызвать его, когда что-то изменится, например
au CursorMoved *.c call HighlightBlock()
Смотрите следующее для некоторых автокоманд вы можете рассмотреть:
:help CursorHold
:help CursorHoldI
:help CursorMoved
:help CursorMovedI
Хорошо рецензию, я получаю идею, даже если ваш код не совсем работает с моим стилем (делает JS). – julien
Ага: Я не мог решить это из вашего вопроса. Я считаю, что js использует фигурные скобки, поэтому, если вы не возражаете против того, что только выделяете внутренние блоки, когда находитесь внутри одного, вы, вероятно, можете просто избавиться от '^' и '$' в четырех строках поиска ... возможно хотя, учитывая проблемы, которые я выделил (каламбур). – DrAl
Это очень хорошее усилие. Интересно, могут ли быть использованы варианты vimB (C) или vab (lispers) vim. – progo