다음을 통해 공유


간단한 확장 만들기

첫 번째 확장 만들기에서 VisualStudio.Extensibility 프로젝트 템플릿을 사용하여 확장 프로젝트를 만드는 방법을 알아보고 Visual Studio의 실험적 인스턴스에서 빌드하고 디버그하는 방법을 알아보았습니다.

이 자습서에서는 Visual Studio 편집기에서 작업을 수행하는 간단한 명령으로 확장을 만드는 방법을 알아봅니다. 이 경우 새로 생성된 GUID를 삽입합니다. 또한 VISUAL Studio에 GUID 확장명을 사용하도록 설정된 파일 형식을 알려주는 방법과 새 명령을 도구 모음 또는 메뉴 항목으로 표시하는 방법도 확인할 수 있습니다.

이 자습서에 대한 완성된 샘플은 여기에서 찾을 수 있습니다.

이 자습서에는 다음 단계가 포함되어 있습니다.

명령 구성

이 단계에서는 명령을 구성하고 배치하는 옵션에 대해 알아봅니다. 명령을 호스팅하는 목적은 메뉴 항목 또는 명령 모음 단추 추가와 같은 방법으로 사용자에게 공개하는 것입니다.

프로젝트 템플릿 또는 첫 번째 확장 만들기 자습서에서 만든 샘플은 이미 클래스를 포함하는 단일 C# 파일로 Command 구성됩니다. 현재 위치에서 업데이트할 수 있습니다.

  1. 파일 이름을 Command1.cs 바꿉니다. 클래스 InsertGuidCommand이름을 바꾸고 속성을 업데이트합니다CommandConfiguration.InsertGuidCommand.cs

    public override CommandConfiguration CommandConfiguration => new("%InsertGuidCommand.DisplayName%")
    {
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
    };
    

    Placements 는 명령이 IDE에 표시되어야 하는 위치를 지정합니다. 이 경우 명령은 Visual Studio의 최상위 메뉴 중 하나인 확장 메뉴에 배치됩니다.

    생성자에 대한 CommandConfiguration 인수는 메뉴 텍스트인 명령의 표시 이름입니다. 표시 이름은 지역화를 지원하기 위해 문자열 리소스 .vsextension/string-resources.json 를 참조하기 때문에 문자로 묶 % 입니다.

  2. 의 표시 이름으로 업데이트 .vsextension/string-resources.json 합니다 InsertGuidCommand.

    {
      "InsertGuidCommand.DisplayName": "Insert new guid"
    }
    
  3. Icon 속성 추가

    public override CommandConfiguration CommandConfiguration => new("%InsertGuidCommand.DisplayName%")
    {
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
        Icon = new(ImageMoniker.KnownValues.OfficeWebExtension, IconSettings.IconAndText),
    };
    

    이 경우 OfficeWebExtension알려진 기본 제공 아이콘을 지정하거나 Visual Studio 추가 명령에 설명된 대로 아이콘에 대한 이미지를 업로드할 수 있습니다. 두 번째 인수는 명령이 도구 모음에 표시되는 방식을 결정하는 열거형입니다(메뉴의 위치 외에). 이 옵션은 IconSettings.IconAndText 아이콘과 표시 이름을 나란히 표시하는 것을 의미합니다.

  4. VisibleWhen 사용자에게 표시할 항목에 적용해야 하는 조건을 지정하는 속성을 추가합니다.

    public override CommandConfiguration CommandConfiguration => new("%InsertGuidCommand.DisplayName%")
    {
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
        Icon = new(ImageMoniker.KnownValues.OfficeWebExtension, IconSettings.IconAndText),
        VisibleWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveEditorContentType, ".+"),
    };
    

자세한 내용은 규칙 기반 활성화 제약 조건 사용을 참조하세요.

실행 메서드 만들기

이 단계에서는 사용자가 메뉴 항목을 선택하거나 명령에 대한 도구 모음의 ExecuteCommandAsync 항목을 누를 때 발생하는 작업을 정의하는 명령의 메서드를 구현합니다.

