python 如何在Scintilla中高亮显示文本?

ktecyv1j  于 2023-01-04  发布在  Python
关注(0)|答案(4)|浏览(238)

我正在使用Scintilla编写一个编辑器。
我已经在使用词法分析器来做自动语法突出显示,但现在我想标记搜索结果。如果我只想标记一个匹配项,我可以在那里设置选择,但是,我想标记(例如,用黄色背景)所有的匹配项。
我是用Perl写这篇文章的,但是如果你有其他语言的建议,那也很酷。

brqmpdu1

brqmpdu11#

你读过Scintilla文档中的Markers参考吗?这个参考可能有点晦涩,所以我建议你也看看SciTE的源代码。这个文本编辑器最初是Scintilla的一个测试平台。它成长为一个成熟的编辑器,但它仍然是Scintilla所有东西的一个很好的实现参考。
在我们的特殊情况下,在Find对话框中有一个Mark All按钮。你可以在SciTEBase::MarkAll()方法中找到它的实现。这个方法只在搜索结果上循环(直到它在第一个搜索结果上循环,如果有的话),并在找到的行上放置一个书签(并可选地在找到的项目上设置一个指示符)。找到的行是使用SCI_LINEFROMPOSITION(posFound)获得的,书签只是对SCI_MARKERADD(lineno,markerBookmark)的一个调用。注意,标记可以是页边空白中的符号,或者如果没有关联到页边空白,它将突出显示整行。
嗯。

2skhul33

2skhul332#

“sample”编辑器站点使用书签特性为所有与搜索结果匹配的行添加书签。

46qrfjad

46qrfjad3#

我使用指标来突出显示搜索结果。

qyswt5oh

qyswt5oh4#

此解决方案在C#中有效:

private void HighlightWord(Scintilla scintilla, string text)
    {
        if (string.IsNullOrEmpty(text))
            return;

        // Indicators 0-7 could be in use by a lexer
        // so we'll use indicator 8 to highlight words.
        const int NUM = 8;

        // Remove all uses of our indicator
        scintilla.IndicatorCurrent = NUM;
        scintilla.IndicatorClearRange(0, scintilla.TextLength);

        // Update indicator appearance
        scintilla.Indicators[NUM].Style = IndicatorStyle.StraightBox;
        scintilla.Indicators[NUM].Under = true;
        scintilla.Indicators[NUM].ForeColor = Color.Green;
        scintilla.Indicators[NUM].OutlineAlpha = 50;
        scintilla.Indicators[NUM].Alpha = 30;

        // Search the document
        scintilla.TargetStart = 0;
        scintilla.TargetEnd = scintilla.TextLength;
        scintilla.SearchFlags = SearchFlags.None;
        while (scintilla.SearchInTarget(text) != -1)
        {
            // Mark the search results with the current indicator
            scintilla.IndicatorFillRange(scintilla.TargetStart, scintilla.TargetEnd - scintilla.TargetStart);

            // Search the remainder of the document
            scintilla.TargetStart = scintilla.TargetEnd;
            scintilla.TargetEnd = scintilla.TextLength;
        }
    }

调用很简单,在本例中,以@开头的单词将突出显示:

Regex regex = new Regex(@"@\w+");
        string[] operands = regex.Split(txtScriptText.Text);
        Match match = regex.Match(txtScriptText.Text);

        if (match.Value.Length > 0)
            HighlightWord(txtScriptText, match.Value);

相关问题