2017-06-04 78 views
1

我正在使用C#編寫自己的基本語法高亮編輯器。我已經完成了關鍵字,函數等的自動着色。我不需要任何其他花哨的東西,如自動代碼縮進。RichTextEditor在C#中的代碼縮進

但是,我希望有一個代碼縮小/最大化按鈕。沒有什麼花哨。我只是希望它能夠在任何開頭括號之前自動設置換行符,並且在換行符後面或者更改SelectionIndent Property之後自動設置換行符。

因此,像這樣:

test { test { test } test } 

變爲:

test 
{ 
    test 
    { 
     test 
    } 
} 

,當然還有縮小按鈕應該做的正好相反,把一切在1號線。

我已經嘗試使用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; 
} 

顯然,該解決方案是錯誤的做法,而不是去上班。那麼我該怎麼做呢?

編輯:雖然它會很好,但它不必考慮字符串的一部分已經有代碼縮進。最大化按鈕只需要處理一行中的字符串。

+0

無論您使用什麼方法,請確保您的代碼足夠聰明,以忽略字符串和註釋中出現的任何括號。 – RJM

+0

@RJM通常我會同意你的看法,但由於這將是Minecraft命令塊的編輯器,所以我絕對確信永遠不會出現這種情況。感謝您的提示 – icecub

回答

2

我的想法:您需要解析文本,計算{和}的當前嵌套級別。

對於每個找到的,根據當前的嵌套級別決定合適的whitespace-string-before(prefix)和whitespace-string-after(suffix)(例如,對於第一個水平)。

查看所需的前綴是否已經存在。如果不是,刪除任何現有的空白,然後添加前綴。爲後綴做同樣的事情。

+0

似乎有趣的想法!我正在與它一起工作。會讓你知道:) – icecub

+0

我花了幾個小時來擺弄你的想法,但它的工作完美!感謝您指出正確的方向! – icecub