On Wed, Jan 6, 2010 at 5:25 PM, A. S. Budden <[email protected]> wrote:

> > > 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
>


Your idea to parse tags file is interesting. My plan is putting all defined
(selected by user using hotkey) #ifdef into a file, and make a plugin to
parse it.

Actually I still don't know when VIM start to parsing and generate the
highlight. Does vim generate the highlight only when we open the file?

-- 
Best Regards,


Gusman Dharma P
-- 
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php

Reply via email to