Unescape my Strings
Since I started using Visual Studio 2005 and now 2008 it bugs me that strings in the debug windows (Immediate, Watch, Locals, Autos, etc) are automatically escaped in C# syntax (well, at least in C# projects.)
Let's assume we are writing some code that produces HTML (or XML, or SQL, or JSON, etc) where the text identation is important for understanding the contents. If we find ourselves in the middle of debugging that code and check the value of a variable containing such type of text, here's what we would see.
System.Diagnostics.Debug.WriteLine(html); Console.WriteLine(html); // BREAKPOINT HERE Console.ReadLine();
The Immediate window becomes less useful. The line breaks below do not exist in the Immediate window, I added them here for clarity.
?html "<html>\r\n\t<head>\r\n\t\t<title>Monthly Report</title>\r\n\t\t<style> \r\n\t\t\t.results td {color:#999;}\r\n\t\t\t/*etc*/\r\n\t\t</style>\r \n\t</head>\r\n\t<body>\r\n\t\t<h1>Report for April 2008</h1>\r\n\t\t<d iv id=\"content\">\r\n\t\t\t<p>\r\n\t\t\t\ttext goes here...\r\n\t\t\t<p >\r\n\t\t</div>\r\n\t</body>\r\n</html>"
Same problem in the Locals or Autos windows, but there at least you can use the visualizers.
Too many clicks for me, though. Besides, the visualizers are modal windows and that makes it harder when you want to compare things.
If you happen to know how to revert to the old behavior of keeping the text format, please let me know. Until I find the right way (or at least a better way) I'm using a little macro to output any selected escaped text, unescaped to a new output pane.
To create the macro:
- View » Other Windows » Macro Explorer
- Right-click "My Macros" » New Module
- Call the new module Unescape
- Add the following sub
Public Module Unescape Public Sub UnescapeText() Dim winName As String = "Unescaped" Dim win As Window Dim output As OutputWindow Dim pane As OutputWindowPane = Nothing If DTE.ActiveWindow IsNot Nothing AndAlso _ DTE.ActiveWindow.Selection IsNot Nothing Then Dim text As String = DTE.ActiveWindow.Selection.Text If Not String.IsNullOrEmpty(text) Then text = text.Replace("\t", vbTab) _ .Replace("\r\n", vbCrLf) _ .Replace("\n", vbCrLf) _ .Replace("\r", vbCrLf) _ .Replace("\""", """") win = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) output = win.Object For Each p As OutputWindowPane In output.OutputWindowPanes If p.Name = winName Then pane = p Exit For End If Next If pane Is Nothing Then _ pane = output.OutputWindowPanes.Add(winName) win.Activate() pane.Activate() pane.OutputString(text) End If End If End Sub End Module
I made a shortcul for this macro:
- Tools » Options » Environment » Keyboard
- Show commands containing: unescape
- Select the macro when it gets listed
- Add a Global shortcut, I used Ctrl+Alt+U
Now if I select the escaped text in the Immediate window and press the macro shortcut, I get the following:
If I keep selecting other escaped texts and unescaping them, they'll just be appended to that output, making it possible to do some visual inspection or comparisons.