C#中RichTextEditor的代码缩进

时间:2017-06-04 01:31:42

标签: c# winforms

我在C#中使用自己的基本语法高亮编辑器。我已经完成了关键字,功能等的自动着色。我不需要任何其他花哨的东西,如自动代码缩进。

但是,我希望有一个代码minify / maxify按钮。没有什么花哨。我只是希望它能够在任何左括号之前自动设置换行符,并在其后面使用制表符或更改SelectionIndent Property自动设置换行符。

这样的事情:

test { test { test } test }

变为:

test
{
    test
    {
        test
    }
}

当然,缩小按钮应该完全相反,将所有内容放在一行。

我已尝试使用Regex.Replace Method。我没有完全开始工作,但考虑到这种方法,如果开始和结束括号混在一起会导致问题。无论如何,这是我一直以来我放弃了,并决定请你们帮忙:

string tabs = "";

private void btnMax_Click(object sender, EventArgs e)
{
    var count = codeRichTextBox.Text.Count(x => x == '{');
    for(int i=1; i<= count; i++)
    {
        // The idea was to add \t to tabs here on each iteration
    }
    string pattern = "{";
    string replacement = "\n{\n\t";
    Regex rgx = new Regex(pattern);
    string result = rgx.Replace(codeRichTextBox.Text, replacement);

    codeRichTextBox.Text = result;
}

显然,解决方案是错误的方法,并且不会起作用。那我该怎么做呢?

编辑:虽然它会很好,但它不必考虑字符串的一部分已经有代码缩进。 maxify按钮只需要处理单行上的字符串。

1 个答案:

答案 0 :(得分:2)

我的想法:你需要解析文本,计算{和}的当前嵌套级别。

对于找到的每个{或},根据当前嵌套级别确定正确的空格 - 字符串 - 前(前缀)和空格 - 字符串 - 后(后缀)(例如,仅为\ n {\ n为第一级) )。

查看是否已存在所需的前缀。如果没有,删除任何现有的空格,然后添加前缀。对后缀执行相同的操作。