다음을 통해 공유


코드 조각 (패키지 관리 프레임 워크)에 대 한 지원

코드 소스 파일에 삽입 되는 코드의 일부입니다. 코드 조각 자체 필드 집합이 XML 기반 서식 파일입니다. 코드 조각이 삽입 되 고 다른 값은 코드 조각이 삽입 되는 컨텍스트에 따라 사용할 수 있습니다 이러한 필드가 강조 표시 됩니다. 즉시 코드 조각을 삽입 한 후 언어 서비스에 코드 조각을 포맷할 수 있습니다.

TAB 키를 사용 하 여 탐색 하는 조각의 필드를 수 있는 특수 편집 모드 코드 조각이 삽입 됩니다. 필드는 IntelliSense 스타일 드롭 다운 메뉴를 지원할 수 있습니다. 사용자가 입력 하거나 ESC 키를 입력 하 여 소스 파일에 코드 조각을 커밋합니다. 코드 조각에 대 한 자세한 내용은 코드 조각.

코드 조각에 대 한 프레임 워크 지원 패키지 관리

패키지 관리 프레임 워크 (MPF)에서 코드 조각을 삽입 하는 서식 파일을 읽는 대부분의 코드 조각 기능을 지원 하 고 특수 사용 하면 편집 모드입니다. 지원을 통해 관리 되는 ExpansionProvider 클래스입니다.

때의 Source 클래스를 인스턴스화할는 CreateExpansionProvider 메서드에서 LanguageService 클래스를 얻으려면 호출는 ExpansionProvider 개체 (참고 기본 LanguageService 클래스를 항상 반환 새 ExpansionProvider 개체 각각에 대 한 Source 개체).

MPF 확장 기능을 지원 하지 않습니다. 확장 함수를 조각 템플릿에서 포함 되 고 필드에 추가할 수 있는 하나 이상의 값을 반환 하는 명명 된 함수가입니다. 값은 언어에 의해 반환 되는 서비스를 통해 자체는 ExpansionFunction 개체입니다. ExpansionFunction 개체는 언어 서비스에서 확장 기능을 지원 하도록 구현 해야 합니다.

코드 조각에 대 한 지원을 제공합니다.

코드 조각에 대 한 지원을 설정 하려면 제공 하거나의 조각을 설치 하 고 이러한 코드 조각을 삽입할 수 있는 방법도 제공 해야 합니다. 코드 조각에 대 한 지원을 사용 하도록 설정 하는 세 가지 단계가 있습니다.

  1. 코드 조각 파일을 설치 합니다.

  2. 언어 서비스에 코드 조각을 사용 합니다.

  3. 호출 하는 ExpansionProvider 개체입니다.

코드 조각 파일을 설치합니다.

모든 조각 언어 파일은 일반적으로 하나의 코드 조각 템플릿 템플릿 XML 파일에 저장 됩니다. 에 대 한 코드 조각 템플릿을 사용 하 여 XML 스키마에 대 한 정보를 참조 하십시오. 코드 조각 스키마 참조. 각 조각 서식 파일 언어 ID로 식별 됩니다. 이 언어 ID를 지정 하 고 배치는 Language <Code>의 특성 태그 서식 파일에서입니다.

코드 조각 템플릿 파일 저장 위치는 일반적으로: 1) 언어를 설치 된 곳과 2)에서 사용자의 폴더. 이러한 위치는 레지스트리에 따라서는 추가 됩니다 Visual Studio 코드 조각 관리자 의 조각을 찾을 수 있습니다. 사용자 폴더에서 사용자가 만든 코드 조각을 저장할입니다.

코드 조각 설치 된 서식 파일에 대 한 일반적인 폴더 레이아웃 다음과 같습니다: [InstallRoot]\[TestLanguage]\Snippets\[LCID]\Snippets.

[InstallRoot] 언어에 설치 되어 있는 폴더입니다.

[TestLanguage] 폴더 이름으로 언어의 이름입니다.

[LCID] 는 로케일 ID입니다. 이 지역화 된 버전의 조각입니다 저장 됩니다. 예를 들어 영어의 로캘 ID 1033 따라서이 [LCID] 1033으로 대체 됩니다.

