다음을 통해 공유


편집기 확장성 개념

이 문서에서는 Visual Studio 편집기를 나타내는 확장성 개체 모델과 편집을 위해 열려 있는 텍스트 문서에 대해 설명합니다. 편집기 확장 기능 사용에 대한 소개는 Visual Studio 편집기 확장성 사용을 참조하세요.

Visual Studio 편집기 확장성 개체 모델은 몇 가지 정수 요소로 구성됩니다. 이 문서에서는 ITextViewSnapshot, ITextDocumentSnapshot 및 전체 문서의 기타 추상적 표현과 텍스트의 위치 및 범위를 각각 나타내는 PositionSpan에 대해 다룹니다.

ITextViewSnapshot

ITextViewSnapshot에는ITextDocumentSnapshot을 획득하는 데 필요한 URI 및 버전 정보와 선택 항목과 같은 텍스트 뷰의 일부 속성이 포함되어 있습니다.

  • 이 개체는 변경할 수 없으며 개체를 만든 후에는 변경되지 않습니다.
  • 문서에서 콘텐츠를 가져오는 데 사용할 ITextViewSnapshot.GetTextDocumentAsync() 수 있습니다. 이 메서드를 호출하는 것은 비용이 많이 들며 문서 콘텐츠가 필요한 경우에만 수행해야 합니다.
  • ITextViewSnapshot 는 직접 변경할 수 없습니다. 모든 변경 내용은 변경 내용을 통해 요청됩니다. 확장에서 텍스트 문서 변경 참조.

ITextDocumentSnapshot

ITextDocumentSnapshot 은 특정 시점 또는 버전에서 텍스트 문서의 내용을 포함합니다.

  • 이 개체는 변경할 수 없으며 개체를 만든 후에는 변경되지 않습니다.
  • ITextDocumentSnapshot 는 직접 변경할 수 없습니다. 모든 변경 내용은 변경 내용을 통해 요청됩니다. 확장에서 텍스트 문서 변경 참조.

레거시 Visual Studio 확장에 익숙한 경우 ITextDocumentSnapshot은ITextSnapshot과 거의 동일하며 텍스트에 액세스하기 위해 동일한 대부분의 메서드를 지원합니다.

모범 사례:

  • 문자열을 복사하거나 할당하는 리소스를 사용하지 않고 위치 및 범위를 사용하여 문서의 부분 문자열을 나타낼 수 있습니다. 대부분의 API는 이러한 기본 형식의 측면에서 작동합니다.
  • 인덱서 구문을 textDocument[0]사용하여 문자열에 복사하지 않고 문서의 문자별로 문자를 읽을 수 있습니다.
  • 사전 키로 사용하기 위해 문자열을 만들어야 하는 경우 전체 줄 또는 문서에서 큰 버림 문자열을 만들지 않도록 하려면 다음을 사용하는 Span오버로드를 사용합니다.
  • 줄이나 문서가 짧을 것이라고 가정하지 마십시오. 많은 언어가 거대한 줄로 축소되거나 매우 큰 파일을 사용합니다.
    • ITextDocumentSnapshot 은 충분한 이전 버전이 저장된 경우 메모리를 사용할 수 있는 큰 데이터 구조를 참조합니다. 가장 좋은 방법은 TranslateTo() 방법을 통해 장기적으로 저장할 위치와 범위를 최신 문서 버전으로 주기적으로 업데이트하여 이전 ITextDocumentSnapshot 버전이 가비지 컬렉션이 될 수 있도록 하는 것입니다.

Position

텍스트 문서 내의 위치를 나타냅니다. 위치 유형은 int 위치와 달리 ITextDocumentSnapshot을 인식하고 해당 시점에서 문자를 직접 가져올 수 있도록 GetChar() 를 지원합니다.

레거시 Visual Studio 확장에 익숙한 경우 Position은 SnapshotPoint와 거의 동일하며 대부분의 동일한 메서드를 지원합니다.

범위

ITextDocumentSnapshot 내 문자의 연속 부분 문자열을 나타냅니다. string.Substring() 또는 ITextDocumentSnapshot.CopyToString()로 만든 문자열과 달리 Span을 만들 때는 할당 또는 추가 메모리가 필요하지 않습니다. 나중에 호출 Span.GetText() 하여 지연된 방식으로 문자열로 실현할 수 있습니다.

기존의 Visual Studio 확장에 익숙하다면 PositionSnapshotSpan과 거의 동일하며 대부분의 동일한 방법을 지원합니다.

간단한 편집기 기반 확장에 대한 샘플 코드를 검토합니다.