views:

711

answers:

4

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.

A: 

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)

demoncodemonkey
A: 

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.

Juozas Kontvainis
A: 

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).

Jeff Martin
Too complex, no error handling, and does not support undo.
AMissico
A: 

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
AMissico