추가 파일을 제공 해야 하는 일반적으로 SnippetsIndex.xml 또는 ExpansionsIndex.xml (.xml에서 끝나는 모든 유효한 파일 이름을 사용할 수 있습니다) 라고 하는 인덱스 파일입니다. 이 일반적으로 파일은 [InstallRoot]\[TestLanguage] 폴더의 조각을 사용 하는 언어 서비스의 GUID 및 코드 단편 폴더와 해당 언어 ID의 정확한 위치를 지정 하 고 있습니다. 색인 파일의 정확한 경로 나중에 "설치 하는 레지스트리 항목에"에 설명 된 대로 레지스트리로 배치 됩니다. SnippetsIndex.xml 파일의 예는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<SnippetCollection>
    <Language Lang="Testlanguage" Guid="{b614a40a-80d9-4fac-a6ad-fc2868fff7cd}">
        <SnippetDir>
            <OnOff>On</OnOff>
            <Installed>true</Installed>
            <Locale>1033</Locale>
            <DirPath>%InstallRoot%\TestLanguage\Snippets\%LCID%\Snippets\</DirPath>
            <LocalizedName>Snippets</LocalizedName>
        </SnippetDir>
    </Language>
</SnippetCollection>

<Language> 태그 언어 ID를 지정 합니다 (는 Lang 특성) 및 GUID는 언어 서비스입니다.

언어 서비스 Visual Studio 설치 폴더에 설치한 것으로 가정 합니다. %LCID% 사용자의 현재 로케일 ID로 대체 됩니다. 여러 <SnippetDir> 태그 추가할 수 있습니다, 각각 다른 디렉터리와 로케일입니다. 또한 하위 폴더의 인덱스 파일에서 <SnippetSubDir> 식별 되는 코드 조각 폴더 포함 될 수 있습니다. <SnippetDir>에 포함 된 태그 태그입니다.

사용자가 사용 중인 언어에 대 한 자신의 조각을 만들 수도 있습니다. 이러한 사용자의 설정을 폴더에 일반적으로 예를 들어 저장 된 [TestDocs]\Code Snippets\[TestLanguage]코드 조각을 \Test 위치 [TestDocs] Visual Studio 대 한 사용자 설정 폴더의 위치입니다.

<DirPath> 저장 된 경로에서 다음 대체 요소를 배치할 수 있습니다. 태그 색인 파일입니다.

요소

설명

LCID %%

로캘 ID.

%Installroot%

예를 들어, C:\Program 상자 Visual Studio 8 Visual Studio, 루트 설치 폴더.

ProjDir %%

현재 프로젝트를 포함 하는 폴더입니다.

%Projitem%

현재 프로젝트 항목을 포함 하는 폴더입니다.

%Testdocs%

예를 들어, 단추로 사용자 설정 폴더에서[사용자 이름]\My Documents\Visual Studio\8.

언어 서비스에 코드 조각 사용

추가 하 여 언어 서비스에 코드 조각 수는 ProvideLanguageCodeExpansionAttribute 하 여 VSPackage 특성 (참조 하십시오 언어 서비스 (패키지 관리 프레임 워크)를 등록 하는 중 세부 정보에 대 한). ShowRootsSearchPaths 매개 변수는 선택 사항 이지만 포함 해야는 SearchPaths 알리기 위해 매개 변수 이름은 코드 조각 관리자 의 조각 위치입니다.

이 특성을 사용 하는 방법의 예는 다음과 같습니다.

