Сверните препроцессор C в VIM

Действительно ли возможно свернуть препроцессор C в VIM. Например:

#if defined(DEBUG)
  //some block of code
  myfunction();
#endif

Я хочу свернуть его так, чтобы это стало:

 +--  4 lines: #if defined(DEBUG)---
6
задан HaskellElephant 25 December 2011 в 22:59
поделиться

1 ответ

Это нетривиально из-за ограничений механизма подсветки Vim: он не может очень хорошо выделять перекрывающиеся области. У вас есть два варианта, как мне кажется:

  1. Использовать подсветку синтаксиса и много работать с опцией contains=, пока это не сработает для вас (возможно, это будет зависеть от некоторых плагинов):

    syn region cMyFold start="#if" end="#end" transparent fold contains=ALL
    " ИЛИ
    syn region cMyFold start="#if" end="#end" transparent fold contains=ALLBUT,cCppSkip
    " ИЛИ что-то еще в этом духе
    " Используйте синтаксическую складку
    set foldmethod=syntax
    

    Это, вероятно, потребует много возни, и вы можете никогда не добиться удовлетворительной работы. Поместите это в vimfiles/after/syntax/c.vim или ~/.vim/after/syntax/c.vim.

  2. Используйте маркеры сгиба. Это сработает, но вы не сможете делать складки на скобках или на чем-либо еще, что вам может понравиться. Поместите это в ~/.vim/after/ftplugin/c.vim (или эквивалентный путь vimfiles в Windows):

    " Эта функция настраивает то, что будет отображаться на свернутой строке:
    set foldtext=MyFoldText()
    function! MyFoldText()
     let line = getline(v:foldstart)
     let linecount = v:foldend + 1 - v:foldstart
     let plural = ""
     if linecount != 1
     let plural = "s"
     endif
     let foldtext = printf(" +%s %d line%s: %s", v:folddashes, linecount, plural, line)
     return foldtext
    endfunction
    " Вот строка, которая творит волшебство
    set foldmarker=#if,#endif
    set foldmethod=marker
    
1
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: