Thursday, April 14, 2011

Visual Studio Macro to Paste similar to String.Format

I'd like to be able to cut/copy a string like "<strong>{0}</strong>" for example.

I'd like to then select some code such as "Hello, World" and then invoke a macro which will result in "<strong>Hello, World</strong>".

How could you do this?

Update: WHY do I want to do this?

I could just make a macro or shortcut to add something specific like a <strong> tag to a selection. However, my idea to create any sort of "surround with" paste behavior on the fly.

Fairly often, I paste in a list of fields or properties. So from somewhere else I get

PersonID
FirstName
LastName

And just as an example, I know I want to set those up as

FieldName = dataRow("FieldName").Value

With my magic macro, I could select the following and press CTRL+C to get it in my clipboard:

{0} = dataRow("{0}").Value

Then all I have to do is go line by line and apply my magic paste.

From stackoverflow
  • Wouldn't it be better to define a macro that added the 'strong' tags around the selected text? Then you could assign it to Ctrl+B or whatever.

    Having to select both chunks of text and invoking the macro twice seems too much like hard work to me.

    (maybe you need to explain why you want to do this)

  • You may want to read this article: http://www.viemu.com/a-why-vi-vim.html

    And then start using VIM, or at least ViEmu ;)

    As an alternative, you can develop your own Visual Studio Add-In. It's not that hard, and it will have the exact features that you neeed.

  • Fun little project.

    Option Strict Off
    Option Explicit Off
    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports EnvDTE90
    Imports System.Diagnostics
    
    Public Module StringFormatModule
    
        Private clipText As String
    
        Public Property ClipboardText() As String
            Get
                RunThread(AddressOf GetClipboardText)
                Return clipText
            End Get
            Set(ByVal value As String)
                clipText = value
                RunThread(AddressOf CopyToClipboard)
            End Set
        End Property
    
        Private Function RunThread(ByVal fct As Threading.ThreadStart)
            Dim thread As New Threading.Thread(fct)
            thread.ApartmentState = Threading.ApartmentState.STA
    
            thread.Start()
            thread.Join()
        End Function
    
        Private Sub GetClipboardText()
            clipText = My.Computer.Clipboard.GetText()
        End Sub
    
        Private Sub CopyToClipboard()
            My.Computer.Clipboard.SetText(clipText)
        End Sub
    
        Sub FormatSelectedTextWithCopiedText()
            Dim formatString As String
    
            formatString = ClipboardText
    
            Dim token As String
            Dim selectedText As TextSelection
            selectedText = DTE.ActiveDocument.Selection
            token = selectedText.Text
            selectedText.Text = String.Format(formatString, token)
        End Sub
    End Module
    

    I borrowed the clipboard code from here.

    This does work. I tested it on a text file, copy your formatstring into the clipboard (ctrl-c), highlight the text you want to format, and then run the macro (i just doubleclicked it from the macro explorer but you could make a keyboard shortcut).

    AMissico : Too complex, no error handling, and does not support undo.
  • Instead of {0}, I use &. Assign macro to Ctrl+Q and you are all set!

    ' Wraps the current selection with the specified text. Use the & character as the anchor for the selected text.
    Public Sub WrapSelection()
        Dim selection As TextSelection = DirectCast(DTE.ActiveDocument.Selection, TextSelection)
        DTE.UndoContext.Open("Wrap Selection")
    
        Try
            Dim sInput As String = InputBox("Wrap(&&, state)")
            If Len(sInput) > 0 Then
                Dim sContent As String = selection.Text
                Dim iStart As Integer = InStr(sInput, "&") - 1
                Dim iEnd As Integer = InStrRev(sInput, "&")
                selection.Insert(sInput.Substring(0, iStart) + sContent + sInput.Substring(iEnd), vsInsertFlags.vsInsertFlagsContainNewText)
                'selection.Insert(sInput.Substring(iEnd), vsInsertFlags.vsInsertFlagsInsertAtEnd)
            End If
    
        Catch ex As Exception
            DTE.UndoContext.SetAborted()
            MsgBox(ex.Message)
    
        Finally
            'If an error occured, then need to make sure that the undo context is cleaned up.
            'Otherwise, the editor can be left in a perpetual undo context
            DTE.UndoContext.Close()
    
        End Try
    
    End Sub
    

0 comments:

Post a Comment