-2

我想制作一个代码编辑控件,它可以像 Visual Studio 一样格式化文本,直到现在我已经实现了语法高亮和自动完成,但我想在嵌套的花括号中格式化文本。例如:考虑一个 for 循环,

for(int i=0;i<=10;i++)
{
Function_One();              //This should be a tab away from first brace
Function_Two();              //So with this
if(a==b)                     //So with this
{                            //This should be four tabs away from first brace
MessageBox.Show("Some text");//This should be six tabs away from first brace
}                            //This should be four tabs away from first brace
}

现在我想要的是这应该看起来像这样,

for(int i=0;i<=10;i++)
{
   Function_One();              
   Function_Two();              
   if(a==b)                     
   {                            
      MessageBox.Show("Some text");
   }                            
}

我已经尝试过正则表达式,但在某些时候它们无法匹配,所以我尝试将它与代码匹配,但代码无法匹配非常深的嵌套代码或很难实现,所以有什么方法可以实现这一点,还有一个我在 Winforms 中使用 C# 控制 RichTextBox 做这一切。

4

2 回答 2

1

这绝不是一个简单的壮举,我不知道您可以利用任何工具或插件,我唯一的建议是研究 Monodevelop 的实现。

有关详细信息,请参阅 MonoDevelop 的github

于 2013-08-09T21:14:34.383 回答
0

我认为实现这一点的最佳方法是为您的表单创建一些全局变量:

private int _nestedBracketCount = 0;
private const string TabString = "    ";
private const int TabSpaces = 4;

然后KeyPressed在富文本框的事件处理程序中处理所有这些:

private void richTextBox1_OnKeyPress(object sender, KeyPressEventArgs e) {
    var currentLength = richTextBox1.Text.Length;

    if (e.KeyChar == '{') {
        // need to increment bracket counter
        _nestedBracketCount++;
    } else if (e.KeyChar == '}') {
        // remove last #(TabSpaces) characters from the richtextbox
        richTextBox1.Text.Remove(currentLength - TabSpaces);
        _nestedBracketCount--;
        richTextBox1.AppendText("}");
        e.Handled = true;
    } else if (e.KeyChar == (char)13) {
        // append newline and correct number of tabs.
        var formattedSpaces = string.Empty;
        for (var i = 0; i < _nestedBracketCount; i++)
            formattedSpaces += TabString;
        richTextBox1.AppendText("\n" + formattedSpaces);
        e.Handled = true;
    }
}

我认为这应该为您提供一个不错的起点。

于 2013-08-09T21:55:17.193 回答