2014-11-25 11 views
0

정규식을 사용하여 Scintilla에서 구문 강조를 정의 할 수 있습니까? 그렇다면 어떻게해야합니까?Scintilla.NET 정규식 기반 구문 하이라이팅

처리 할 사용자 지정 언어가 있으며 키워드와 구분 기호로 간단하게 설명 할 수 없습니다. 이 언어의 특정 구조의 의미는 키워드와의 상대적인 위치에만 의존합니다. 이 형식에 대한 정규 표현식 기반 파서가 있는데 필요한 것은 정규 표현식 정의 된 규칙을 텍스트 스타일로 적용하는 것입니다.

뭔가가 regex1과 일치하면 스타일 1을 가져야 함을 의미합니다. 가능한가? 방법?

그렇지 않은 경우 수동으로 선택한 범위의 스타일을 설정할 수 있습니까? 에디터에서 지정된 문자 범위에 스타일 번호를 지정하려고합니다. 그것을하는 방법?

Scintilla 스타일을 XML 파일이 아닌 코드에 정의 할 수 있습니까?

편집 : 그래, 길을 찾았습니다.

foreach (Match m in Patterns.Keyword0.Matches(Encoding.ASCII.GetString(e.RawText))) 
         e.GetRange(m.Index, m.Index + m.Length).SetStyle(1); 

문제는 RawText 속성입니다. UTF-8로 인코딩 된 텍스트의 바이트 버퍼입니다. 텍스트 속성에는 멋진 UTF-16 텍스트가 포함되어 있지만 GetRage 메서드는 문자 오프셋이 아닌 바이트 오프셋을 허용합니다. 각 TextChanged 이벤트에서 변환을 사용하면 Scintilla를 사용하여 거의 모든 속도 이점을 잃게됩니다.

물론 가장 쉬운 방법은 내부 인코딩을 UTF-16으로 변경하는 것입니다.하지만 그렇게하면 인코딩이 지원되지 않는다는 예외가 발생합니다. 유일하게 지원되는 것은 엄청나게 어려운 (그리고 느린) 처리가 가능한 UTF-8 인 것 같습니다.

여기 벽에 부딪치고 있습니다.

답변

1

이 키는 렉서를 SCLEX_CONTAINER으로 설정 한 다음 SCN_STYLENEEDED 알림을 처리하는 것입니다. 즉, 실제로는 스타일링이 필요한 텍스트 만 처리해야합니다.

상단에는 여러 가지 안내가있어 세관 렉서 구현의 다양한 측면을 자세히 설명하므로 여기에서 그 중 일부를 반복하지 않아도됩니다.

성능에 관해서는 : 사용자 지정 scintilla lexers는 스타일을 지정할 때 utf-8로 디코드하고 중요한 문제를 발견하지 못했기 때문에 적어도 C#을 사용하여 일치시킬 수 없다면 놀라실 것입니다. .

+0

나는 신틸라에게 두 번째 시도를해야만하는 것처럼 보입니다. 첫 번째 시도에서 강조 표시된 텍스트를 편집하는 중에 용인 할 수없는 지연이 발생했습니다. 현재 파서가 외부 DLL로 컴파일 될 때 나는 빠르게 타오르는 것으로 판명 된 FTCB에 머물러 있습니다. 두 사람은 서로 매우 유사합니다. 거의 동일한 기능. – Harry