2010-09-29 43 views
1

Je suis nouveau dans la création d'addins pour Visual Studio, mais j'ai réussi à construire un outil simpe pour VS2010 qui fait un peu de manipulation de texte dans la fenêtre de code actuellement active. Je suis au point où j'ai besoin de connaître la langue (VB.Net, C# ou autre) de la vue de texte en cours.Langue pour l'affichage de texte dans l'extension VS2010

J'ai essayé d'obtenir le nom de fichier (donc je peux regarder l'extension pour déterminer la langue) en utilisant le le code suivant:

IVsTextManager txtMgr = (IVsTextManager)GetService(typeof(SVsTextManager)); 
int mustHaveFocus = 1;//means true 
txtMgr.GetActiveView(mustHaveFocus, null, out currentTextView); 

userData = currentTextView as IVsUserData; 
if (userData == null)// no text view 
{ 
    Console.WriteLine("No text view is currently open"); 
    return; 
} 

object pathAsObject; 
Guid monikerGuid = typeof(IVsUserData).GUID; 
userData.GetData(ref monikerGuid, out pathAsObject); 
string docPath = (string)pathAsObject; 

Malheureusement pathAsObject retourne toujours null. Y a-t-il un autre moyen d'obtenir le nom de fichier/la langue?

Répondre

1

On dirait que cela fonctionne:

// Get the current text view. 
IVsTextManager txtMgr = (IVsTextManager)GetService(typeof(SVsTextManager)); 
int mustHaveFocus = 1;//means true 
txtMgr.GetActiveView(mustHaveFocus, null, out currentTextView); 

userData = currentTextView as IVsUserData; 
if (userData == null)// no text view 
{ 
    Console.WriteLine("No text view is currently open"); 
    return; 
} 

// In the next 4 statments, I am trying to get access to the editor's view 
object holder; 
Guid guidViewHost = DefGuidList.guidIWpfTextViewHost; 
userData.GetData(ref guidViewHost, out holder); 
viewHost = (IWpfTextViewHost)holder; 

// Get a snapshot of the current editor's text. 
allText = viewHost.TextView.TextSnapshot.GetText(); 

// Get the language for the current editor. 
string language = viewHost.TextViewtextView.TextDataModel.ContentType.TypeName; 

Ce retourne "Basic" pour VB.Net, ce qui est exactement ce que je dois savoir.

+1

Juste pour info, vous devriez essayer d'éviter snapshot.GetText(). Il est relativement coûteux pour le tampon de se transformer en une seule grande chaîne (elle est stockée dans un "arbre à morceaux", pas sous la forme d'une seule chaîne sous les couvertures). –

+0

@Noah: Merci - c'est bon à savoir. – Kramii