2009-11-17 6 views
2

Я ищу способ выделить блок кода, находящийся под курсором в обычном режиме.Выделите блок кода под курсором?

Это будет работать как с настройками конфигурации set showmatch, но обнаружение и выделение будут растягиваться по всему блоку.

Любой способ достичь этой функциональности либо с помощью опций конфигурации, либо (предпочтительно существующего) скрипта?

ответ

1

Короткий ответ: нет.

Долгий ответ: есть способы достичь этого, но вам придется пожертвовать множеством других довольно важных функций подсветки.

Существует, конечно, нет способа сделать это с помощью простого варианта. Проблема, с которой вы столкнетесь, заключается в том, что 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 
+0

Хорошо рецензию, я получаю идею, даже если ваш код не совсем работает с моим стилем (делает JS). – julien

+0

Ага: Я не мог решить это из вашего вопроса. Я считаю, что js использует фигурные скобки, поэтому, если вы не возражаете против того, что только выделяете внутренние блоки, когда находитесь внутри одного, вы, вероятно, можете просто избавиться от '^' и '$' в четырех строках поиска ... возможно хотя, учитывая проблемы, которые я выделил (каламбур). – DrAl

+0

Это очень хорошее усилие. Интересно, могут ли быть использованы варианты vimB (C) или vab (lispers) vim. – progo

Смежные вопросы