2011-12-31 1 views
0

Я хотел бы создать добавление Visual Studio, которое может определить, находится ли каретка в данный момент внутри блока метода, класса или пространства имен, т.е. если каретка перемещается, добавление должен иметь возможность отметить статус, в котором карет в настоящее время находится внутри так называемого элемента.Узнайте, находится ли курсор внутри блока метода, класса или пространства имен

Если это можно расширить до любого блока C#, заключенного в фигурные скобки, например. свойства, которые были бы превосходными.

Хотя я проверял подобные вопросы, сообщите мне, если это повторный вопрос, поэтому я могу отметить его соответствующим образом. Если другие вопросы, связанные с добавлением VS Addin, полезны здесь, пожалуйста, дайте мне знать об этом.

В принципе, я хотел бы знать, какие методы мы можем использовать и как это можно сделать.

EDIT: Я думаю, короткий ответ, чтобы начать это:

  • Получить Visual Studio 2010 SDK SP1
  • Возможно использовать «расширяемость» проект шаблона «Текстовый редактор украшению» или какой-либо другой шаблон.
+0

Я бы предположил, что вы имеете в виду карету, а не курсор. TextPoint.CodeElement - это свойство ключа. –

+0

Спасибо @HansPassant, я отредактировал вопрос. – Faredoon

ответ

0

На самом деле, я думаю, что первое, что вам нужно сделать, - судить, сколько методов или свойств в вашем классе и какова их позиция. После получения этой информации. Следующий шаг, который вам нужно сделать, - судить, какова текущая позиция курсора. Затем вы можете сравнить данные тех методов, которые вы получили. До сих пор вы можете получить тот метод, в котором находится ваш курсор. Это решение для шара, которое я нахожу.

Давайте поговорим о некоторых технических деталях:

1.Как получить позиции методов и свойств?

вы можете использовать NRefacotry или CSParser, чтобы сделать это (я использую NRefactory закончить мое требование)

2.How получить позицию курсора?

В методе IVsTextView есть метод под названием GetCaretPos. Вы можете получить ActiveTextView через TextManager. Затем вы можете использовать метод GetCaretPos. Вот некоторые коды могут вам помочь.

public static IVsTextManager TextManager 
    { 
     get 
     { 
      if (textManager == null) 
      { 
       Object obj = Package.GetGlobalService(typeof(SVsTextManager)); 
       if (obj == null) 
       { 
        throw new ArgumentException("get textmanager failed in VSTextView"); 
       } 
       textManager = obj as IVsTextManager; 
      } 
      return textManager; 
     } 
    } 


    public static IVsTextView ActiveTextView 
    { 
     get 
     { 
      IVsTextView activeView = null; 
      if (TextManager != null) 
      { 
       TextManager.GetActiveView(1, activeTextBuffer, out activeView); 
      } 
      return activeView; 
     } 
    }