在 ScintillaNET 控件中实现块注释/取消注释

Posted

技术标签:

【中文标题】在 ScintillaNET 控件中实现块注释/取消注释【英文标题】:Implement block comment/uncomment in ScintillaNET control 【发布时间】:2013-09-04 12:36:58 【问题描述】:

我正在尝试使用 ScintillaNET 组件在 C# 中实现自定义文本编辑器。到目前为止,我已经掌握了大部分内容,但一直停留在某个地方。我想让用户能够阻止评论/取消评论选定的文本。我尝试了很多,但在网上找不到任何示例。我似乎从控件的 Selection 对象中得到的唯一东西是 Start 和 End 位置,但这并没有多大帮助

    private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e)
    
        if (txtSQL.Selection.Text.Length > 0)
        
            String start = txtSQL.Selection.Start.ToString();
            String end = txtSQL.Selection.End.ToString();
            MessageBox.Show(start + "::" + end);

        
    

你们中的任何人都能够使用 ScintillaNET 控件成功实现这一点吗?

编辑: 经过一些即兴创作,我能够以某种方式做到这一点,但是在块被评论后,最后一行移出选择!

    private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e)
    
        if (txtSQL.Selection.Text.Length > 0)
        
            Range range = txtSQL.Selection.Range;
            int f = range.StartingLine.Number;
            int t = range.EndingLine.Number;
            int endpos = txtSQL.Selection.End;
            for (int i = f; i <= t; i++)
            
                //txtSQL.GoTo.Line(i);
                string tstr = txtSQL.Lines[i].Text.Replace(Environment.NewLine, "");
                txtSQL.Lines[i].Text = "--" + tstr;
            
        
    

【问题讨论】:

【参考方案1】:

经过一番试验,我找到了一种方法来实现这一点。虽然我怀疑它是否是最优雅的解决方案!

    private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e)
    
        if (txtSQL.Selection.Text.Length > 0)
        
            Range range = txtSQL.Selection.Range;
            int f = range.StartingLine.Number;
            int t = range.EndingLine.Number;
            for (int i = f; i <= t; i++)
            
                txtSQL.InsertText(txtSQL.Lines[i].StartPosition,"--");
            
            txtSQL.Selection.Start = txtSQL.Lines[f].StartPosition;
            txtSQL.Selection.End = txtSQL.Lines[t].EndPosition;
        
    

【讨论】:

【参考方案2】:

实际上我找到了一个非常简单的解决方案。阻止评论做

scintilla1.Lexing.LineComment();

并阻止取消注释做

scintilla1.Lexing.LineUncomment();

【讨论】:

不再支持:github.com/jacobslusser/ScintillaNET/issues/286

以上是关于在 ScintillaNET 控件中实现块注释/取消注释的主要内容,如果未能解决你的问题,请参考以下文章

如何将光标移动到 ScintillaNet 控件中特定行的特定位置?

从 ScintillaNet 打印内容时打印行号

ScintillaNET 自动完成列表问题

如何实现 ScintillaNET 列编辑模式

删除并替换 ScintillaNET 中的最后一行

ScintillaNet - 计算出用户点击了哪一行