Я разрабатываю пакет 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 делать это?