다음 코드를 복사하여 메서드를 구현합니다.

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
    {
        Requires.NotNull(context, nameof(context));
        var newGuidString = Guid.NewGuid().ToString("N", CultureInfo.CurrentCulture);

        using var textView = await context.GetActiveTextViewAsync(cancellationToken);
        if (textView is null)
        {
            this.logger.TraceInformation("There was no active text view when command is executed.");
            return;
        }

        await this.Extensibility.Editor().EditAsync(
            batch =>
            {
                textView.Document.AsEditable(batch).Replace(textView.Selection.Extent, newGuidString);
            },
            cancellationToken);
    }

첫 번째 줄은 인수의 유효성을 검사한 다음 나중에 사용할 새 Guid 줄을 만듭니다.

그런 다음, 비동기 메서드GetActiveTextViewAsyncITextViewSnapshot 호출하여 (textView여기서 개체)를 만듭니다. 비동기 요청을 취소하는 기능을 유지하기 위해 취소 토큰이 전달되지만 이 부분은 이 샘플에 설명되어 있지 않습니다. 텍스트 보기가 성공적으로 표시되지 않으면 로그에 쓰고 다른 작업을 수행하지 않고 종료합니다.

이제 편집 요청을 Visual Studio의 편집기로 제출하는 비동기 메서드를 호출할 준비가 되었습니다. 원하는 메서드는 .입니다 EditAsync. IDE에서 실행 중인 Visual Studio 편집기와의 상호 작용을 허용하는 클래스의 EditorExtensibility 멤버입니다. Command 고유한 InsertGuidCommand 클래스가 상속하는 형식에는 개체에 EditorExtensibility 대한 액세스를 제공하는 멤버 Extensibility 가 있으므로 호출this.Extensibility.Editor()을 사용하여 EditorExtensibility 클래스에 액세스할 수 있습니다.

메서드는 EditAsync 매개 변수로 사용합니다 Action<IEditBatch> . 이 매개 변수를 호출 editorSource합니다.

람다 식을 사용하는 호출 EditAsync 입니다. 이를 조금씩 분석하기 위해 다음과 같이 해당 호출을 작성할 수도 있습니다.

await this.Extensibility.Editor().EditAsync(
    batch =>
    {
        var editor = textView.Document.AsEditable(batch);
        // specify the desired changes here:
        editor.Replace(textView.Selection.Extent, newGuidString);
    },
    cancellationToken);

이 호출은 Visual Studio 편집기 프로세스에서 실행하려는 코드를 지정하는 것으로 생각할 수 있습니다. 람다 식은 편집기에서 변경하려는 항목을 지정합니다. 이 형식IEditBatchbatch 여기에 정의된 람다 식이 사용자 또는 언어 서비스의 다른 편집에 의해 중단되지 않고 단위로 수행해야 하는 작은 변경 집합을 만든다는 것을 의미합니다. 코드가 너무 오래 실행되면 응답하지 않을 수 있으므로 이 람다 식 내의 변경 내용을 제한적으로 유지하고 지연으로 이어질 수 있는 모든 것을 이해하는 것이 중요합니다.

AsEditable 문서의 메서드를 사용하여 원하는 변경 내용을 지정하는 데 사용할 수 있는 임시 편집기 개체를 가져옵니다. Visual Studio 편집기 확장성 사용에 설명된 대로 확장에서 이러한 비동기 편집 요청을 처리하기 위한 특정 프로토콜이 있으며, 사용자가 충돌을 만드는 동시에 변경 내용을 만드는 경우와 같이 변경 내용이 수락되지 않을 가능성이 있으므로 람다 식의 모든 항목을 실제로 실행하지 않고 실행하기 위한 요청으로 간주합니다.

패턴은 EditAsync "여기서 원하는 변경 내용 지정" 주석 후에 수정 내용을 지정하여 일반적으로 텍스트를 수정하는 데 사용할 수 있습니다.