언어 서비스 및 편집기 확장 지점

편집기는 대부분의 언어 서비스 기능을 포함하여 MEF(Managed Extensibility Framework) 구성 요소 부분으로 확장할 수 있는 확장 지점을 제공합니다. 주요 확장 지점 범주는 다음과 같습니다.

  • 내용 유형

  • 분류 유형 및 분류 형식

  • 여백 및 스크롤 막대

  • 태그

  • 도구 영역

  • 마우스 프로세서

  • 드롭 처리기

  • 옵션

  • IntelliSense

콘텐츠 형식 확장

콘텐츠 형식은 편집기에서 처리하는 텍스트 종류의 정의입니다(예: "text", "code" 또는 "CSharp"). ContentTypeDefinition 형식의 변수를 선언하고 새 콘텐츠 형식에 고유한 이름을 지정하여 새 콘텐츠 형식을 정의합니다. 편집기에서 콘텐츠 형식을 등록하려면 다음 특성과 함께 내보냅니다.

  • NameAttribute는 콘텐츠 형식의 이름입니다.

  • BaseDefinitionAttribute는 이 콘텐츠 형식이 파생되는 콘텐츠 형식의 이름입니다. 콘텐츠 형식은 다른 여러 콘텐츠 형식에서 상속할 수 있습니다.

    ContentTypeDefinition 클래스는 봉인되어 있으므로 형식 매개 변수 없이 내보낼 수 있습니다.

    다음 예제에서는 콘텐츠 형식 정의의 내보내기 특성을 보여 줍니다.

