편집기 기본 사항
편집기는 편집기 텍스트 모델을 텍스트 보기 및 사용자 인터페이스와 별도로 유지하도록 설계된 여러 하위 시스템으로 구성됩니다.
다음 섹션에서는 편집기의 다양한 측면에 대해 설명합니다.
다음 섹션에서는 편집기의 기능에 대해 설명합니다.
하위 시스템
텍스트 모델 하위 시스템
텍스트 모델 하위 시스템은 텍스트를 표시하고 조작을 사용하도록 설정하는 역할을 합니다. 텍스트 모델 하위 시스템에는 편집기에서 표시할 문자 시퀀스를 설명하는 ITextBuffer 인터페이스가 포함되어 있습니다. 이 텍스트는 여러 가지 방법으로 수정, 추적 및 조작할 수 있습니다. 또한 텍스트 모델은 다음 측면에 대한 형식을 제공합니다.
텍스트를 파일과 연결하고 파일 시스템에서 읽기 및 쓰기를 관리하는 서비스입니다.
두 개체 시퀀스의 최소 차이점을 찾는 차별화 서비스입니다.
다른 버퍼에 있는 텍스트의 하위 집합으로 버퍼의 텍스트를 설명하는 시스템입니다.
텍스트 모델 하위 시스템에는 UI(사용자 인터페이스) 개념이 없습니다. 예를 들어, 텍스트 서식 지정 또는 텍스트 레이아웃을 담당하지 않으며 텍스트와 연결될 수 있는 시각적 도구 영역에 대한 정보가 없습니다.
텍스트 모델 하위 시스템의 공개 형식은 .NET Framework 기본 클래스 라이브러리와 MEF(Managed Extensibility Framework)에만 의존하는 Microsoft.VisualStudio.Text.Data.dll 및 Microsoft.VisualStudio.CoreUtility.dll에 포함되어 있습니다.
텍스트 보기 하위 시스템
텍스트 보기 하위 시스템은 텍스트 서식 지정 및 표시를 담당합니다. 이 하위 시스템의 형식은 해당 형식이 WPF(Windows Presentation Foundation)를 사용하는지 여부에 따라 두 개의 계층으로 나뉩니다. 가장 중요한 형식은 표시할 텍스트 줄 집합을 제어하는 ITextView 및 IWpfTextView이며 WPF UI 요소를 사용하여 텍스트를 표시하기 위한 캐럿, 선택 영역 및 기능도 있습니다. 또한 이 하위 시스템은 텍스트 표시 영역 주위에 여백을 제공합니다. 이러한 여백은 확장될 수 있으며 다양한 종류의 콘텐츠 및 시각적 효과를 포함할 수 있습니다. 여백의 예로는 줄 번호 표시 및 스크롤 막대가 있습니다.
텍스트 보기 하위 시스템의 공개 형식은 Microsoft.VisualStudio.Text.UI.dll 및 Microsoft.VisualStudio.Text.UI.Wpf.dll에 포함되어 있습니다. 첫 번째 어셈블리에는 플랫폼 독립 요소가 포함되고 두 번째 어셈블리에는 WPF 관련 요소가 포함됩니다.
분류 하위 시스템
분류 하위 시스템은 텍스트의 글꼴 속성을 결정합니다. 분류자는 텍스트를 다른 클래스(예: "키워드" 또는 "주석")로 나눕니다. 분류 형식 맵은 이러한 클래스를 실제 글꼴 속성(예: "Blue Consolas 10 pt")과 연결합니다. 이 정보는 텍스트의 서식을 지정하고 렌더링할 때 텍스트 보기에서 사용됩니다. 이 항목의 뒷부분에서 자세히 설명하는 태그 지정을 사용하면 데이터를 텍스트 범위와 연결할 수 있습니다.
분류 하위 시스템의 공개 형식은 Microsoft.VisualStudio.Text.Logic.dll에 포함되어 있으며 Microsoft.VisualStudio.Text.UI.Wpf.dll에 포함된 분류의 시각적 측면과 상호 작용합니다.
운영 하위 시스템
운영 하위 시스템은 편집기 동작을 정의합니다. Visual Studio 편집기 명령 및 실행 취소 시스템에 대한 구현을 제공합니다.
텍스트 모델 및 텍스트 보기 자세히 살펴보기
텍스트 모델
텍스트 모델 하위 시스템은 다양한 텍스트 형식 그룹으로 구성됩니다. 여기에는 텍스트 버퍼, 텍스트 스냅샷 및 텍스트 범위가 포함됩니다.
텍스트 버퍼 및 텍스트 스냅샷
ITextBuffer 인터페이스는 .NET Framework의 String
형식에서 사용하는 인코딩인 UTF-16을 사용하여 인코딩된 유니코드 문자 시퀀스를 나타냅니다. 텍스트 버퍼는 파일 시스템 문서로 보관될 수 있지만 필수는 아닙니다.
ITextBufferFactoryService는 빈 텍스트 버퍼 또는 문자열이나 TextReader에서 초기화된 텍스트 버퍼를 만드는 데 사용됩니다. 텍스트 버퍼는 ITextDocument로 파일 시스템에 보관될 수 있습니다.
모든 스레드는 스레드가 TakeThreadOwnership을 호출하여 텍스트 버퍼의 소유권을 가질 때까지 텍스트 버퍼를 편집할 수 있습니다. 그 후에는 해당 스레드만 편집할 수 있습니다.
텍스트 버퍼는 수명 동안 여러 버전을 거칠 수 있습니다. 버퍼가 편집될 때마다 새 버전이 생성되고 변경할 수 없는 ITextSnapshot은 해당 버전의 버퍼 내용을 나타냅니다. 텍스트 스냅샷은 변경할 수 없으므로 텍스트 스냅샷이 나타내는 텍스트 버퍼가 계속 변경되더라도 제한 없이 모든 스레드에서 텍스트 스냅샷에 액세스할 수 있습니다.
텍스트 스냅샷 및 텍스트 스냅샷 줄
텍스트 스냅샷의 내용을 문자 시퀀스 또는 줄 시퀀스로 볼 수 있습니다. 문자와 줄은 모두 0부터 인덱싱됩니다. 빈 텍스트 스냅샷에는 0개의 문자와 한 개의 빈 줄이 있습니다. 줄은 유효한 유니코드 줄 바꿈 문자 시퀀스나 버퍼의 시작 또는 끝으로 구분됩니다. 줄 바꿈 문자는 텍스트 스냅샷에 명시적으로 표시되며 텍스트 스냅샷의 줄 바꿈이 모두 같을 필요는 없습니다.
참고
Visual Studio 편집기에서 줄 바꿈 문자에 대한 자세한 내용은 인코딩 및 줄 바꿈을 참조하세요.
텍스트의 줄은 특정 줄 번호 또는 특정 문자 위치에 대한 텍스트 스냅샷에서 가져올 수 있는 ITextSnapshotLine 개체로 표시됩니다.
SnapshotPoints, SnapshotSpans 및 NormalizedSnapshotSpanCollections
SnapshotPoint는 스냅샷의 문자 위치를 나타냅니다. 이 위치는 스냅샷의 길이와 0 사이에 있습니다. SnapshotSpan은 스냅샷의 텍스트 범위를 나타냅니다. End 위치는 스냅샷의 길이와 0 사이에 있습니다. NormalizedSnapshotSpanCollection은 동일한 스냅샷의 SnapshotSpan 개체 세트로 구성됩니다.
Spans 및 NormalizedSpanCollections
Span은 텍스트 스냅샷의 텍스트 범위에 적용할 수 있는 간격을 나타냅니다. 스냅샷 위치는 0부터 시작하므로 범위는 0을 포함한 모든 위치에서 시작할 수 있습니다. 범위의 End
속성은 해당 Start
속성과 해당 Length
속성의 합과 같습니다. Span
에는 End
속성으로 인덱싱된 문자가 포함되지 않습니다. 예를 들어, Start=5이고 Length=3인 범위는 End=8이며 위치 5, 6, 7의 문자를 포함합니다. 이 범위의 표기법은 [5..8)입니다.
End 위치를 포함하여 공통 위치가 있는 경우 두 범위가 교차합니다. 따라서 [3, 5)와 [2, 7)의 교집합은 [3, 5)이고, [3, 5)와 [5, 7)의 교집합은 [5, 5)입니다. ([5, 5)는 빈 범위입니다.)
End 위치를 제외하고 공통 위치가 있는 경우 두 범위가 겹칩니다. 빈 범위는 다른 범위와 겹치지 않으며 두 범위의 겹침은 비어 있지 않습니다.
NormalizedSpanCollection은 범위의 Start 속성 순서에 따른 범위 목록입니다. 목록에서 겹치거나 인접한 범위가 병합됩니다. 예를 들어, 범위 세트 [5..9), [0..1), [3..6) 및 [9..10)이 주어지면 정규화된 범위 목록은 [0..1), [3..10)입니다.
ITextEdit, TextVersion 및 텍스트 변경 알림
텍스트 버퍼의 내용은 ITextEdit 개체를 사용하여 변경할 수 있습니다. ITextBuffer의 CreateEdit()
메서드 중 하나를 사용하여 이러한 개체를 만들면 텍스트 편집으로 구성된 텍스트 트랜잭션이 시작됩니다. 모든 편집은 버퍼에 있는 일부 텍스트 범위를 문자열로 바꾸는 것입니다. 모든 편집의 좌표와 내용은 트랜잭션이 시작되었을 때 버퍼의 스냅샷을 기준으로 표현됩니다. ITextEdit 개체는 동일한 트랜잭션의 다른 편집에 의해 영향을 받는 편집의 좌표를 조정합니다.
예를 들어, 다음 문자열을 포함하는 텍스트 버퍼를 고려해보세요.
abcdefghij
두 개의 편집이 포함된 트랜잭션을 적용합니다. 첫 번째 편집은 문자 X
를 사용하여 [2..4)의 범위를 대체하고 두 번째 편집은 문자 Y
를 사용하여 [6..9)의 범위를 대체합니다. 그 결과는 다음 버퍼와 같습니다.
abXefYj
두 번째 편집의 좌표는 첫 번째 편집이 적용되기 전 트랜잭션 시작 시 버퍼의 내용과 관련하여 계산되었습니다.
버퍼에 대한 변경 내용은 Apply()
메서드를 호출하여 ITextEdit 개체가 커밋될 때 적용됩니다. 비어 있지 않은 편집이 하나 이상 있는 경우 새 ITextVersion이 생성되고 새 ITextSnapshot이 생성되며 하나의 Changed
이벤트가 발생합니다. 모든 텍스트 버전에는 다른 텍스트 스냅샷이 있습니다. 텍스트 스냅샷은 편집 트랜잭션 후 텍스트 버퍼의 전체 상태를 나타내지만 텍스트 버전은 한 스냅샷에서 다음 스냅샷으로의 변경 내용만 설명합니다. 일반적으로 텍스트 스냅샷은 한 번 사용하고 버려야 하는 반면 텍스트 버전은 일정 시간 동안 활성 상태를 유지해야 합니다.
텍스트 버전에는 INormalizedTextChangeCollection이 포함되어 있습니다. 이 컬렉션은 스냅샷에 적용될 때 후속 스냅샷을 생성하는 변경 내용을 설명합니다. 컬렉션의 모든 ITextChange에는 변경 내용의 문자 위치, 대체된 문자열 및 대체 문자열이 포함됩니다. 기본 삽입의 경우 대체된 문자열이 비어 있고 기본 삭제의 경우 대체 문자열이 비어 있습니다. 정규화된 컬렉션은 가장 최신 버전의 텍스트 버퍼에 대해 항상 null
입니다.
언제든지 텍스트 버퍼에 대해 하나의 ITextEdit 개체만 인스턴스화할 수 있으며 모든 텍스트 편집은 텍스트 버퍼를 소유한 스레드에서 수행해야 합니다(소유권이 주장된 경우). Cancel
메서드 또는 Dispose
메서드를 호출하여 텍스트 편집을 중단할 수 있습니다.
ITextBuffer는 ITextEdit 인터페이스에서 볼 수 있는 것과 유사한 Insert()
, Delete()
및 Replace()
메서드도 제공합니다. 이러한 메서드를 호출하면 ITextEdit 개체를 만들고 유사한 호출을 수행한 다음, 편집을 적용하는 것과 동일한 효과를 냅니다.
추적 지점 및 추적 범위
ITrackingPoint는 텍스트 버퍼의 문자 위치를 나타냅니다. 버퍼가 문자의 위치를 이동하는 방식으로 편집되면 추적 지점이 함께 이동합니다. 예를 들어, 추적 지점이 버퍼의 위치 10을 가리키고 버퍼의 시작 부분에 5개의 문자가 삽입된 경우 추적 지점은 위치 15를 가리킵니다. 삽입이 추적 지점으로 표시된 정확한 위치에서 발생하는 경우 해당 동작은 PointTrackingMode에 의해 결정되며, 이는 Positive
또는 Negative
일 수 있습니다. 추적 모드가 양수이면 추적 지점은 이제 삽입의 끝에 있는 동일한 문자를 가리킵니다. 추적 모드가 음수이면 추적 지점은 원래 위치에 처음 삽입된 문자를 가리킵니다. 추적 지점으로 표시되는 위치의 문자가 삭제되면 추적 지점이 삭제된 범위의 첫 번째 문자로 이동합니다. 예를 들어, 추적 지점이 위치 5의 문자를 가리키고 위치 3에서 6까지의 문자가 삭제되는 경우 추적 지점은 위치 3의 문자를 가리킵니다.
ITrackingSpan은 단지 하나의 위치가 아닌 문자 범위를 나타냅니다. 해당 동작은 SpanTrackingMode에 의해 결정됩니다. 범위 추적 모드가 SpanTrackingMode.EdgeInclusive인 경우 추적 범위는 가장자리에 삽입된 텍스트를 통합하도록 확장됩니다. 범위 추적 모드가 SpanTrackingMode.EdgeExclusive인 경우 추적 범위는 가장자리에 삽입된 텍스트를 통합하지 않습니다. 그러나 범위 추적 모드가 SpanTrackingMode.EdgePositive인 경우 삽입은 현재 위치를 시작 쪽으로 푸시하고, 범위 추적 모드가 SpanTrackingMode.EdgeNegative이면 삽입은 현재 위치를 끝 쪽으로 푸시합니다.
추적 지점의 위치 또는 추적 범위가 속한 텍스트 버퍼의 모든 스냅샷에 대한 추적 범위를 가져올 수 있습니다. 추적 지점 및 추적 범위는 모든 스레드에서 안전하게 참조할 수 있습니다.
내용 유형
콘텐츠 형식은 다양한 종류의 콘텐츠를 정의하기 위한 메커니즘입니다. 콘텐츠 형식은 "텍스트", "코드" 또는 "이진"과 같은 파일 형식이거나 "xml", "vb" 또는 "c#"과 같은 기술 형식일 수 있습니다. 예를 들어, "using"이라는 단어는 C#과 Visual Basic 모두에서 키워드이지만 다른 프로그래밍 언어에서는 키워드가 아닙니다. 따라서 이 키워드의 정의는 "c#" 및 "vb" 콘텐츠 형식으로 제한됩니다.
콘텐츠 형식은 편집기의 도구 영역 및 기타 요소에 대한 필터로 사용됩니다. 많은 편집기 기능 및 확장 지점이 콘텐츠 형식별로 정의됩니다. 예를 들어, 텍스트 색 지정은 일반 텍스트 파일, XML 파일 및 Visual Basic 소스 코드 파일에 따라 다릅니다. 텍스트 버퍼는 일반적으로 생성될 때 콘텐츠 형식이 할당되며 텍스트 버퍼의 콘텐츠 형식은 변경될 수 있습니다.
콘텐츠 형식은 다른 콘텐츠 형식에서 다중 상속될 수 있습니다. ContentTypeDefinition을 사용하면 여러 기본 형식을 지정된 콘텐츠 형식의 부모로 지정할 수 있습니다.
개발자는 자체 콘텐츠 형식을 정의하고 IContentTypeRegistryService를 사용하여 등록할 수 있습니다. ContentTypeAttribute를 사용하여 특정 콘텐츠 형식과 관련하여 많은 편집기 기능을 정의할 수 있습니다. 예를 들어, 편집기 여백, 도구 영역 및 마우스 처리기는 특정 콘텐츠 형식을 표시하는 편집기에만 적용되도록 정의할 수 있습니다.
텍스트 보기
MVC(Model View Controller) 패턴의 보기 부분은 텍스트 보기, 보기의 서식 지정, 스크롤 막대와 같은 그래픽 요소 및 캐럿을 정의합니다. Visual Studio 편집기의 모든 프레젠테이션 요소는 WPF를 기반으로 합니다.
텍스트 보기
ITextView 인터페이스는 텍스트 보기의 플랫폼 독립적 표현입니다. 주로 창에 텍스트 문서를 표시하는 데 사용되지만 도구 설명과 같은 다른 용도로도 사용할 수 있습니다.
텍스트 보기는 다양한 종류의 텍스트 버퍼를 참조합니다. TextViewModel 속성은 최상위 데이터 수준 버퍼인 데이터 버퍼, 편집이 수행되는 편집 버퍼 및 텍스트 보기에 표시되는 버퍼인 시각적 버퍼의 세 가지 서로 다른 텍스트 버퍼를 가리키는 ITextViewModel 개체를 나타냅니다.
텍스트는 기본 텍스트 버퍼에 연결된 분류자를 기반으로 서식이 지정되며 텍스트 보기 자체에 연결된 도구 영역 공급자를 사용하여 표시됩니다.
텍스트 보기 좌표계
텍스트 보기 좌표계는 텍스트 보기의 위치를 지정합니다. 이 좌표계에서 x 값 0.0은 표시되는 텍스트의 왼쪽 가장자리에 해당하며 y 값 0.0은 표시되는 텍스트의 위쪽 가장자리에 해당합니다. x 좌표는 왼쪽에서 오른쪽으로 증가하고 y 좌표는 위에서 아래로 증가합니다.
뷰포트(텍스트 창에 표시되는 텍스트 부분)는 세로로 스크롤되는 것과 같은 방식으로 가로로 스크롤할 수 없습니다. 뷰포트는 그리기 화면을 기준으로 이동하도록 왼쪽 좌표를 변경하여 가로로 스크롤됩니다. 그러나 뷰포트는 렌더링된 텍스트를 변경해야만 세로로 스크롤할 수 있으며, 이로 인해 LayoutChanged 이벤트가 발생합니다.
좌표계의 거리는 논리 픽셀에 해당합니다. 크기 조정 변환 없이 텍스트 렌더링 화면이 표시되면 텍스트 렌더링 좌표계의 한 단위가 디스플레이의 1픽셀에 해당합니다.
여백
ITextViewMargin 인터페이스는 여백을 나타내며 여백의 표시 유형 및 크기를 제어할 수 있습니다. "위쪽", "왼쪽", "오른쪽" 및 "아래쪽"이라는 네 개의 미리 정의된 여백이 있으며 보기의 위쪽, 아래쪽, 왼쪽 또는 오른쪽 가장자리에 연결됩니다. 이러한 여백은 다른 여백을 배치할 수 있는 컨테이너입니다. 인터페이스는 여백의 크기와 여백의 표시 유형을 반환하는 메서드를 정의합니다. 여백은 연결된 텍스트 보기에 대한 추가 정보를 제공하는 시각적 요소입니다. 예를 들어, 줄 번호 여백은 텍스트 보기의 줄 번호를 표시합니다. 문자 모양 여백은 UI 요소를 표시합니다.
IWpfTextViewMarginProvider 인터페이스는 여백의 생성 및 배치를 처리합니다. 여백은 다른 여백과 관련하여 정렬할 수 있습니다. 우선 순위가 높은 여백은 텍스트 보기에 더 가깝게 배치됩니다. 예를 들어, 여백 A와 여백 B라는 왼쪽 여백이 두 개 있고 여백 B가 여백 A보다 우선 순위가 낮은 경우 여백 B는 여백 A의 왼쪽에 나타납니다.
텍스트 보기 호스트
IWpfTextViewHost 인터페이스에는 텍스트 보기와 보기와 함께 제공되는 모든 인접 장식(예: 스크롤 막대)이 포함되어 있습니다. 텍스트 보기 호스트에는 보기의 테두리에 연결된 여백도 포함됩니다.
서식 있는 텍스트
텍스트 보기에 표시되는 텍스트는 ITextViewLine 개체로 구성됩니다. 모든 텍스트 보기 줄은 텍스트 보기의 텍스트 한 줄에 해당합니다. 기본 텍스트 버퍼의 긴 줄은 부분적으로 가려지거나(단어 줄 바꿈을 사용하지 않는 경우) 여러 텍스트 보기 줄로 나눌 수 있습니다. ITextViewLine 인터페이스에는 좌표와 문자 간의 매핑 및 줄과 연결될 수 있는 도구 영역에 대한 메서드 및 속성이 포함되어 있습니다.
ITextViewLine 개체는 IFormattedLineSource 인터페이스를 사용하여 만들어집니다. 현재 보기에 표시되는 텍스트에만 관련이 있는 경우 서식 원본을 무시할 수 있습니다. 보기에 표시되지 않는 텍스트 형식(예: 서식 있는 텍스트 잘라내기 및 붙여넣기 지원)에 관심이 있는 경우 IFormattedLineSource를 사용하여 텍스트 버퍼의 텍스트 서식을 지정할 수 있습니다.
텍스트 보기는 한 번에 하나의 ITextSnapshotLine 서식을 지정합니다.
편집기 기능
편집기의 기능은 기능의 정의가 구현과 분리되도록 설계되었습니다. 편집기는 다음 기능을 포함합니다.
태그 및 분류자
도구 영역
프로젝션
개요
마우스 및 키 바인딩
작업 및 기본 형식
IntelliSense
태그 및 분류자
태그는 텍스트 범위와 연결된 마커입니다. 예를 들어, 텍스트 색 지정, 밑줄, 그래픽 또는 팝업 항목을 사용하여 다양한 방식으로 표시할 수 있습니다. 분류자는 태그의 한 종류입니다.
다른 종류의 태그에는 텍스트 강조 표시를 위한 TextMarkerTag, 개요를 위한 OutliningRegionTag 및 컴파일 오류를 위한 ErrorTag가 있습니다.
분류 유형
IClassificationType 인터페이스는 텍스트의 추상 범주인 동등 클래스를 나타냅니다. 분류 유형은 다른 분류 유형에서 다중 상속될 수 있습니다. 예를 들어, 프로그래밍 언어 분류에는 모두 "코드"에서 상속되는 "키워드", "주석" 및 "식별자"가 포함될 수 있습니다. 자연어 분류 유형에는 모두 "자연어"에서 상속되는 "명사", "동사" 및 "형용사"가 포함될 수 있습니다.
분류
분류는 일반적으로 텍스트 범위에 대한 특정 분류 유형의 인스턴스입니다. ClassificationSpan은 분류를 나타내는 데 사용됩니다. 분류 범위는 텍스트의 특정 범위를 커버하고 이 텍스트 범위가 특정 분류 유형임을 시스템에 알리는 레이블로 생각할 수 있습니다.
분류자
IClassifier는 텍스트를 분류 세트로 나누는 메커니즘입니다. 분류자는 특정 콘텐츠 형식에 대해 정의되고 특정 텍스트 버퍼에 대해 인스턴스화되어야 합니다. 클라이언트는 텍스트 분류에 참여하기 위해 IClassifier를 구현해야 합니다.
분류자 수집기
분류자 수집기는 하나의 텍스트 버퍼에 대한 모든 분류자를 하나의 분류 세트로 결합하는 메커니즘입니다. 예를 들어, C# 분류자와 영어 분류자는 모두 C# 파일의 주석에 대한 분류를 만들 수 있습니다. 다음 주석을 고려하세요.
// This method produces a classifier
C# 분류자는 전체 범위에 주석으로 레이블을 지정할 수 있으며 영어 분류자는 "produces"를 "동사"로, "method"를 "명사"로 분류할 수 있습니다. 수집기는 겹치지 않는 분류 세트를 생성하며 집합 유형은 모든 기여를 기반으로 합니다.
분류자 수집기는 텍스트를 분류 세트로 나누기 때문에 분류자이기도 합니다. 또한 분류자 수집기는 겹치는 분류가 없고 분류가 정렬되도록 합니다. 개별 분류자는 어떤 순서로든 어떤 방식으로든 겹치는 분류 세트를 자유롭게 반환할 수 있습니다.
분류 형식 및 텍스트 색 지정
텍스트 서식 지정은 텍스트 분류를 기반으로 하는 기능의 예입니다. 텍스트 보기 계층에서 애플리케이션의 텍스트 표시를 결정하는 데 사용됩니다. 텍스트 서식 지정 영역은 WPF에 따라 다르지만 분류의 논리적 정의는 그렇지 않습니다.
분류 형식은 특정 분류 유형에 대한 형식 지정 속성 세트입니다. 이러한 형식은 분류 유형의 부모 형식에서 상속됩니다.
IClassificationFormatMap은 분류 유형에서 텍스트 서식 지정 속성 세트까지의 맵입니다. 편집기에서 형식 맵을 구현하면 분류 형식의 모든 내보내기가 처리됩니다.
도구 영역
도구 영역은 텍스트 보기에 있는 문자의 글꼴 및 색과 직접적인 관련이 없는 그래픽 효과입니다. 예를 들어, 많은 프로그래밍 언어에서 컴파일되지 않은 코드를 표시하는 데 사용되는 빨간색 물결선 밑줄은 포함된 도구 영역이며 도구 설명은 팝업 항목 도구 영역입니다. 도구 영역은 UIElement에서 파생되고 ITag를 구현합니다. 두 가지 특수한 유형의 도구 영역 태그는 보기의 텍스트와 동일한 공간을 차지하는 도구 영역을 위한 SpaceNegotiatingAdornmentTag와 물결선 밑줄을 위한 ErrorTag입니다.
포함된 도구 영역은 서식이 지정된 텍스트 보기의 일부를 구성하는 그래픽입니다. 이러한 도구 영역은 서로 다른 Z 순서 계층으로 구성됩니다. 텍스트, 캐럿 및 선택 영역과 같은 세 가지의 기본 제공 계층이 있습니다. 그러나 개발자는 더 많은 계층을 정의하고 서로에 대해 순서를 정할 수 있습니다. 포함된 도구 영역의 세 가지 종류는 텍스트 관련 도구 영역(텍스트가 이동할 때 이동하고 텍스트가 삭제될 때 삭제됨), 보기 관련 도구 영역(보기의 텍스트가 아닌 부분과 관련이 있음) 및 소유자 제어 도구 영역(개발자가 배치를 관리해야 함)입니다.
팝업 항목 도구 영역은 도구 설명과 같이 텍스트 보기 위의 작은 창에 나타나는 그래픽입니다.
프로젝션
프로젝션은 실제로 텍스트를 저장하지 않고 대신 다른 텍스트 버퍼의 텍스트를 결합하는 다른 종류의 텍스트 버퍼를 구성하는 기술입니다. 예를 들어, 프로젝션 버퍼를 사용하여 다른 두 버퍼의 텍스트를 연결하고 마치 하나의 버퍼에 있는 것처럼 결과를 표시하거나 하나의 버퍼에 있는 텍스트의 일부를 숨길 수 있습니다. 프로젝션 버퍼는 다른 프로젝션 버퍼에 대한 소스 버퍼 역할을 할 수 있습니다. 프로젝션과 관련된 버퍼 세트는 다양한 방식으로 텍스트를 재배열하도록 구성할 수 있습니다. (이러한 세트를 버퍼 그래프라고도 합니다.) Visual Studio 텍스트 개요 기능은 축소된 텍스트를 숨기기 위해 프로젝션 버퍼를 사용하여 구현되며, ASP.NET 페이지용 Visual Studio 편집기는 프로젝션을 사용하여 Visual Basic 및 C#과 같은 포함된 언어를 지원합니다.
IProjectionBufferFactoryService를 사용하여 IProjectionBuffer를 만듭니다. 프로젝션 버퍼는 소스 범위라고 하는 ITrackingSpan 개체의 순서가 지정된 시퀀스로 표시됩니다. 이러한 범위의 내용은 문자 시퀀스로 표시됩니다. 소스 범위가 그려지는 텍스트 버퍼를 소스 버퍼라고 합니다. 프로젝션 버퍼의 클라이언트는 일반 텍스트 버퍼와 다르다는 것을 인식할 필요가 없습니다.
프로젝션 버퍼는 소스 버퍼에서 텍스트 변경 이벤트를 수신 대기합니다. 소스 범위의 텍스트가 변경되면 프로젝션 버퍼는 변경된 텍스트 좌표를 자체 좌표에 매핑하고 적절한 텍스트 변경 이벤트를 발생시킵니다. 예를 들어, 다음 내용이 포함된 소스 버퍼 A 및 B를 고려합니다.
A: ABCDE
B: vwxyz
프로젝션 버퍼 P가 두 개의 텍스트 범위(하나는 버퍼 A 전체를 포함하고 다른 하나는 버퍼 B 전체를 포함)로 구성된 경우 P에는 다음 내용이 포함됩니다.
P: ABCDEvwxyz
하위 문자열 xy
가 버퍼 B에서 삭제되면 버퍼 P는 위치 7과 8에 있는 문자가 삭제되었음을 나타내는 이벤트를 발생시킵니다.
프로젝션 버퍼는 직접 편집할 수도 있습니다. 편집 내용을 적절한 소스 버퍼로 전파합니다. 예를 들어, 문자열이 위치 6의 버퍼 P(문자 "v"의 원래 위치)에 삽입되면 삽입이 위치 1의 버퍼 B로 전파됩니다.
프로젝션 버퍼에 영향을 주는 소스 범위에는 제한이 있습니다. 소스 범위는 겹칠 수 없습니다. 프로젝션 버퍼의 위치는 소스 버퍼의 두 개 이상의 위치에 매핑될 수 없으며 소스 버퍼의 위치는 프로젝션 버퍼의 두 개 이상의 위치에 매핑될 수 없습니다. 소스 버퍼 관계에서는 순환이 허용되지 않습니다.
프로젝션 버퍼의 소스 버퍼 세트가 변경되고 소스 범위 세트가 변경되면 이벤트가 발생합니다. 엘리전(elision) 버퍼는 특별한 종류의 프로젝션 버퍼입니다. 주로 개요 및 텍스트 블록을 확장 및 축소하는 작업에 사용됩니다. 엘리전(elision) 버퍼는 단 하나의 소스 버퍼를 기반으로 하며, 엘리전(elision) 버퍼의 범위는 소스 버퍼에서 정렬된 것과 동일하게 정렬되어야 합니다.
버퍼 그래프
IBufferGraph 인터페이스를 사용하면 프로젝션 버퍼의 그래프를 통해 매핑할 수 있습니다. 모든 텍스트 버퍼 및 프로젝션 버퍼는 언어 컴파일러에서 생성되는 추상 구문 트리와 마찬가지로 방향성 비순환 그래프로 수집됩니다. 그래프는 모든 텍스트 버퍼가 될 수 있는 상단 버퍼에 의해 정의됩니다. 버퍼 그래프는 상단 버퍼의 한 지점에서 소스 버퍼의 한 지점으로 매핑하거나 상단 버퍼의 범위에서 소스 버퍼의 범위 세트로 매핑할 수 있습니다. 마찬가지로 소스 버퍼의 한 지점 또는 범위를 상단 버퍼의 한 지점으로 매핑할 수 있습니다. 버퍼 그래프는 IBufferGraphFactoryService를 사용하여 생성됩니다.
이벤트 및 프로젝션 버퍼
프로젝션 버퍼가 수정되면 수정 사항이 프로젝션 버퍼에서 이 버퍼에 종속된 버퍼로 전송됩니다. 모든 버퍼가 수정된 후 가장 깊은 버퍼부터 시작하여 버퍼 변경 이벤트가 발생합니다.
개요
개요는 텍스트 보기에서 다양한 텍스트 블록을 확장하거나 축소할 수 있는 기능입니다. 개요는 도구 영역이 정의되는 것과 동일한 방식으로 일종의 ITag로 정의됩니다. OutliningRegionTag는 확장하거나 축소할 수 있는 텍스트 영역을 정의하는 태그입니다. 개요를 사용하려면 IOutliningManagerService를 가져와서 IOutliningManager를 가져와야 합니다. 개요 관리자는 ICollapsible 개체로 표시되는 다양한 블록을 열거, 축소 및 확장하고 그에 따라 이벤트를 발생시킵니다.
마우스 바인딩
마우스 바인딩은 마우스 움직임을 다른 명령에 연결합니다. 마우스 바인딩은 IMouseProcessorProvider를 사용하여 정의되고 키 바인딩은 IKeyProcessorProvider를 사용하여 정의됩니다. IWpfTextViewHost는 자동으로 모든 바인딩을 인스턴스화하고 보기의 마우스 이벤트에 연결합니다.
IMouseProcessor 인터페이스에는 다양한 마우스 이벤트에 대한 전처리 및 후처리 이벤트 처리기가 포함되어 있습니다. 이벤트 중 하나를 처리하기 위해 MouseProcessorBase의 일부 메서드를 재정의할 수 있습니다.
편집기 작업
편집기 작업은 스크립팅 또는 기타 목적을 위해 편집기와의 상호 작용을 자동화하는 데 사용할 수 있습니다. IEditorOperationsFactoryService를 가져와서 지정된 ITextView의 작업에 액세스할 수 있습니다. 그런 다음, 이러한 개체를 사용하여 선택 영역을 수정하거나 보기를 스크롤하거나 캐럿을 보기의 다른 부분으로 이동할 수 있습니다.
IntelliSense
IntelliSense는 문 완성, 서명 도움말(매개 변수 정보라고도 함), 요약 정보 및 전구를 지원합니다.
문 완성은 메서드 이름, XML 요소 및 기타 코딩 또는 태그 요소에 대한 잠재적 완성의 팝업 항목 목록을 제공합니다. 일반적으로 사용자 제스처는 완료 세션을 호출합니다. 이 세션은 잠재적 완성 목록을 표시하며 사용자는 목록을 선택하거나 해제할 수 있습니다. ICompletionBroker는 ICompletionSession의 생성 및 트리커 역할을 담당합니다. ICompletionSource는 세션에 대한 완료 항목의 CompletionSet를 계산합니다.
가져오기/내보내기 문제 해결: MEF 컴퍼지션 오류 로그에 액세스
현재 VS 설치에 없는 항목을 가져오거나 가져오기 또는 내보내기를 잘못 작성하는 경우 문제가 발생할 수 있습니다. 이러한 문제를 찾고 해결하는 주요 방법은 %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err에 저장된 MEF(Managed Extensibility Framework) 컴퍼지션 오류 로그를 참조하는 것입니다.