在代码中突出显示匹配的括号
本文关键字:显示 代码 | 更新日期: 2023-09-27 17:52:35
我想为自己的crisp编写可移植IDE已经有一段时间了,最近开始使用c#。
我通过检查当前字符是否为括号来实现括号高亮显示,然后在整个文本中向后/向前移动,同时跟踪下面的开/闭括号,直到开/闭括号的数量相等。
我已经使用简单的for循环完成了这一点(也可以在找到匹配的括号时"中断"for循环),但是该方法在较大的代码块上很慢。在RichTextBox中突出显示文本的方法似乎也有点低效,即通过编程移动光标并应用突出显示来选择字符,然后取消选择并移动回光标的原始位置。从括号中移开需要清除高亮显示,所以我简单地选择所有文本,然后删除其格式。
如果用户移动光标太快(使用键盘上的箭头键),应用程序有时无法跟踪光标应该在哪里,并且应用程序可能错误地将其移回以前的位置。简单地说,如果用户使用键盘滚动大块代码,我编写的高亮显示函数就无法跟上。
有没有比for循环更有效的方法?我是否只是使用了低效的方法来高亮和取消高亮括号?Regex能提供一个解决方案吗?
虽然我自己写了这段代码,但实际上我做的和Bill The Lizard在这里做的完全一样:我如何在给定的文本中找到匹配的括号或大括号的位置?
我相信Regex在这里帮不了你——在这种情况下,它可能会更慢,因为它仍然需要一个字符一个字符地遍历代码。
然而,有一个"简单"的解决方案-在代码中创建一个所有代码块的树,并在用户更改代码时根据需要更新它(理想情况下,不是每次按键,但如果做得好,即使这是一个选项)。这样,每次移动光标时,您就不必再寻找下一个括号了——您知道自己在哪个代码块中(通过索引进行简单查找),并且您立即知道代码的开始和结束括号在哪里。
该方法假设更新块索引很容易——实际上,它有点容易;如果该块在光标更新时位于光标之前,则不要更改它。如果它在游标之后,将numberOfCharsInserted
添加到所有索引中。简单快捷。当你添加和删除新的代码块时,这变得很棘手,但这也给Visual Studio带来了麻烦::)
另一个有趣的解决方案可能是"空间分区"的变体。将代码分成易于索引的部分(例如,二叉树或散列表)。如果您记住了每个部分中开、闭括号的数量,就可以很快确定要查找的括号的位置,并且基于部分粒度,可以显著减少必须搜索的范围。
有很多方法可以优化搜索,但在某些时候,您必须从头到尾遍历文件。基于典型的用例,您必须选择合适的方法。在这种情况下,我相信简单地记住文件中所有括号的下标将是迄今为止最简单的解决方案,而且它非常快(代码中有多少字符是括号?将1
添加到一百个索引中比搜索一千个字符要快得多。而且你只需要在修改代码的时候这么做!)虽然你说的是LISP,不是吗?可能会有很多括号!: D