Сложите препроцессор C в VIM - PullRequest
6 голосов
/ 09 марта 2010

Можно ли сложить препроцессор С в VIM. Например:

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

Я хочу сложить так, чтобы оно стало:

 +--  4 lines: #if defined(DEBUG)---

Ответы [ 2 ]

1 голос
/ 09 марта 2010

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

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

    syn region cMyFold start="#if" end="#end" transparent fold contains=ALL
    " OR
    syn region cMyFold start="#if" end="#end" transparent fold contains=ALLBUT,cCppSkip
    " OR something else along those lines
    " Use syntax folding
    set foldmethod=syntax
    

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

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

    " This function customises what is displayed on the folded line:
    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
    " This is the line that works the magic
    set foldmarker=#if,#endif
    set foldmethod=marker
    
0 голосов
/ 15 декабря 2017

Я смог заставить его работать по своему вкусу, добавив эти строки в файл синтаксиса c.vim:

syn match   cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>"

+syn region cCppIfAnyWrapper  start="^\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\s\+.*\s*\($\|//\|/\*\|&\)" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cCppInIfAny,cCppInElseAny fold
+syn region cCppInIfAny  start="^\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\s\+.*\s*\($\|//\|/\*\|&\)" end="^\s*\(%:\|#\)\s*\(else\s*\|elif\s\+\|endif\)\>"me=s-1 containedin=cCppIfAnyWrapper contains=TOP
+syn region cCppInElseAny  start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 containedin=cCppIfAnyWrapper contains=TOP

if !exists("c_no_if0")
...