Domanda
E 'possibile piegare C preprocessore in VIM. Ad esempio:
#if defined(DEBUG)
//some block of code
myfunction();
#endif
Voglio piegarlo in modo che diventi:
+-- 4 lines: #if defined(DEBUG)---
Soluzione
Questo non è banale a causa delle limitazioni del motore evidenziazione di Vim: non può evidenziare regioni sovrapposte molto bene. Hai due opzioni come la vedo io:
-
Con l'evidenziazione della sintassi e molto su con l'opzione
contains=
fino a quando non funziona per voi (dipenderà da alcuni plugin probabilmente):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
Questo sarà probabilmente prendere un sacco di guai e non può mai farlo funzionare in modo soddisfacente. Mettete questo in
vimfiles/after/syntax/c.vim
o~/.vim/after/syntax/c.vim
. -
Usa piegare marcatori. Questo lavoro, ma non sarà in grado di piegare in parentesi graffe o qualsiasi altra cosa che ti avrebbe fatto piacere. Mettete questo in
~/.vim/after/ftplugin/c.vim
(o il percorso vimfiles equivalenti su 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
Altri suggerimenti
Sono stato in grado di farlo funzionare a mio piacimento, aggiungendo queste righe al mio file di sintassi 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")