2010-11-03 9 views
6

बनाना मैं कुछ समय के लिए विजुअल स्टूडियो के लिए एक साधारण टेक्स्ट-मैनिपुलेटिंग एक्सटेंशन बनाना चाहता हूं, और अब मुझे अंत में कुछ समय मिल गया है कि एक्सटेंशन कैसे लिखे गए हैं। मेरे मन में जो कुछ है, वह वीबीए मैक्रोज़ के माध्यम से पूरा किया जा सकता है, लेकिन मैं इसे "असली" एक्सटेंशन के रूप में कार्यान्वित करना चाहता हूं; एक सीखने की प्रक्रिया के रूप में, और क्योंकि मैं ईमानदारी से वीबीए नहीं खड़ा कर सकता हूं।एक साधारण टेक्स्ट-मैनिपुलेटिंग विजुअल स्टूडियो 2010 एक्सटेंशन

एक उचित मात्रा में गुगलिंग, ब्लॉग पढ़ने, एमएसडीएन में खोदने और स्टैक ओवरव्लो पोस्ट ब्राउज़ करने के बाद, मुझे लगता है कि मैंने पर्याप्त जानकारी एकत्र की है जिसे मैं इसे कार्यान्वित कर सकता हूं - लेकिन मुझे कुछ फीडबैक चाहिए कि मैं चीजों के करीब आ रहा हूं या नहीं सही इससे पहले कि मैं दूर हैकिंग :)

शुरू मैं क्या करना चाहते है:

  1. आदेश है कि उपयोगकर्ताओं को के माध्यम से उपकरण> विकल्प> कुंजीपटल करने के लिए बाध्य कर सकते हैं हॉटकी का पंजीयन।
  2. कमांड लागू होने पर सक्रिय विंडो के टेक्स्ट बफर को संशोधित करें।
  3. मैं वास्तव में मेनू या टूलबार के बारे में परवाह नहीं है, लेकिन .vsct फ़ाइलों के माध्यम से इसे जोड़ने के लिए कैसे पता (वहाँ बेहतर विकल्प क्या हैं?)

# 1 के लिए, ऐसा लगता है मैं एक पूर्ण VSPackage क्या करना है , .vsct फ़ाइल et cetera - कोई अच्छा और आसान MEF एक्सटेंशन बिंदु नहीं है जिसके बजाय मैं संभाल सकता हूं? (शायद IWpfTextViewCreationListener निर्यात कर रहे हैं और मैन्युअल कीबोर्ड शॉर्टकट हैंडलिंग के साथ चारों ओर झुकाव - लेकिन यह एक बड़ा हैक होगा)।

# 2 के लिए, मुझे यकीन है कि सक्रिय दस्तावेज़ के लिए ITextBuffer कैसे प्राप्त करें। मैं DTE.ActiveDocument के माध्यम से जा सकता हूं, लेकिन मुझे यकीन नहीं है कि ITextBuffer उस से कैसे प्राप्त करें। वैकल्पिक रूप से, मैं की तर्ज पर कुछ कर सकते हैं ...

var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager)); 
IVsTextView textViewCurrent; 
txtMgr.GetActiveView(true, null, out textView); 
IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView); 
ITextBuffer textCurrent = wpfViewCurrent.TextBuffer; 

... लेकिन यह है कि यकीन है कि काम करने के एक राउंडअबाउट रास्ता कैसा दिखता है?

उत्तर

9

इनमें से दोनों के लिए, Align Assignments extension source पर एक नज़र डालें। यह एक पैकेज/एमईएफ घटक है जो एक कमांड जोड़ता है और सक्रिय विंडो में इसे संभालता है।

आपका उत्तर # 1 सही है। आदेश करने का सबसे अच्छा तरीका एक .vsct फ़ाइल के साथ है, जिसके लिए एक पैकेज की आवश्यकता होती है। हालांकि, सभी पैकेज का मतलब यह है कि आपकी परियोजना एम्बेडेड संसाधनों (.vsct फ़ाइल से) और एक .pkgdef फ़ाइल के साथ एक डीएलएल का उत्पादन करेगी, जो आपके पैकेज पर आपके द्वारा प्रदान की जाने वाली विशेषताओं के अनुसार रजिस्ट्री कुंजी जोड़ती है। यह (उम्मीद है) बहुत ज्यादा उपर नहीं है।

आपके दूसरे प्रश्न के लिए, एक क्लीनर तरीका है। command filter पर एक नज़र डालें, जो वैश्विक रूप से सुनने के लिए सक्रिय दृश्य में कमांड के लिए सुनता है और फिर सक्रिय दृश्य ढूंढता है। यह शैल कमांड रूटिंग को संभालने देता है और केवल कार्यान्वयन पर ध्यान केंद्रित करता है।

+0

धन्यवाद! प्रत्येक VsTextView में एक फ़िल्टर जोड़ने के बारे में कुछ है जो मुझे थोड़ा परेशान करता है, लेकिन समाधान * निश्चित रूप से बेहतर है।बहुत बुरा अभी भी बदसूरत कॉम/ओले विरासत से निपटना है, लेकिन कम से कम यह न्यूनतम है और इसे दूर किया जा सकता है :) – snemarch

0

नहीं पूरी तरह से सुनिश्चित करें कि आप "पाठ बफर" लेकिन यह सोचते हैं आप या तो मौजूदा पाठ फ़ाइल खोलने या वर्तमान चयन है मतलब द्वारा क्या मतलब है, यहाँ मैं एक पैकेज में कुछ कोड उन तक पहुँचने के लिए है:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text") 
{ 
    EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty); 
    if (!text.Selection.IsEmpty) 
    { 
     //work with text.Selection.Text 
    } 
} 

बेशक यदि आप एक संपादक एक्सटेंशन कर रहे हैं तो यह अलग होगा।

+0

मेरा मतलब है कि वर्तमान/सक्रिय दस्तावेज़ के लिए ITextBuffer प्राप्त करना - जो अधिक सीमित डीटीई/चयन विधियों के बजाय टेक्स्ट संपादन सेवाओं के साथ इंटरफेस करने का नया तरीका है। – snemarch

संबंधित मुद्दे