diff --git a/TextEditor.cpp b/TextEditor.cpp
index dd8f253..0029d36 100644
--- a/TextEditor.cpp
+++ b/TextEditor.cpp
@@ -40,14 +40,13 @@
 	, mColorRangeMin(0)
 	, mColorRangeMax(0)
 	, mSelectionMode(SelectionMode::Normal)
-	, mCheckMultilineComments(true)
+	, mCheckComments(true)
 {
 	SetPalette(GetDarkPalette());
 	SetLanguageDefinition(LanguageDefinition::HLSL());
 	mLines.push_back(Line());
 }
 
-
 TextEditor::~TextEditor()
 {
 }
@@ -432,6 +431,26 @@
 	return r;
 }
 
+ImU32 TextEditor::GetGlyphColor(const Glyph & aGlyph) const
+{
+	if (aGlyph.mComment)
+		return mPalette[(int)PaletteIndex::Comment];
+	if (aGlyph.mMultiLineComment)
+		return mPalette[(int)PaletteIndex::MultiLineComment];
+	auto const color = mPalette[(int)aGlyph.mColorIndex];
+	if (aGlyph.mPreprocessor)
+	{
+		const auto ppcolor = mPalette[(int)PaletteIndex::Preprocessor];
+		const int c0 = ((ppcolor & 0xff) + (color & 0xff)) / 2;
+		const int c1 = (((ppcolor >> 8) & 0xff) + ((color >> 8) & 0xff)) / 2;
+		const int c2 = (((ppcolor >> 16) & 0xff) + ((color >> 16) & 0xff)) / 2;
+		const int c3 = (((ppcolor >> 24) & 0xff) + ((color >> 24) & 0xff)) / 2;
+		return ImU32(c0 | (c1 << 8) | (c2 << 16) | (c3 << 24));
+	}
+
+	return color;
+}
+
 void TextEditor::Render(const char* aTitle, const ImVec2& aSize, bool aBorder)
 {
 	mWithinRender = true;
@@ -743,18 +762,17 @@
 			/*
 				Draw Text
 			*/
-
-			auto prevColor = line.empty() ? PaletteIndex::Default : (line[0].mMultiLineComment ? PaletteIndex::MultiLineComment : line[0].mColorIndex);
-			ImVec2 bufferOffset;	
+			auto prevColor = line.empty() ? mPalette[(int) PaletteIndex::Default] : GetGlyphColor(line[0]);
+			ImVec2 bufferOffset;
 
 			for (auto& glyph : line)
 			{
-				auto color = glyph.mMultiLineComment ? PaletteIndex::MultiLineComment : glyph.mColorIndex;
+				auto color = GetGlyphColor(glyph);
 
 				if ((color != prevColor || glyph.mChar == '\t') && !buffer.empty())
 				{
 					const ImVec2 newOffset(textScreenPos.x + bufferOffset.x, textScreenPos.y + bufferOffset.y);
-					drawList->AddText(newOffset, mPalette[(uint8_t)prevColor], buffer.c_str());
+					drawList->AddText(newOffset, prevColor, buffer.c_str());
 					auto textSize = ImGui::CalcTextSize(buffer.c_str());
 					bufferOffset.x += textSize.x + 1.0f * fontScale;
 					buffer.clear();
@@ -771,7 +789,7 @@
 			if (!buffer.empty())
 			{
 				const ImVec2 newOffset(textScreenPos.x + bufferOffset.x, textScreenPos.y + bufferOffset.y);
-				drawList->AddText(newOffset, mPalette[(uint8_t)prevColor], buffer.c_str());
+				drawList->AddText(newOffset, prevColor, buffer.c_str());
 				buffer.clear();
 			}
 
@@ -846,35 +864,35 @@
 
 	Colorize();
 }
-
-void TextEditor::SetTextLines(const std::vector<std::string> & aLines)
-{
-	mLines.clear();
-	
-	if (aLines.empty())
-	{
-		mLines.emplace_back(Line());
-	}
-	else
-	{
-		mLines.resize(aLines.size());
-		
-		for (size_t i = 0; i < aLines.size(); ++i)
-		{
-			const std::string & aLine = aLines[i];
-			
-			mLines[i].reserve(aLine.size());
-			for (size_t j = 0; j < aLine.size(); ++j)
-				mLines[i].emplace_back(Glyph(aLine[j], PaletteIndex::Default));
-		}
-	}
-
-	mTextChanged = true;
-
-	mUndoBuffer.clear();
-
-	Colorize();
-}
+
+void TextEditor::SetTextLines(const std::vector<std::string> & aLines)
+{
+	mLines.clear();
+	
+	if (aLines.empty())
+	{
+		mLines.emplace_back(Line());
+	}
+	else
+	{
+		mLines.resize(aLines.size());
+		
+		for (size_t i = 0; i < aLines.size(); ++i)
+		{
+			const std::string & aLine = aLines[i];
+			
+			mLines[i].reserve(aLine.size());
+			for (size_t j = 0; j < aLine.size(); ++j)
+				mLines[i].emplace_back(Glyph(aLine[j], PaletteIndex::Default));
+		}
+	}
+
+	mTextChanged = true;
+
+	mUndoBuffer.clear();
+
+	Colorize();
+}
 
 void TextEditor::EnterCharacter(Char aChar, bool aShift)
 {
@@ -1569,13 +1587,13 @@
 const TextEditor::Palette & TextEditor::GetDarkPalette()
 {
 	static Palette p = { {
-		0xffffffff,	// None
+		0xff7f7f7f,	// Default
 		0xffd69c56,	// Keyword	
 		0xff00ff00,	// Number
 		0xff7070e0,	// String
 		0xff70a0e0, // Char literal
 		0xffffffff, // Punctuation
-		0xff409090,	// Preprocessor
+		0xff408080,	// Preprocessor
 		0xffaaaaaa, // Identifier
 		0xff9bc64d, // Known identifier
 		0xffc040a0, // Preproc identifier
@@ -1597,13 +1615,13 @@
 const TextEditor::Palette & TextEditor::GetLightPalette()
 {
 	static Palette p = { {
-		0xff000000,	// None
+		0xff7f7f7f,	// None
 		0xffff0c06,	// Keyword	
 		0xff008000,	// Number
 		0xff2020a0,	// String
 		0xff304070, // Char literal
 		0xff000000, // Punctuation
-		0xff409090,	// Preprocessor
+		0xff406060,	// Preprocessor
 		0xff404040, // Identifier
 		0xff606010, // Known identifier
 		0xffc040a0, // Preproc identifier
@@ -1654,27 +1672,27 @@
 std::string TextEditor::GetText() const
 {
 	return GetText(Coordinates(), Coordinates((int)mLines.size(), 0));
-}
-
-std::vector<std::string> TextEditor::GetTextLines() const
-{
-	std::vector<std::string> result;
-	
-	result.reserve(mLines.size());
-	
-	for (auto & line : mLines)
-	{
-		std::string text;
-		
-		text.resize(line.size());
-		
-		for (size_t i = 0; i < line.size(); ++i)
-			text[i] = line[i].mChar;
-		
-		result.emplace_back(std::move(text));
-	}
-	
-	return result;
+}
+
+std::vector<std::string> TextEditor::GetTextLines() const
+{
+	std::vector<std::string> result;
+	
+	result.reserve(mLines.size());
+	
+	for (auto & line : mLines)
+	{
+		std::string text;
+		
+		text.resize(line.size());
+		
+		for (size_t i = 0; i < line.size(); ++i)
+			text[i] = line[i].mChar;
+		
+		result.emplace_back(std::move(text));
+	}
+	
+	return result;
 }
 
 std::string TextEditor::GetSelectedText() const
@@ -1699,7 +1717,7 @@
 	mColorRangeMax = std::max(mColorRangeMax, toLine);
 	mColorRangeMin = std::max(0, mColorRangeMin);
 	mColorRangeMax = std::max(mColorRangeMin, mColorRangeMax);
-	mCheckMultilineComments = true;
+	mCheckComments = true;
 }
 
 void TextEditor::ColorizeRange(int aFromLine, int aToLine)
@@ -1714,7 +1732,6 @@
 	int endLine = std::max(0, std::min((int)mLines.size(), aToLine));
 	for (int i = aFromLine; i < endLine; ++i)
 	{
-		bool preproc = false;
 		auto& line = mLines[i];
 		
 		if (line.empty())
@@ -1779,11 +1796,11 @@
 				{
 					id.assign(token_begin, token_end);
 					
-				// todo : allmost all language definitions use lower case to specify keywords, so shouldn't this use ::tolower ?
+					// todo : allmost all language definitions use lower case to specify keywords, so shouldn't this use ::tolower ?
 					if (!mLanguageDefinition.mCaseSensitive)
 						std::transform(id.begin(), id.end(), id.begin(), ::toupper);
 
-					if (!preproc)
+					if (!line[first - bufferBegin].mPreprocessor)
 					{
 						if (mLanguageDefinition.mKeywords.count(id) != 0)
 							token_color = PaletteIndex::Keyword;
@@ -1796,14 +1813,8 @@
 					{
 						if (mLanguageDefinition.mPreprocIdentifiers.count(id) != 0)
 							token_color = PaletteIndex::PreprocIdentifier;
-						else
-							token_color = PaletteIndex::Identifier;
 					}
 				}
-				else if (token_color == PaletteIndex::Preprocessor)
-				{
-					preproc = true;
-				}
 				
 				for (size_t j = 0; j < token_length; ++j)
 					line[(token_begin - bufferBegin) + j].mColorIndex = token_color;
@@ -1819,72 +1830,102 @@
 	if (mLines.empty())
 		return;
 	
-	if (mCheckMultilineComments)
+	if (mCheckComments)
 	{
 		auto end = Coordinates((int)mLines.size(), 0);
 		auto commentStart = end;
 		auto withinString = false;
-		for (auto i = Coordinates(0, 0); i < end; Advance(i))
+		auto withinSingleLineComment = false;
+		auto withinPreproc = false;
+		auto firstChar = true;			// there is no other non-whitespace characters in the line before
+		auto concatenate = false;		// '\' on the very end of the line
+		
+		for (auto currentCoord = Coordinates(0, 0); currentCoord < end; Advance(currentCoord))
 		{
-			auto& line = mLines[i.mLine];
+			auto& line = mLines[currentCoord.mLine];
+
+			if (currentCoord.mColumn == 0 && !concatenate)
+			{
+				withinSingleLineComment = false;
+				withinPreproc = false;
+				firstChar = true;
+			}
+
+			concatenate = false;
+
 			if (!line.empty())
 			{
-				auto& g = line[i.mColumn];
+				auto& g = line[currentCoord.mColumn];
 				auto c = g.mChar;
 
-				bool inComment = commentStart <= i;
+				if (c != mLanguageDefinition.mPreprocChar && !isspace(c))
+					firstChar = false;
+
+				if (currentCoord.mColumn == line.size() - 1 && line[line.size() - 1].mChar == '\\')
+					concatenate = true;
+
+				bool inComment = commentStart <= currentCoord;
 
 				if (withinString)
 				{
-					line[i.mColumn].mMultiLineComment = inComment;
+					line[currentCoord.mColumn].mMultiLineComment = inComment;
 
 					if (c == '\"')
 					{
-						if (i.mColumn + 1 < (int)line.size() && line[i.mColumn + 1].mChar == '\"')
+						if (currentCoord.mColumn + 1 < (int)line.size() && line[currentCoord.mColumn + 1].mChar == '\"')
 						{
-							Advance(i);
-							if (i.mColumn < (int)line.size())
-								line[i.mColumn].mMultiLineComment = inComment;
+							Advance(currentCoord);
+							if (currentCoord.mColumn < (int)line.size())
+								line[currentCoord.mColumn].mMultiLineComment = inComment;
 						}
 						else
 							withinString = false;
 					}
 					else if (c == '\\')
 					{
-						Advance(i);
-						if (i.mColumn < (int)line.size())
-							line[i.mColumn].mMultiLineComment = inComment;
+						Advance(currentCoord);
+						if (currentCoord.mColumn < (int)line.size())
+							line[currentCoord.mColumn].mMultiLineComment = inComment;
 					}
 				}
 				else
 				{
+					if (firstChar && c == mLanguageDefinition.mPreprocChar)
+						withinPreproc = true;
+
 					if (c == '\"')
 					{
 						withinString = true;
-						line[i.mColumn].mMultiLineComment = inComment;
+						line[currentCoord.mColumn].mMultiLineComment = inComment;
 					}
 					else
 					{
 						auto pred = [](const char& a, const Glyph& b) { return a == b.mChar; };
-						auto from = line.begin() + i.mColumn;
+						auto from = line.begin() + currentCoord.mColumn;
 						auto& startStr = mLanguageDefinition.mCommentStart;
-						if (i.mColumn + startStr.size() <= line.size() &&
+						auto& singleStartStr = mLanguageDefinition.mSingleLineComment;
+						if (currentCoord.mColumn + singleStartStr.size() <= line.size() &&
+							equals(singleStartStr.begin(), singleStartStr.end(), from, from + singleStartStr.size(), pred))
+							withinSingleLineComment = true;
+						else if (!withinSingleLineComment && currentCoord.mColumn + startStr.size() <= line.size() &&
 							equals(startStr.begin(), startStr.end(), from, from + startStr.size(), pred))
-							commentStart = i;
+							commentStart = currentCoord;
 
-						inComment = commentStart <= i;
+						inComment = commentStart <= currentCoord;
 
-						line[i.mColumn].mMultiLineComment = inComment;
-						
+						line[currentCoord.mColumn].mMultiLineComment = inComment;
+						line[currentCoord.mColumn].mComment = withinSingleLineComment;
+
 						auto& endStr = mLanguageDefinition.mCommentEnd;
-						if (i.mColumn + 1 >= (int)endStr.size() &&
+						if (currentCoord.mColumn + 1 >= (int)endStr.size() &&
 							equals(endStr.begin(), endStr.end(), from + 1 - endStr.size(), from + 1, pred))
 							commentStart = end;
 					}
 				}
+				line[currentCoord.mColumn].mPreprocessor = withinPreproc;
 			}
 		}
-		mCheckMultilineComments = false;
+		mCheckComments = false;
 		return;
 	}
 
@@ -2028,49 +2069,6 @@
 	aEditor->EnsureCursorVisible();
 }
 
-static bool TokenizeCStyleComment(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end)
-{
-	if (*in_begin != '/')
-		return false;
-	
-	if (in_begin + 1 < in_end && in_begin[1] == '/')
-	{
-		out_begin = in_begin;
-		out_end = in_end;
-		return true;
-	}
-	
-	return false;
-}
-
-static bool TokenizeCStylePreprocessorDirective(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end)
-{
-	if (*in_begin != '#')
-		return false;
-	
-	const char * p = in_begin + 1;
-	
-	while (p < in_end && isblank(*p))
-		p++;
-	
-	bool hasText = false;
-	
-	while (p < in_end && ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || *p == '_'))
-	{
-		hasText = true;
-		p++;
-	}
-	
-	if (hasText)
-	{
-		out_begin = in_begin;
-		out_end = p;
-		return true;
-	}
-	
-	return false;
-}
-
 static bool TokenizeCStyleString(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end)
 {
 	const char * p = in_begin;
@@ -2329,10 +2327,6 @@
 				out_end = in_end;
 				paletteIndex = PaletteIndex::Default;
 			}
-			else if (TokenizeCStyleComment(in_begin, in_end, out_begin, out_end))
-				paletteIndex = PaletteIndex::Comment;
-			else if (TokenizeCStylePreprocessorDirective(in_begin, in_end, out_begin, out_end))
-				paletteIndex = PaletteIndex::Preprocessor;
 			else if (TokenizeCStyleString(in_begin, in_end, out_begin, out_end))
 				paletteIndex = PaletteIndex::String;
 			else if (TokenizeCStyleCharacterLiteral(in_begin, in_end, out_begin, out_end))
@@ -2349,6 +2343,7 @@
 		
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = true;
@@ -2408,7 +2403,6 @@
 			langDef.mIdentifiers.insert(std::make_pair(std::string(k), id));
 		}
 
-		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("//.*", PaletteIndex::Comment));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[ \\t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral));
@@ -2421,6 +2415,7 @@
 
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = true;
@@ -2457,7 +2452,6 @@
 			langDef.mIdentifiers.insert(std::make_pair(std::string(k), id));
 		}
 
-		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("//.*", PaletteIndex::Comment));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[ \\t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral));
@@ -2470,6 +2464,7 @@
 
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = true;
@@ -2519,10 +2514,6 @@
 				out_end = in_end;
 				paletteIndex = PaletteIndex::Default;
 			}
-			else if (TokenizeCStyleComment(in_begin, in_end, out_begin, out_end))
-				paletteIndex = PaletteIndex::Comment;
-			else if (TokenizeCStylePreprocessorDirective(in_begin, in_end, out_begin, out_end))
-				paletteIndex = PaletteIndex::Preprocessor;
 			else if (TokenizeCStyleString(in_begin, in_end, out_begin, out_end))
 				paletteIndex = PaletteIndex::String;
 			else if (TokenizeCStyleCharacterLiteral(in_begin, in_end, out_begin, out_end))
@@ -2539,6 +2530,7 @@
 		
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = true;
@@ -2591,7 +2583,6 @@
 			langDef.mIdentifiers.insert(std::make_pair(std::string(k), id));
 		}
 
-		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\-\\-.*", PaletteIndex::Comment));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\\'[^\\\']*\\\'", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number));
@@ -2603,6 +2594,7 @@
 
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = false;
 		langDef.mAutoIndentation = false;
