diff options
author | nyamatongwe <unknown> | 2011-01-20 11:55:48 +1100 |
---|---|---|
committer | nyamatongwe <unknown> | 2011-01-20 11:55:48 +1100 |
commit | 005d7dcdc7adef49c64472ec382b4a6b4de45376 (patch) | |
tree | 3acb5c7d331c5653b6143c4bc7a7e5d33125770c | |
parent | fa5a3ac6d696f57a950a40b060b56bbe01c41a64 (diff) | |
download | scintilla-mirror-005d7dcdc7adef49c64472ec382b4a6b4de45376.tar.gz |
Improve control over folding of C++ with options to disable syntax-based folding,
disable multi-line comment folding, choosing custom explicit fold point text, and
enable explicit fold points anywhere.
From Udo Lechner.
-rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
-rw-r--r-- | lexers/LexCPP.cxx | 51 |
2 files changed, 44 insertions, 8 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index eea01cabd..e347ab2aa 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -363,6 +363,7 @@ </tr><tr> <td>Tino Weinkauf</td> <td>Jérôme Laforge</td> + <td>Udo Lechner</td> </tr> </table> <p> diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index 8b0263a6e..fa14246c4 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -1,6 +1,7 @@ // Scintilla source code edit control /** @file LexCPP.cxx ** Lexer for C++, C, Java, and JavaScript. + ** Further folding features and configuration properties added by "Udo Lechner" <dlchnr(at)gmx(dot)net> **/ // Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org> // The License.txt file describes the conditions under which this software may be distributed. @@ -208,8 +209,13 @@ struct OptionsCPP { bool trackPreprocessor; bool updatePreprocessor; bool fold; + bool foldSyntaxBased; bool foldComment; + bool foldCommentMultiline; bool foldCommentExplicit; + std::string foldExplicitStart; + std::string foldExplicitEnd; + bool foldExplicitAnywhere; bool foldPreprocessor; bool foldCompact; bool foldAtElse; @@ -219,8 +225,13 @@ struct OptionsCPP { trackPreprocessor = true; updatePreprocessor = true; fold = false; + foldSyntaxBased = true; foldComment = false; + foldCommentMultiline = true; foldCommentExplicit = true; + foldExplicitStart = ""; + foldExplicitEnd = ""; + foldExplicitAnywhere = false; foldPreprocessor = false; foldCompact = false; foldAtElse = false; @@ -254,14 +265,29 @@ struct OptionSetCPP : public OptionSet<OptionsCPP> { DefineProperty("fold", &OptionsCPP::fold); + DefineProperty("fold.cpp.syntax.based", &OptionsCPP::foldSyntaxBased, + "Set this property to 0 to disable syntax based folding."); + DefineProperty("fold.comment", &OptionsCPP::foldComment, "This option enables folding multi-line comments and explicit fold points when using the C++ lexer. " "Explicit fold points allows adding extra folding by placing a //{ comment at the start and a //} " "at the end of a section that should fold."); + DefineProperty("fold.cpp.comment.multiline", &OptionsCPP::foldCommentMultiline, + "Set this property to 0 to disable folding multi-line comments when fold.comment=1."); + DefineProperty("fold.cpp.comment.explicit", &OptionsCPP::foldCommentExplicit, "Set this property to 0 to disable folding explicit fold points when fold.comment=1."); + DefineProperty("fold.cpp.explicit.start", &OptionsCPP::foldExplicitStart, + "The string to use for explicit fold start points, replacing the standard //{."); + + DefineProperty("fold.cpp.explicit.end", &OptionsCPP::foldExplicitEnd, + "The string to use for explicit fold end points, replacing the standard //}."); + + DefineProperty("fold.cpp.explicit.anywhere", &OptionsCPP::foldExplicitAnywhere, + "Set this property to 1 to enable explicit fold points anywhere, not just in line comments."); + DefineProperty("fold.preprocessor", &OptionsCPP::foldPreprocessor, "This option enables folding preprocessor directives when using the C++ lexer. " "Includes C#'s explicit #region and #endregion folding directives."); @@ -852,6 +878,7 @@ void SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style = initStyle; + const bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty(); for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); @@ -859,7 +886,7 @@ void SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - if (options.foldComment && IsStreamCommentStyle(style)) { + if (options.foldComment && options.foldCommentMultiline && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev) && (stylePrev != SCE_C_COMMENTLINEDOC)) { levelNext++; } else if (!IsStreamCommentStyle(styleNext) && (styleNext != SCE_C_COMMENTLINEDOC) && !atEOL) { @@ -867,14 +894,22 @@ void SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, levelNext--; } } - if (options.foldComment && options.foldCommentExplicit && (style == SCE_C_COMMENTLINE)) { - if ((ch == '/') && (chNext == '/')) { - char chNext2 = styler.SafeGetCharAt(i + 2); - if (chNext2 == '{') { + if (options.foldComment && options.foldCommentExplicit && ((style == SCE_C_COMMENTLINE) || options.foldExplicitAnywhere)) { + if (userDefinedFoldMarkers) { + if (styler.Match(i, options.foldExplicitStart.c_str())) { levelNext++; - } else if (chNext2 == '}') { + } else if (styler.Match(i, options.foldExplicitEnd.c_str())) { levelNext--; } + } else { + if ((ch == '/') && (chNext == '/')) { + char chNext2 = styler.SafeGetCharAt(i + 2); + if (chNext2 == '{') { + levelNext++; + } else if (chNext2 == '}') { + levelNext--; + } + } } } if (options.foldPreprocessor && (style == SCE_C_PREPROCESSOR)) { @@ -890,7 +925,7 @@ void SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, } } } - if (style == SCE_C_OPERATOR) { + if (options.foldSyntaxBased && (style == SCE_C_OPERATOR)) { if (ch == '{') { // Measure the minimum before a '{' to allow // folding on "} else {" @@ -906,7 +941,7 @@ void SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, visibleChars++; if (atEOL || (i == endPos-1)) { int levelUse = levelCurrent; - if (options.foldAtElse) { + if (options.foldSyntaxBased && options.foldAtElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; |