2014-03-24 1 views
2

저는 CLisp을위한 휴대용 IDE를 잠시 동안 작성하고 싶었고 최근에 C#을 사용하여 시작했습니다.코드에서 일치하는 대괄호 강조하기

대괄호 강조 표시는 현재 문자가 대괄호인지 확인한 다음 텍스트 전체에서 앞뒤로 이동하면서 대괄호 강조 표시를 구현했지만 여는 대괄호와 닫는 대괄호가 동등해질 때까지 다음 대괄호를 추적합니다.

간단한 for 루프를 사용하여이 작업을 수행했지만 (일치하는 대괄호가 발견되면 for 루프를 "중단") 코드의 크기가 커지면 메소드가 느려집니다. RichTextBox에서 텍스트를 강조 표시하는 방법은 프로그래밍 방식으로 커서를 이동하고 강조 표시를 적용한 다음 커서의 원래 위치로 다시 선택 취소하고 이동하여 문자를 선택하는 데 비효율적 인 것으로 보입니다. 괄호에서 벗어나면 강조 표시가 지워야하므로 모든 텍스트를 선택하고 그 텍스트의 서식을 제거하기 만하면됩니다.

가끔 사용자가 커서를 너무 빠르게 움직이면 (키보드의 화살표 키 사용) 응용 프로그램이 커서가 있어야하는 위치를 추적 할 수 없으며 응용 프로그램이 실수로 이전 위치로 다시 이동할 수 있습니다. 간단히 말해서, 내가 쓴 하이라이트 기능은 사용자가 키보드를 사용하여 큰 코드 블록을 스크롤 할 때 따라 잡을 수 없다.

for 루프 이외의 다른 방법에 대한 효율적인 방법이 있습니까? 괄호를 강조 표시하고 강조 표시하는 비효율적 인 방법을 사용하고 있습니까? Regex가 여기서 해결책을 제시 할 수 있습니까? 나는 본질적으로 코드를 자신의 내 작품을 썼다 동안

나는 빌 도마뱀 여기에 무슨 짓을했는지 정확히 수행 한 : How do I find the position of matching parentheses or braces in a given piece of text?

답변

2

내가 정규식 여기에 도움이되지 않습니다 생각 -이 경우, 아마 느려집니다 , 그것은 여전히 ​​char에 의한 코드 char을 거쳐야하기 때문에.

그러나 코드에있는 모든 코드 블록의 트리를 만들고 사용자가 코드를 변경할 때 (모든 키 누르기가 아닌 이상적으로) 필요에 따라 업데이트하는 "간단한"해결책이 있지만, 심지어 옵션입니다). 그런 다음 커서를 움직일 때마다 다음 브래킷을 더 이상 찾을 필요가 없습니다. 코드 블록 (인덱스로 간단한 조회)을 알고 코드의 시작 및 끝 부분이 어디에 있는지 즉시 알 수 있습니다.

접근 방식은 블록 인덱스를 업데이트하는 것이 쉽다는 것을 전제로합니다. 커서가 업데이트 될 때 블록이 커서 앞에 있으면 변경하지 마십시오. 커서 뒤의 경우 모든 인덱스에 numberOfCharsInserted을 추가하십시오. 간단하고 빠릅니다. 새로운 코드 블록을 추가하고 제거 할 때 까다로워 지지만 Visual Studio에서도 문제가 발생합니다 :))

또 다른 흥미로운 솔루션은 "공간 분할"의 변형 일 수 있습니다. 코드를 쉽게 색인 할 수있는 섹션 (예 : 2 진 트리 또는 해시 테이블)으로 분할하십시오. 이 섹션들 각각에서 여는 괄호와 닫는 괄호의 수를 기억한다면 찾고자하는 괄호의 위치를 ​​매우 빠르게 결정할 수 있으며 섹션 세분성에 따라 검색해야하는 것을 상당히 줄일 수 있습니다.

검색을 최적화하는 데는 여러 가지 방법이 있지만 처음부터 끝까지 파일을 검토하면됩니다. 일반적인 유스 케이스를 기반으로 적절한 방법을 선택해야합니다. 이 경우 파일의 모든 괄호의 인덱스를 기억하는 것이 가장 쉬운 해결책 일 것입니다. 코드에서 얼마나 많은 문자가 괄호로 묶여 있습니까? 1을 100 개의 인덱스에 추가하는 것이 훨씬 빠르고 수천 개의 문자를 검색하면됩니다. 코드를 변경하는 동안 코드를 변경하면됩니다.). 당신이 LISP를 말했지 만, 그렇지 않습니까? 그것은 대괄호가 될 수 있습니다!: D

+0

그래, 그게 Lisp의 문제이고, 왜 적절한 (그리고 빠른) 괄호 하이라이트가 나에게 그렇게 중요한지. 나는 괄호의 모든 색인을 기억하고 있다는 당신의 생각을 좋아합니다. 아마도 그것은 심지어 배경 스레드에 의해 수행 될 수 있습니다. – janvdl

+0

@janvdl 그래, 단지 그것이 일관성을 유지하는지 확인하십시오. 당신은 실제로 그 인덱스를 적절하게 증가시킵니다. (한 번에 하나의 증가 작업 만 허용 할 수 있습니다. 둘 이상의 변경 사항을 버퍼링 한 경우 한 번에 적용하려고 시도하십시오. 예를 들어 10을 작성하는 경우 문자가 색인 유지 전에 유지 관리하려면 두 번 - 첫 번째 문자에 대해 한 번, 그리고 다른 9 개의 문자에 대해 한 번 - 두 번만 업데이트를 수행하십시오. 특히 문자가 하나에서 작성된 경우 위치 (경우에 따라 다름)를 사용하면 많은 시간을 절약 할 수 있습니다. – Luaan

관련 문제