Расширение Visual Studio: как мне обрабатывать несколько карет? - PullRequest
0 голосов
/ 10 апреля 2020

Я разрабатываю пакет Visual Studio Extension / VSIX для работы, которая включает изменение позиции каретки. Конечно, работать с одной кареткой легко:

/// Get the Host of current active view
private async Task<IWpfTextViewHost> GetCurrentViewHostAsync()
{
    // First get the active view:
    var txtManager = (IVsTextManager)await ServiceProvider.GetServiceAsync(typeof(SVsTextManager));
    Assumes.Present(txtManager);
    IVsTextView vTextView = null;
    const int mustHaveFocus = 1;
    textManager.GetActiveView(mustHaveFocus, null, out vTextView);

    if (vTextView is IVsUserData userData)
    {
        // Get host
        IWpfTextViewHost viewHost;
        object holder;
        Guid guidViewHost = DefGuidList.guidWpfTextViewHost;
        userData.GetData(ref guidViewHost, out holder);
        viewHost = (IWpfTextViewHost)holder;

        return viewHost;
    }

    return null;
}

// Later:
private async void ExecCommand(object sender, EventArgs e)
{
    IWpfTextViewHost host = await GetCurrentViewHostAsync();

    // Access single caret
    host.TextView.Caret.MoveTo(/* New position here */);
}

Но, скажем, я использую команду «Вставить следующую совпадающую каретку», чтобы вставить другую каретку, поэтому у меня теперь есть две разные каретки. Перемещение каретки с использованием вышеуказанного метода удалит вторую карету, и, насколько я могу судить, IVsTextView имеет только одно свойство Caret.

Моя следующая идея состояла в том, что я должен получить доступ к другим курсорам с другими IVsTextManager интерфейсами в host, но самым близким, что я могу найти, является его метод EnumViews(IVsTextBuffer, IVsEnumTextViews), который всегда возвращает некоторое отрицательное, не S_OK значение и оставляет элемент IVsEnumTextViews как null. Аналогичная ситуация происходит с методом EnumIndependentViews.

Подхожу ли я к этому праву? Как работает функция «Несколько карет»? Я не могу найти документацию по этому вопросу. Позволяет ли мне API делать это?

...