2009-01-02 30 views
10

我想讓Visual Studio將自動完成的結束標記向右移動一個單詞(或多個)。例如,假設下面的HTML:如何在Visual Studio中移動自動完成的結束標記

<p>I need to emphasize some text.</p> 

如果我的話之前鍵入<em>「強調」,Visual Studio將自動完成,像這樣:

<p>I need to <em></em>emphasize some text.</p> 

然後,我需要使封閉</em>得到什麼我想要:

<p>I need to <em>emphasize</em> some text.</p> 

是否有辦法使Visual Studio自動執行最後一步?

回答

6

你的問題讓我想到如果這個功能存在將會有多酷。幸運的是,在VS中實現宏是非常簡單的。以下是宏的代碼。您可以使用VS中的自定義工具輕鬆地將其綁定到CTRL + ALT +右鍵。

注意:我只是把這個一起很快被它的週五晚上)

Sub MoveClosingTag() 
    Dim ts As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection) 
    Dim start As EditPoint = ts.ActivePoint.CreateEditPoint() 
    Dim tag As String 

    ts.WordRight(True) 
    If ts.Text = "</" Then 
     Do Until ts.ActivePoint.AtEndOfLine 
      ts.CharRight(True) 
      If ts.Text.EndsWith(">") Then Exit Do 
     Loop 
     tag = ts.Text 
     If tag.EndsWith(">") Then 
      ts.Delete() 
      ts.WordRight(False) 
      ts.Insert(tag, EnvDTE.vsInsertFlags.vsInsertFlagsCollapseToStart) 
     Else 
      ts.MoveToPoint(start) 
     End If 
    Else 
     ts.MoveToPoint(start) 
    End If 
End Sub 
3

我不認爲這是可能的。但是,您可以配置哪些HTML標籤會自動關閉:

工具 - >選項 - >文本編輯器 - > HTML - >格式 - >「標記特定選項」按鈕 - >客戶端HTML標記 - > em - >關閉標記 - >無結束標記

另請注意,自動移動結束標記不是微不足道的(應該是Word的邊界?),它只包含一個非常特殊的用例(只有一個單詞應該突出顯示)。

+0

如果有HTML重構類型函數,那麼您可以在標籤內選擇想要的內容然後選擇'wrap with'所需的標籤。 – 2009-01-02 16:14:56

+1

我實際上更喜歡像CTRL +右箭頭那樣將結束標記向右移動一個單詞。這樣,你可以根據需要多次... – Hugh 2009-01-02 16:28:01

+0

@Hugh:是的,那也會很酷。我其實試過看看它是否會起作用。 – 2009-01-02 16:44:28

2

道具@ w4g3n3r做的辛勤工作。我已經修改了一下這個宏,可以更好地利用空格。

注:我發現CTRL+.很適合作爲此快捷鍵;您的無名指已經在我原先描述的用例的.密鑰中。

Sub MoveClosingTag() 
    Dim ts As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection) 
    Dim start As EditPoint = ts.ActivePoint.CreateEditPoint() 
    Dim tag As String 

    ts.WordRight(True) 
    If ts.Text = "</" Then 
     Do Until ts.ActivePoint.AtEndOfLine 
      ts.CharRight(True) 
      If ts.Text.EndsWith(">") Then Exit Do 
     Loop 
     tag = ts.Text 
     If tag.EndsWith(">") Then 
      ts.Delete() 
      Dim pos As Integer 
      pos = ts.CurrentColumn 
      ts.FindPattern(">", vsFindOptions.vsFindOptionsRegularExpression) 
      If ts.CurrentColumn = pos Then 
       ts.WordRight(False) 
       ts.FindPattern(">", vsFindOptions.vsFindOptionsRegularExpression) 
      End If 
      ts.Insert(tag, EnvDTE.vsInsertFlags.vsInsertFlagsCollapseToStart) 
     Else 
      ts.MoveToPoint(start) 
     End If 
    Else 
     ts.MoveToPoint(start) 
    End If 
End Sub 
相關問題