[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;

콘텐츠 형식은 0개 이상의 기존 콘텐츠 형식을 기반으로 할 수 있습니다. 기본 제공 형식은 다음과 같습니다.

  • Any: 기본 콘텐츠 형식입니다. 다른 모든 콘텐츠 형식의 부모입니다.

  • Text: 프로젝션이 아닌 콘텐츠의 기본 형식입니다. "Any"에서 상속합니다.

  • Plaintext: 코드가 아닌 텍스트입니다. "Text"에서 상속합니다.

  • Code: 모든 종류의 코드입니다. "Text"에서 상속합니다.

  • Inert: 모든 종류의 처리에서 텍스트를 제외합니다. 이 콘텐츠 형식의 텍스트에는 확장명이 적용되지 않습니다.

  • Projection: 프로젝션 버퍼의 내용입니다. "Any"에서 상속합니다.

  • Intellisense: IntelliSense의 내용입니다. "Text"에서 상속합니다.

  • Sighelp: 서명 도움말입니다. "Intellisense"에서 상속합니다.

  • Sighelp-doc: 서명 도움말 설명서입니다. "Intellisense"에서 상속합니다.

    다음은 Visual Studio에서 정의된 콘텐츠 형식과 Visual Studio에서 호스트되는 언어 중 일부입니다.

  • 기본

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    사용 가능한 콘텐츠 형식의 목록을 검색하려면 편집기의 콘텐츠 형식 컬렉션을 유지 관리하는 IContentTypeRegistryService를 가져옵니다. 다음 코드는 이 서비스를 속성으로 가져옵니다.

[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }

콘텐츠 형식을 파일 이름 확장명과 연결하려면 FileExtensionToContentTypeDefinition을 사용합니다.

참고 항목

Visual Studio에서 파일 이름 확장명은 언어 서비스 패키지에 대한 ProvideLanguageExtensionAttribute를 사용하여 등록됩니다. FileExtensionToContentTypeDefinition은 MEF 콘텐츠 형식을 이러한 방식으로 등록된 파일 이름 확장명과 연결합니다.

파일 이름 확장명을 콘텐츠 형식 정의로 내보내려면 다음 특성을 포함해야 합니다.

[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;

IFileExtensionRegistryService는 파일 이름 확장명과 콘텐츠 형식 간의 연결을 관리합니다.

분류 유형 및 분류 형식 확장

분류 유형을 사용하여 다양한 처리를 제공할 텍스트 종류를 정의할 수 있습니다(예: "키워드" 텍스트를 파란색으로 지정하고 "주석" 텍스트를 녹색으로 지정). ClassificationTypeDefinition 형식의 변수를 선언하고 고유한 이름을 지정하여 새 분류 형식을 정의합니다.

편집기에서 분류 유형을 등록하려면 다음 특성과 함께 내보냅니다.

  • NameAttribute: 분류 유형의 이름입니다.

  • BaseDefinitionAttribute: 이 분류 유형이 상속하는 분류 유형의 이름입니다. 모든 분류 유형은 "text"에서 상속하며 분류 유형은 다른 여러 분류 유형에서 상속할 수 있습니다.

    ClassificationTypeDefinition 클래스는 봉인되어 있으므로 형식 매개 변수 없이 내보낼 수 있습니다.

    다음 예제에서는 분류 유형 정의의 내보내기 특성을 보여 줍니다.

[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;

IStandardClassificationService는 표준 분류에 대한 액세스를 제공합니다. 기본 제공 분류 유형은 다음과 같습니다.

  • "text"

  • "natural language"("text"에서 파생됨)

  • "formal language"("text"에서 파생됨)

  • "string"("literal"에서 파생됨)

  • "character"("literal"에서 파생됨)

  • "numerical"("literal"에서 파생됨)

    다양한 오류 유형이 ErrorTypeDefinition에서 상속합니다. 여기에는 다음과 같은 오류 유형이 포함됩니다.

  • “구문 오류”

  • “컴파일러 오류”

  • “기타 오류”

  • “경고”

    사용 가능한 분류 유형의 목록을 검색하려면 편집기의 분류 유형 컬렉션을 유지 관리하는 IClassificationTypeRegistryService를 가져옵니다. 다음 코드는 이 서비스를 속성으로 가져옵니다.

[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }

새 분류 유형에 대한 분류 형식 정의를 정의할 수 있습니다. ClassificationFormatDefinition에서 클래스를 파생하고 EditorFormatDefinition 형식을 사용하여 다음 특성과 함께 내보냅니다.

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition

사용 가능한 형식의 목록을 검색하려면 편집기의 형식 컬렉션을 유지 관리하는 IEditorFormatMapService를 가져옵니다. 다음 코드는 이 서비스를 속성으로 가져옵니다.

[Import]
internal IEditorFormatMapService FormatMapService { get; set; }

여백 및 스크롤 막대 확장

여백 및 스크롤 막대는 텍스트 보기 자체 외에도 편집기의 기본 보기 요소입니다. 텍스트 보기 주위에 표시되는 표준 여백 외에 원하는 수의 여백을 지정할 수 있습니다.

IWpfTextViewMargin 인터페이스를 구현하여 여백을 정의합니다. 또한 여백을 만들 IWpfTextViewMarginProvider 인터페이스도 구현해야 합니다.

편집기에서 여백 공급자를 등록하려면 다음 특성과 함께 공급자를 내보내야 합니다.

  • NameAttribute: 여백의 이름입니다.

  • OrderAttribute: 여백이 다른 여백에 상대적으로 표시되는 순서입니다.

    기본 제공 여백은 다음과 같습니다.

    • "Wpf 가로 스크롤 막대"

    • "Wpf 세로 스크롤 막대"

    • "Wpf 줄 번호 여백"

      순서 특성 After="Wpf Horizontal Scrollbar"가 있는 가로 여백은 기본 제공 여백 아래에 표시되고, 순서 특성 Before ="Wpf Horizontal Scrollbar"가 있는 가로 여백은 기본 제공 여백 위에 표시됩니다. 순서 특성 After="Wpf Vertical Scrollbar"가 있는 오른쪽 세로 여백은 스크롤 막대 오른쪽에 표시됩니다. 순서 특성 After="Wpf Line Number Margin"가 있는 왼쪽 세로 여백은 줄 번호 여백(표시되는 경우)의 왼쪽에 표시됩니다.

  • MarginContainerAttribute: 여백의 종류(왼쪽, 오른쪽, 위쪽 또는 아래쪽)입니다.

  • ContentTypeAttribute: 여백이 유효한 콘텐츠의 종류(예: "text" 또는 "code")입니다.

    다음 예제에서는 줄 번호 여백의 오른쪽에 나타나는 여백에 대한 여백 공급자의 내보내기 특성을 보여 줍니다.

[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]

태그 확장

태그는 데이터를 다양한 종류의 텍스트와 연결시키는 방법입니다. 대부분의 경우 연결된 데이터가 시각적 효과로 표시되지만 모든 태그에 시각적 프레젠테이션이 있는 것은 아닙니다. ITag을 구현하여 고유한 종류의 태그를 정의할 수 있습니다. 또한 ITagger<T>를 구현하여 지정된 텍스트 범위 집합에 대한 태그를 제공하고 ITaggerProvider를 구현하여 태거를 제공해야 합니다. 태거 공급자를 다음 특성과 함께 내보내야 합니다.

  • ContentTypeAttribute: 태그가 유효한 콘텐츠의 종류(예: "text" 또는 "code")입니다.

  • TagTypeAttribute: 태그의 종류입니다.

    다음 예제에서는 태거 공급자의 내보내기 특성을 보여 줍니다.

<CodeContentPlaceHolder>8 다음과 같은 종류의 태그가 기본 제공됩니다.

[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }

태그 및 MarkerFormatDefinitions

MarkerFormatDefinition 클래스를 확장하여 태그의 모양을 정의할 수 있습니다. 다음 특성을 사용하여 클래스를 (EditorFormatDefinition으로) 내보내야 합니다.

  • NameAttribute: 이 형식을 참조하는 데 사용되는 이름입니다.

  • UserVisibleAttribute: 이렇게 하면 이 형식이 UI에 표시됩니다.

    생성자에서 태그의 표시 이름과 모양을 정의합니다. BackgroundColor는 채우기 색을 정의하고 ForegroundColor는 테두리 색을 정의합니다. DisplayName은 형식 정의의 지역화 가능한 이름입니다.

    다음은 형식 정의의 예입니다.

[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
    public HighlightWordFormatDefinition()
    {
        this.BackgroundColor = Colors.LightBlue;
        this.ForegroundColor = Colors.DarkBlue;
        this.DisplayName = "Highlight Word";
        this.ZOrder = 5;
    }
}

태그에 이 형식 정의를 적용하려면 클래스의 이름 특성에 설정한 이름(표시 이름이 아님)을 참조합니다.

참고 항목

MarkerFormatDefinition 예제는 연습: 텍스트 강조 표시의 HighlightWordFormatDefinition 클래스를 참조하세요.

장식 확장

장식은 텍스트 보기에 표시되는 텍스트 또는 텍스트 보기 자체에 추가할 수 있는 시각적 효과를 정의합니다. 사용자 고유의 장식을 임의 형식의 UIElement로 정의할 수 있습니다.

장식 클래스에서 AdornmentLayerDefinition을 선언해야 합니다. 장식 계층을 등록하려면 다음 특성과 함께 내보냅니다.

  • NameAttribute: 장식의 이름입니다.

  • OrderAttribute: 다른 장식 계층과 상대적인 장식의 순서입니다. PredefinedAdornmentLayers 클래스는 4개의 기본 계층인 선택 영역, 윤곽선, 캐럿 및 텍스트를 정의합니다.

    다음 예제에서는 장식 계층 정의의 내보내기 특성을 보여 줍니다.

[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;

IWpfTextViewCreationListener를 구현하고 장식을 인스턴스화하여 해당 TextViewCreated 이벤트를 처리하는 두 번째 클래스를 만들어야 합니다. 이 클래스를 다음 특성과 함께 내보내야 합니다.

  • ContentTypeAttribute: 장식이 유효한 콘텐츠의 종류(예: "text" 또는 "code")입니다.

  • TextViewRoleAttribute: 이 장식이 유효한 텍스트 보기의 종류입니다. PredefinedTextViewRoles 클래스에는 미리 정의된 텍스트 보기 역할 집합이 있습니다. 예를 들어 Document는 파일의 텍스트 보기에 주로 사용됩니다. Interactive는 사용자가 마우스와 키보드를 사용하여 편집하거나 탐색할 수 있는 텍스트 보기에 사용됩니다. Interactive 보기의 예로는 편집기 텍스트 보기와 출력 창이 있습니다.

    다음 예제에서는 장식 공급자의 내보내기 특성을 보여 줍니다.

[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener

공간 협상 장식은 텍스트와 동일한 수준에서 공간을 차지하는 장식입니다. 이러한 종류의 장식을 만들려면 SpaceNegotiatingAdornmentTag에서 상속하는 태그 클래스를 정의해야 합니다. 이 클래스는 장식이 차지하는 공간의 양을 정의합니다.

모든 장식과 마찬가지로 장식 계층 정의를 내보내야 합니다.

[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;

공간 협상 장식을 인스턴스화하려면 (다른 종류의 장식과 마찬가지로) IWpfTextViewCreationListener를 구현하는 클래스 외에도 ITaggerProvider를 구현하는 클래스를 만들어야 합니다.

태거 공급자를 등록하려면 다음 특성과 함께 내보내야 합니다.

  • ContentTypeAttribute: 장식이 유효한 콘텐츠의 종류(예: "text" 또는 "code")입니다.

  • TextViewRoleAttribute: 이 태그 또는 장식이 유효한 텍스트 보기의 종류입니다. PredefinedTextViewRoles 클래스에는 미리 정의된 텍스트 보기 역할 집합이 있습니다. 예를 들어 Document는 파일의 텍스트 보기에 주로 사용됩니다. Interactive는 사용자가 마우스와 키보드를 사용하여 편집하거나 탐색할 수 있는 텍스트 보기에 사용됩니다. Interactive 보기의 예로는 편집기 텍스트 보기와 출력 창이 있습니다.

  • TagTypeAttribute: 정의한 태그 또는 장식의 종류입니다. SpaceNegotiatingAdornmentTag에 대해 두 번째 TagTypeAttribute를 추가해야 합니다.

    다음 예제에서는 공간 협상 장식 태그에 대한 태거 공급자의 내보내기 특성을 보여 줍니다.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider

마우스 프로세서 확장

마우스 입력에 대한 특수 처리를 추가할 수 있습니다. MouseProcessorBase에서 상속하고 처리하려는 입력에 대한 마우스 이벤트를 재정의하는 클래스를 만듭니다. 또한 두 번째 클래스에서 IMouseProcessorProvider를 구현하여 마우스 처리기가 유효한 콘텐츠의 종류(예: "text" 또는 "code")를 지정하는 ContentTypeAttribute와 함께 내보내야 합니다.

다음 예제에서는 마우스 프로세서 공급자의 내보내기 특성을 보여 줍니다.

[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider

드롭 처리기 확장

IDropHandler를 구현하는 클래스와 드롭 처리기를 만들기 위한 IDropHandlerProvider를 구현하는 두 번째 클래스를 만들어 특정 종류의 텍스트에 대한 드롭 처리기의 동작을 사용자 지정할 수 있습니다. 드롭 처리기를 다음 특성과 함께 내보내야 합니다.

  • DropFormatAttribute: 이 드롭 처리기가 유효한 텍스트 형식입니다. 다음 형식은 가장 높은 우선 순위에서 가장 낮은 우선 순위로 처리됩니다.

    1. 모든 사용자 지정 형식

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. 로캘

    8. 색상표

    9. PenData

    10. 직렬화 가능

    11. SymbolicLink

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. 비트맵

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. HTML 형식

    21. UnicodeText

    22. OEMText

    23. Text

  • NameAttribute: 드롭 처리기의 이름입니다.

  • OrderAttribute: 기본 드롭 처리기 앞 또는 뒤의 드롭 처리기의 순서입니다. Visual Studio용 기본 드롭 처리기의 이름은 "DefaultFileDropHandler"입니다.

    다음 예제에서는 드롭 처리기 공급자의 내보내기 특성을 보여 줍니다.

[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider

편집기 옵션 확장

특정 범위(예: 텍스트 보기)에서만 유효한 옵션을 정의할 수 있습니다. 편집기에서는 편집기 옵션, 보기 옵션, WPF(Windows Presentation Foundation) 보기 옵션과 같은 미리 정의된 옵션 집합을 제공합니다. 이러한 옵션은 DefaultOptions, DefaultTextViewOptionsDefaultWpfViewOptions에 있습니다.

새 옵션을 추가하려면 다음 옵션 정의 클래스 중 하나에서 클래스를 파생합니다.

[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>

IntelliSense 확장

IntelliSense는 구조적 텍스트 및 문 완성에 대한 정보를 제공하는 기능 그룹을 지칭하는 일반적인 용어입니다. 이러한 기능에는 문 완성, 서명 도움말, 요약 정보 및 전구가 포함됩니다. 문 완성은 사용자가 언어 키워드 또는 멤버 이름을 올바르게 입력하는 데 도움이 됩니다. 서명 도움말은 사용자가 방금 입력한 메서드에 대한 서명을 표시합니다. 요약 정보는 마우스가 놓일 때 형식 또는 멤버 이름에 대한 전체 서명을 표시합니다. 전구는 특정 컨텍스트(예: 변수의 이름을 한 번 바꾼 후 나머지 모든 인스턴스의 이름을 바꿈)에서 특정 식별자에 대한 추가 작업을 제공합니다.

IntelliSense 기능의 디자인은 모든 경우에 거의 동일합니다.

  • IntelliSense 브로커 는 전체 프로세스를 담당합니다.

  • IntelliSense 세션 은 발표자 트리거와 선택 영역의 커밋 또는 취소 사이의 이벤트 시퀀스를 나타냅니다. 세션은 일반적으로 일부 사용자 제스처에 의해 트리거됩니다.

  • IntelliSense 컨트롤러 는 세션을 시작하고 종료해야 하는 시기를 결정합니다. 또한 정보를 커밋해야 하는 시기와 세션을 취소해야 하는 시기도 결정합니다.

  • IntelliSense 원본 은 콘텐츠를 제공하고 가장 일치하는 항목을 결정합니다.

  • IntelliSense 발표자 는 콘텐츠 표시를 담당합니다.

    대부분의 경우 적어도 원본 및 컨트롤러를 제공하는 것이 좋습니다. 디스플레이를 사용자 지정하려는 경우 프리젠터를 제공할 수도 있습니다.

IntelliSense 원본 구현

원본을 사용자 지정하려면 다음 원본 인터페이스 중 하나 이상을 구현해야 합니다.

Important

ISmartTagSource는 더 이상 사용되지 않고 대신 ISuggestedActionsSource가 사용됩니다.

또한 동일한 종류의 공급자를 구현해야 합니다.

Important

ISmartTagSourceProvider는 더 이상 사용되지 않고 대신 ISuggestedActionsSourceProvider가 사용됩니다.

공급자를 다음 특성과 함께 내보내야 합니다.

  • NameAttribute: 원본의 이름입니다.

  • ContentTypeAttribute: 원본이 적용되는 콘텐츠의 종류(예: "text" 또는 "code")입니다.

  • OrderAttribute: 원본이 (다른 원본에 상대적으로) 표시되는 순서입니다.

  • 다음 예제에서는 완료 원본 공급자의 내보내기 특성을 보여 줍니다.

Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider

IntelliSense 원본을 구현하는 방법에 대한 자세한 내용은 다음 연습을 참조하세요.

IntelliSense 컨트롤러 구현

컨트롤러를 사용자 지정하려면 IIntellisenseController 인터페이스를 구현해야 합니다. 또한 컨트롤러 공급자를 다음 특성과 함께 구현해야 합니다.

  • NameAttribute: 컨트롤러의 이름입니다.

  • ContentTypeAttribute: 컨트롤러가 적용되는 콘텐츠의 종류(예: "text" 또는 "code")입니다.

  • OrderAttribute: 컨트롤러가 (다른 컨트롤러에 상대적으로) 표시되는 순서입니다.

    다음 예제에서는 완료 컨트롤러 공급자의 내보내기 특성을 보여 줍니다.

Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider

IntelliSense 컨트롤러 사용에 대한 자세한 내용은 다음 연습을 참조하세요.