@@ -2641,7 +2633,6 @@
 			langDef.mIdentifiers.insert(std::make_pair(std::string(k), id));
 		}
 
-		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("//.*", PaletteIndex::Comment));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\'\\\\?[^\\']\\'", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number));
@@ -2653,6 +2644,7 @@
 
 		langDef.mCommentStart = "/*";
 		langDef.mCommentEnd = "*/";
+		langDef.mSingleLineComment = "//";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = true;
@@ -2696,7 +2688,6 @@
 			langDef.mIdentifiers.insert(std::make_pair(std::string(k), id));
 		}
 
-		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\-\\-.*", PaletteIndex::Comment));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("\\\'[^\\\']*\\\'", PaletteIndex::String));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number));
@@ -2705,8 +2696,8 @@
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier));
 		langDef.mTokenRegexStrings.push_back(std::make_pair<std::string, PaletteIndex>("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation));
 
-		langDef.mCommentStart = "\\-\\-\\[\\[";
-		langDef.mCommentEnd = "\\]\\]";
+		langDef.mCommentStart = "--[[";
+		langDef.mCommentEnd = "]]";
 
 		langDef.mCaseSensitive = true;
 		langDef.mAutoIndentation = false;
diff --git a/TextEditor.h b/TextEditor.h
index 9ea838d..3e37e86 100644
--- a/TextEditor.h
+++ b/TextEditor.h
@@ -130,9 +130,12 @@
 	{
 		Char mChar;
 		PaletteIndex mColorIndex = PaletteIndex::Default;
+		bool mComment : 1;
 		bool mMultiLineComment : 1;
+		bool mPreprocessor : 1;
 
-		Glyph(Char aChar, PaletteIndex aColorIndex) : mChar(aChar), mColorIndex(aColorIndex), mMultiLineComment(false) {}
+		Glyph(Char aChar, PaletteIndex aColorIndex) : mChar(aChar), mColorIndex(aColorIndex), 
+			mComment(false), mMultiLineComment(false), mPreprocessor(false) {}
 	};
 
 	typedef std::vector<Glyph> Line;
@@ -148,7 +151,8 @@
 		Keywords mKeywords;
 		Identifiers mIdentifiers;
 		Identifiers mPreprocIdentifiers;
-		std::string mCommentStart, mCommentEnd;
+		std::string mCommentStart, mCommentEnd, mSingleLineComment;
+		char mPreprocChar;
 		bool mAutoIndentation;
 
 		TokenizeCallback mTokenize;
@@ -158,7 +162,7 @@
 		bool mCaseSensitive;
 		
 		LanguageDefinition()
-			: mTokenize(nullptr)
+			: mTokenize(nullptr), mPreprocChar('#'), mAutoIndentation(true), mCaseSensitive(true)
 		{
 		}
 		
@@ -184,9 +188,9 @@
 	void SetBreakpoints(const Breakpoints& aMarkers) { mBreakpoints = aMarkers; }
 
 	void Render(const char* aTitle, const ImVec2& aSize = ImVec2(), bool aBorder = false);
-	void SetText(const std::string& aText);
+	void SetText(const std::string& aText);
 	void SetTextLines(const std::vector<std::string>& aLines);
-	std::string GetText() const;
+	std::string GetText() const;
 	std::vector<std::string> GetTextLines() const;
 	std::string GetSelectedText() const;
 	std::string GetCurrentLineText()const;
@@ -307,6 +311,7 @@
 	void DeleteSelection();
 	std::string GetWordUnderCursor() const;
 	std::string GetWordAt(const Coordinates& aCoords) const;
+	ImU32 GetGlyphColor(const Glyph& aGlyph) const;
 
 	float mLineSpacing;
 	Lines mLines;
@@ -330,7 +335,7 @@
 	LanguageDefinition mLanguageDefinition;
 	RegexList mRegexList;
 
-	bool mCheckMultilineComments;
+	bool mCheckComments;
 	Breakpoints mBreakpoints;
 	ErrorMarkers mErrorMarkers;
 	ImVec2 mCharAdvance;
