> > From: [email protected] [mailto:[email protected]] On Behalf > > Of ext Gusman > > Subject: #ifdef block's color > > > > Dear All, > > > > Currently I'am working with a big source code in C language which have many > > #ifdef directives in there. It's so difficult for me to read the code flow > > while I can't determine which #ifdef is defined or not defined. > > > > Is there plugin can make undefined #ifdef code block same as #if 0 code > > block.
2010/1/6 Marczis, Peter (NSN - HU/Budapest) <[email protected]>: > Hi, > I think you can modify the c syntax file, in $VIMRUNTIME\syntax\c.vim. > There are more region definition, but you will find the IF 0 definition, you > should mod, that regexp to match #if instead... You'll need to parse your tags file to work out what all the defined names are (a bit like the way the ctags highlighter works [1]). You can then generate a list of tags and do something like this (I'll leave ParseTagsFileForDefines( ) to you for now...): let list_of_defined_names = ParseTagsFileForDefines() " Returns a list like ['NDEBUG', 'ANOTHER_DEFINE', 'DEFINED_NAME_2'] let list_of_defined_names = ['NDEBUG', 'ANOTHER_DEFINE', 'DEFINED_NAME_2'] let start_if_regexp = '^\s*\(%:\|#\)\s*ifdef\s\+\(' let start_ifn_regexp = '^\s*\(%:\|#\)\s*ifndef\s\+\(' for item in other_list let start_if_regexp .= '\<' . item . '\>' let start_if_regexp .= '\|' let start_ifn_regexp .= '\<' . item . '\>' let start_ifn_regexp .= '\|' endfor " Strip the trailing | and replace it with ) let start_if_regexp = start_if_regexp[0:len(start_if_regexp)-2] . ')' let start_ifn_regexp = start_ifn_regexp[0:len(start_ifn_regexp)-2] . ')' " Add a negative look-ahead and end-of-line catching let start_if_regexp .= '\...@!\(\k\{-}\)\s*$' let start_ifn_regexp .= '\s*$' " We now have #ifdef (NDEBUG|ANOTHER_DEFINE|DEFINED_NAME_2)\...@! " and a #ifndef (NDEBUG|ANOTHER_DEFINE|DEFINED_NAME_2) " with escaped brackets and word protection (\<, \>) " Make it work exe 'syn region cCppIFDEFNotDefined start="' . start_if_regexp . '" end="....@=\|$" contains=cCppNotDefined2' exe 'syn region cCppIFNDEFNotDefined start="' . start_ifn_regexp . '" end="....@=\|$" contains=cCppNotDefined2' " Add the catch for the end of the region syn region cCppNotDefined2 contained start="\k\+\s*$" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cSpaceError,cCppSkip hi link cCppIFDEFNotDefined Comment hi link cCppIFNDEFNotDefined Comment hi link cCppNotDefined2 cCppIFDEFNotDefined " Optional: if you use rainbow.vim you may need this: syn cluster cBracketGroup add=cCppIFDEFNotDefined,cCppIFNDEFNotDefined,cCppNotDefined2 syn cluster cCppBracketGroup add=cCppIFDEFNotDefined,cCppIFNDEFNotDefined,cCppNotDefined2 syn cluster cCurlyGroup add=cCppIFDEFNotDefined,cCppIFNDEFNotDefined,cCppNotDefined2 syn cluster cParenGroup add=cCppIFDEFNotDefined,cCppIFNDEFNotDefined,cCppNotDefined2 syn cluster cCppParenGroup add=cCppIFDEFNotDefined,cCppIFNDEFNotDefined,cCppNotDefined2 The biggest problem that you'll have is that if there are a lot of defined names in your tags file, it'll do one of two things: 1) Slow down vim so much that it's unusable (as it'll be a really complicated regexp) 2) Give an error message due to the pattern being too long. There may be a better way of doing this (Eclipse can do this after all, so I'd hope Vim can), but I don't know what it is... Al [1] http://sites.google.com/site/abudden/contents/Vim-Scripts/ctags-highlighting -- http://sites.google.com/site/abudden
-- You received this message from the "vim_use" maillist. For more information, visit http://www.vim.org/maillist.php
