다음을 통해 공유


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

편집기에서는 대부분의 언어 서비스 기능을 포함하여 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: 기본 콘텐츠 형식입니다. 다른 모든 콘텐츠 형식의 부모입니다.

  • 텍스트: 프로젝션이 아닌 콘텐츠의 기본 형식입니다. "any"에서 상속됩니다.

  • 일반 텍스트: 코드가 아닌 텍스트의 경우 "text"에서 상속됩니다.

  • 코드: 모든 종류의 코드입니다. "text"에서 상속됩니다.

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

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

  • Intellisense: IntelliSense의 내용 "text"에서 상속됩니다.

  • Sighelp: 서명 도움말. "intellisense"에서 상속됩니다.

  • Sighelp-doc: 서명 도움말 설명서. "intellisense"에서 상속됩니다.

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

  • 기초

  • C/C++

  • ConsoleOutput

  • 차프

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

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

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

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

비고

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

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

  • FileExtensionAttribute: 파일 이름 확장명을 지정합니다.

  • ContentTypeAttribute: 콘텐츠 형식을 지정합니다.

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

    다음 예제에서는 파일 이름 확장명에서 콘텐츠 형식 정의로 특성을 내보내는 방법을 보여 있습니다.

[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 분류에 대한 액세스를 제공합니다. 기본 제공 분류 유형에는 다음이 포함됩니다.

  • "텍스트"

  • "자연어"("텍스트"에서 파생됨)

  • "정식 언어"("텍스트"에서 파생됨)

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

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

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

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

  • "구문 오류"

  • "컴파일러 오류"

  • "기타 오류"

  • "warning"

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

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

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

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

  • DisplayNameAttribute: 형식의 표시 이름입니다.

  • UserVisibleAttribute: 옵션 대화 상자의 글꼴 및 색 페이지에 서식이 표시되는지 여부를 지정합니다.

  • OrderAttribute: 형식의 우선 순위입니다. 유효한 값은 .에서 가져옵니다 Priority.

  • ClassificationTypeAttribute: 이 형식이 매핑되는 분류 유형의 이름입니다.

    다음 예제에서는 분류 형식 정의에 대한 내보내기 특성을 보여 있습니다.

[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</CodeContentPlaceHolder> 다음 종류의 태그가 기본 제공됩니다.

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

태그 및 MarkerFormatDefinitions

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

  • 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개의 기본 계층인 Selection, Outlining, Caret 및 Text를 정의합니다.

    다음 예제에서는 표시 계층 정의의 내보내기 특성을 보여 있습니다.

[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;

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

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

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

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

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

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

[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. 리프

    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. 문자 메시지

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

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

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

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

편집기 옵션 확장

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

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

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

IntelliSense 확장

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

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

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

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

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

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

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

    대부분의 경우 원본과 컨트롤러를 제공하는 것이 좋습니다. 디스플레이를 사용자 지정하려는 경우 발표자를 제공할 수도 있습니다.

IntelliSense 원본 구현

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

중요합니다

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

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

중요합니다

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 컨트롤러 사용에 대한 자세한 내용은 다음 연습을 참조하세요.