Adding a custom editor to visual studio editor list
Asked Answered
M

1

6

I am in the process of writing a custom editor for visual studio. I have implemented some basic functionality for the new language e.g. syntax highlighting and I succesfully installed tha package by using the generated .vsix file. All works just nice, however my custom editor needs to be able to be associated with different file extensions.

I thought, mistakenly, that since I installed the editor it would appear under

Tools->Options..->Text Editor->File Extension->Editors list:

enter image description here

However it does not appear there. So the question is: how do you add a custom editor to this list?

Thanks for any help!

Malefaction answered 15/10, 2012 at 19:51 Comment(0)
M
8

Well at least I got the tumbleweed badge for this question.

After a lot of reverse engineering I found the solution... which is not documented.. Anywhere..

Step number 1:

First you need to create an editor factory with all the bells and whistles it comes with - MSVS has an extension for it.

Step number 2: Then you have to create such a class

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    class ProvideFileExtensionMapping : RegistrationAttribute
    {
        private readonly string _name, _id, _editorGuid, _package;
        private readonly int _sortPriority;

        public ProvideFileExtensionMapping(string id, string name, object editorGuid, string package, int sortPriority)
        {
            _id = id;
            _name = name;
            if (editorGuid is Type)
            {
                _editorGuid = ((Type)editorGuid).GUID.ToString("B");
            }
            else
            {
                _editorGuid = editorGuid.ToString();
            }
            _package = package;
            _sortPriority = sortPriority;
        }

        public override void Register(RegistrationContext context)
        {
            using (Key mappingKey = context.CreateKey("FileExtensionMapping\\" + _id))
            {
                mappingKey.SetValue("", _name);
                mappingKey.SetValue("DisplayName", _name);
                mappingKey.SetValue("EditorGuid", _editorGuid);
                mappingKey.SetValue("Package", _package);
                mappingKey.SetValue("SortPriority", _sortPriority);
            }
        }

        public override void Unregister(RegistrationAttribute.RegistrationContext context)
        {
        }
    }

Step 3: Then you need to add this class as an attribute to your editor factory (which you created in step 1):

[ProvideFileExtensionMapping("{E23E32ED-3467-4401-A364-1352666A3502}", "RText Editor", typeof(EditorFactory), GuidList.guidRTextEditorPluginEditorFactoryString, 100)]
public sealed class EditorFactory : IVsEditorFactory, IDisposable{...}

That's it. You should now be able to see your editor in the list of editors in visual studio.

Your editor shall be invoked when the file mapping is right.

Hopefully this post saves a lot of time for someone else..

Malefaction answered 26/10, 2012 at 5:42 Comment(1)
If only Oracle would get their ODT team to implement this for their editorLaveralavergne

© 2022 - 2024 — McMap. All rights reserved.