[ProvideLanguageCodeExpansion(
         typeof(TestSnippetLanguageService),
         "Test Snippet Language",          // Name of language used as registry key
         0,                               // Resource ID of localized name of language service
         "Test Snippet Language",        // Name of Language attribute in snippet template
         @"%InstallRoot%\Test Snippet Language\Snippets\%LCID%\SnippetsIndex.xml",  // Path to snippets index
         SearchPaths = @"%InstallRoot%\Test Snippet Language\Snippets\%LCID%\")]    // Path to snippets

확장 공급자를 호출합니다.

언어 서비스의 모든 코드 조각으로 삽입 호출 되는 방법은 삽입을 제어 합니다.

코드 조각에 대 한 확장 공급자를 호출합니다.

확장 공급자를 호출 하는 방법은 두 가지: 메뉴 명령을 사용 하거나 완성 목록에서 바로 가기를 사용 하 여.

메뉴 명령을 사용 하 여 코드 조각 삽입

조각 브라우저를 표시 하는 메뉴 명령을 사용 하려면 메뉴 명령 추가 및 다음 호출의 DisplayExpansionBrowser 메서드에서 ExpansionProvider 인터페이스에는 메뉴 명령에 응답 합니다.

  1. 명령 및 단추를.vsct 파일에 추가 합니다. 작업에 대 한 지침을 찾을 수 있습니다 Visual Studio 패키지 템플릿을 사용 하 여 연습: 메뉴 명령 만들기.

  2. 클래스에서 파생 되는 ViewFilter 클래스 및 재정의 하는 QueryCommandStatus 메서드의 새 메뉴 명령에 대 한 작업을 지원 합니다. 이 예제에서는 항상 메뉴 명령이 있습니다.

    using Microsoft.VisualStudio.Package;
    
    namespace TestLanguagePackage
    {
        class TestViewFilter : ViewFilter
        {
            public TestViewFilter(CodeWindowManager mgr, IVsTextView view)
                : base(mgr, view)
            {
            }
    
            protected override int QueryCommandStatus(ref Guid guidCmdGroup,
                                                      uint nCmdId)
            {
                int hr = base.QueryCommandStatus(ref guidCmdGroup, nCmdId);
                // If the base class did not recognize the command then
                // see if we can handle the command.
                if (hr == (int)Microsoft.VisualStudio.OLE.Interop.Constants.OLECMDERR_E_UNKNOWNGROUP)
                {
                    if (guidCmdGroup == GuidList.guidTestLanguagePackageCmdSet)
                    {
                        if (nCmdId == PkgCmdIDList.InvokeCodeSnippetsBrowser)
                        {
                            hr = (int)(OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED);
                        }
                    }
                }
                return hr;
            }
        }
    }
    
  3. 재정의 HandlePreExec 메서드에서 ViewFilter 클래스를 얻을 수는 ExpansionProvider 개체와 호출의 DisplayExpansionBrowser 해당 개체의 메서드.

    using Microsoft.VisualStudio.Package;
    
    namespace TestLanguagePackage
    {
        class TestViewFilter : ViewFilter
        {
            public override bool HandlePreExec(ref Guid guidCmdGroup,
                                               uint nCmdId,
                                               uint nCmdexecopt,
                                               IntPtr pvaIn,
                                               IntPtr pvaOut)
            {
                if (base.HandlePreExec(ref guidCmdGroup,
                                       nCmdId,
                                       nCmdexecopt,
                                       pvaIn,
                                       pvaOut))
                {
                    // Base class handled the command.  Do nothing more here.
                    return true;
                }
    
                if (guidCmdGroup == GuidList.guidTestLanguagePackageCmdSet)
                {
                    if (nCmdId == PkgCmdIDList.InvokeCodeSnippetsBrowser)
                    {
                        ExpansionProvider ep = this.GetExpansionProvider();
                        if (this.TextView != null && ep != null)
                        {
                            bool bDisplayed = ep.DisplayExpansionBrowser(
                                this.TextView,
                                "TestLanguagePackage Snippet:",
                                null,
                                false,
                                null,
                                false);
                        }
                        return true;   // Handled the command.
                    }
                }
                return false;   // Did not handle the command.
            }
        }
    }
    

    다음 방법을 아래에 ExpansionProvider 클래스 라고에서 Visual Studio 지정 된 순서로 코드 조각을 삽입 하는 동안:

  4. OnItemChosen

  5. IsValidKind

  6. OnBeforeInsertion

  7. FormatSpan

  8. OnAfterInsertion

    뒤는 OnAfterInsertion 메서드 호출, 코드 조각을 삽입 한 및 ExpansionProvider 개체인 방금 삽입 된 코드 조각을 수정에 사용 되는 특수 한 편집 모드로.

바로 가기를 사용 하 여 코드 조각 삽입

완성 목록에서 바로 가기 메뉴 명령 구현 보다 훨씬 더 관련 된입니다. 먼저 IntelliSense 단어 완성 목록에 코드 조각 바로 가기 키를 추가 해야 합니다. 코드 조각 바로 가기 이름을 완성으로 인해 삽입 된 후에 검색 해야 합니다. 마지막으로 조각 제목 및 바로 가기 이름을 사용 하 여 경로 가져올 합니다 및 해당 정보를 전달의 InsertNamedExpansion 메서드는 ExpansionProvider 메서드.

단어 완성 목록에 코드 조각 바로 가기 키를 추가 하려면 다음에 추가 Declarations 에서 개체를 AuthoringScope 클래스입니다. 바로 가기는 코드 조각 이름과 식별할 수 있어야 합니다. 예제를 보려면 연습: 설치 코드 조각 (패키지 관리 프레임 워크)를 가져오는 중을 참조하십시오.

코드 조각 바로 가기 삽입을 감지할 수는 OnAutoComplete 메서드는 Declarations 클래스. 소스 파일에 이미 삽입 된 코드 조각 이름 때문에 확장 삽입할 때 제거 되어야 합니다. InsertNamedExpansion 메서드에서 사용 하는 조각;에 대 한 삽입 지점에 설명 하는 범위 범위 전체 코드 조각 이름이 소스 파일에 포함 되어 있는 경우 해당 이름은 조각에서 대체 됩니다.

다음 버전은는 Declarations 바로 가기 이름이 지정 된 코드 단편 삽입을 처리 하는 클래스입니다. 다른 방법으로는 Declarations 클래스는 이해를 돕기 위해 생략 했습니다. 이 클래스의 생성자를 사용 하는 노트는 LanguageService 개체입니다. 이것에서 중인의 버전을 전달할 수 있습니다는 AuthoringScope 개체 (예를 들어, 구현은 AuthoringScope 클래스 걸릴 수 있습니다는 LanguageService 생성자에서 개체 및 해당 개체에 전달를 TestDeclarations 클래스 생성자).

[C#]
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    internal class TestDeclarations : Declarations
    {
        private ArrayList       declarations;
        private LanguageService languageService;
        private TextSpan        commitSpan;

        public TestDeclarations(LanguageService langService)
            : base()
        {
            languageService = langService;
            declarations = new ArrayList();
        }

        // This method is used to add declarations to the internal list.
        public void AddDeclaration(TestDeclaration declaration)
        {
            declarations.Add(declaration);
        }

        

        // This method is called to get the string to commit to the source buffer.
        // Note that the initial extent is only what the user has typed so far.
        public override string OnCommit(IVsTextView textView,
                                        string textSoFar,
                                        char commitCharacter,
                                        int index,
                                        ref TextSpan initialExtent)
        {
            // We intercept this call only to get the initial extent
            // of what was committed to the source buffer.
            commitSpan = initialExtent;

            return base.OnCommit(textView,
                                 textSoFar,
                                 commitCharacter,
                                 index,
                                 ref initialExtent);
        }

        // This method is called after the string has been committed to the source buffer.
        public override char OnAutoComplete(IVsTextView textView,
                                            string committedText,
                                            char commitCharacter,
                                            int index)
        {
            TestDeclaration item = declarations[index] as TestDeclaration;
            if (item != null)
            {
                // In this example, TestDeclaration identifies types with a string.
                // You can choose a different approach.
                if (item.Type == "snippet")
                {
                    Source src = languageService.GetSource(textView);
                    if (src != null)
                    {
                        ExpansionProvider ep = src.GetExpansionProvider();
                        if (ep != null)
                        {
                            string title;
                            string path;
                            int commitLength = commitSpan.iEndIndex - commitSpan.iStartIndex;
                            if (commitLength < committedText.Length)
                            {
                                // Replace everything that was inserted
                                // so calculate the span of the full
                                // insertion, taking into account what
                                // was inserted when the commitSpan
                                // was obtained in the first place.
                                commitSpan.iEndIndex += (committedText.Length - commitLength);
                            }

                            if (ep.FindExpansionByShortcut(textView,
                                                           committedText,
                                                           commitSpan,
                                                           true,
                                                           out title,
                                                           out path))
                            {
                                ep.InsertNamedExpansion(textView,
                                                        title,
                                                        path,
                                                        commitSpan,
                                                        false);
                            }
                        }
                    }
                }
            }
            return '\0';
        }
    }
}

언어 서비스 바로 가기 이름을 가져옵니다 경우 호출 하는 FindExpansionByShortcut 메서드 파일 이름 및 코드 조각의 제목을 얻을 수 있습니다. 언어 서비스를 호출 하 고는 InsertNamedExpansion 메서드에서 ExpansionProvider 코드 조각을 삽입 하는 클래스입니다. 다음 방법으로 Visual Studio 지정 된 순서 대로 라고는 ExpansionProvider 코드 조각을 삽입 하는 동안 클래스:

  1. IsValidKind

  2. OnBeforeInsertion

  3. FormatSpan

  4. OnAfterInsertion

언어 서비스에 대 한 설치 코드 조각 가져오기에 대 한 자세한 내용은 연습: 설치 코드 조각 (패키지 관리 프레임 워크)를 가져오는 중.

ExpansionFunction 클래스를 구현합니다.

확장 함수를 조각 템플릿에서 포함 되 고 필드에 추가할 수 있는 하나 이상의 값을 반환 하는 명명 된 함수가입니다. 언어 서비스에서 확장 기능을 지원 하기 위해 클래스에서 파생 되어야는 ExpansionFunction 클래스와 구현에 GetCurrentValue 메서드. 다음 재정의 해야는 CreateExpansionFunction 메서드에서 LanguageService 클래스의 버전의 새 인스턴스를 반환 하는 ExpansionFunction 클래스가 지 원하는 각 확장 기능에 대 한. 확장 함수에서 사용할 수 있는 값의 목록을 지 원하는 경우에 재정의 해야는 GetIntellisenseList 메서드에서 ExpansionFunction 클래스가 해당 값 목록을 반환 합니다.

확장 공급자 확장 함수를 호출 하는 시점에 완전히 초기화 될 수 있는 대로 인수를 사용 하거나 다른 필드에 액세스 해야 하는 확장 함수는 편집 가능한 필드에 연결 되지 않습니다. 따라서 확장 함수 인수 또는 다른 필드의 값을 가져올 수 수 없습니다.

예제

단순 확장 함수 호출 하는 방법의 예를 들어 GetName 을 구현 될 수 있습니다. 이 확장 기능은 확장 함수 인스턴스화될 때마다 기본 클래스 이름에 번호를 추가 (각 시간에 관련 된 코드 조각에 해당 삽입 됩니다).

using Microsoft.VisualStudio.Package;

namespace TestLanguagePackage
{
    public class TestLanguageService : LanguageService
    {
        private int classNameCounter = 0;

        public override ExpansionFunction CreateExpansionFunction(
            ExpansionProvider provider,
            string functionName)
        {
            ExpansionFunction function = null;
            if (functionName == "GetName")
            {
                ++classNameCounter;
                function = new TestGetNameExpansionFunction(provider, classNameCounter);
            }
            return function;
        }
    }

    internal class TestGetNameExpansionFunction : ExpansionFunction
    {
        private int nameCount;

        TestGetNameExpansionFunction(ExpansionProvider provider, int counter)
            : base(provider)
        {
            nameCount = counter;
        }

        public override string GetCurrentValue()
        {
            string name = "TestClass";
            name += nameCount.ToString();
            return name;
        }
    }
}

참고 항목

작업

연습: 설치 코드 조각 (패키지 관리 프레임 워크)를 가져오는 중

개념

언어 서비스 (패키지 관리 프레임 워크)를 등록 하는 중

기타 리소스

언어 서비스 기능 (패키지 관리 프레임 워크)

코드 조각