包含的大多数lexer也支持代码折叠(有时称为大纲)。根据所需的控制级别,您可以手动、自动或介于两者之间的任何位置进行处理。下面的配方显示了如何配置lexer以便它自动进行代码折叠的基本方法:
// Set the lexer
scintilla.Lexer = Lexer.Cpp;
// Instruct the lexer to calculate folding
scintilla.SetProperty("fold", "1");
scintilla.SetProperty("fold.compact", "1");
// Configure a margin to display folding symbols
scintilla.Margins[2].Type = MarginType.Symbol;
scintilla.Margins[2].Mask = Marker.MaskFolders;
scintilla.Margins[2].Sensitive = true;
scintilla.Margins[2].Width = 20;
// Set colors for all folding markers
for (int i = 25; i <= 31; i++)
{
scintilla.Markers[i].SetForeColor(SystemColors.ControlLightLight);
scintilla.Markers[i].SetBackColor(SystemColors.ControlDark);
}
// Configure folding markers with respective symbols
scintilla.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
scintilla.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
scintilla.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
scintilla.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
scintilla.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
scintilla.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
scintilla.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
// Enable automatic folding
scintilla.AutomaticFold = (AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change);
默认情况下,除非将lexer配置为,否则lexer不会执行计算折叠点的额外工作。和SetProperty
方法将配置值传递给lexer。但是,您可以定制的lexer行为——它们的名称和可能的值——却没有得到很好的记录。也许闪烁星的未来版本会解决这个问题。也就是说,几乎每一个包含在闪烁中的lexer都使用“折叠”
和"fold.compact"
启用折叠属性。将这些设置为 "1"
将配置lexer来计算折叠点并设置适当的线标记。
按惯例,页边距2用于折叠符号,但如果配置正确,则任何边距都可以使用。在我们的示例中,边距2配置为Symbol
保证金,敏感的
我们使用Marker.MaskFolders
常量,以遮罩页边距可以显示的可能标记的范围,以仅折叠相关标记。
指定用于折叠的标记是索引25到31,并命名等效常量Marker.Folder*
. 启用折叠时,闪烁将自动使用该范围内的标记索引来指示折叠点。您可以根据需要自定义这些标记的外观,但不能更改闪烁体希望用于折叠的标记索引。
为了自定义标记的外观,我们使用一个短循环来更改默认的背景和前景颜色。然后我们使用Marker.Folder*
常量为每个标记设置适当的符号。
最后,我们使用AutomaticFold
财产。如果我们没有使用自动折叠,我们将需要处理页边距单击事件,并使用folding API来切换行的可见性。
原文链接:https://www.exueyuan.top/519.html,转载请注明出处。
请先
!