|
So nice! It's very useful. Thanks!
Raluca
|
|
|
|
|
in .net studio 2005 , for c#, if you go to the very bottom of the file and remove closing } and type it again - it will reformat code nicely.
so it maybe makes sense to write similar macro to run for all files in the project
|
|
|
|
|
This is the sweetest thing I've ever seen. thanks!
|
|
|
|
|
Hj,
The tool is very nice and usefull , especially when different users with different styles are dealing with the same code.
I tried the tool, and therefore I would like to add a comment.
Some people are writing code by using " { " on a different line , and others put " { " on the same line: Sample :
for
{
}
or
for {
}
Me am intereseted in having on the same line , and here rise my question: It is possible to make it configurable to support both variants ?
Best Regards
Victor Cuteanu
victor_cutty@yahoo.com
|
|
|
|
|
Hi!
First of all, thanks for this really nice macro that I have been using
regurlarly since my days with VC6.
To fix the problem of formatting e.g. "i--" as "i - -" I changed the
beginning of the FixOperator function as follows:
Private Sub FixOperator(ByVal strOperator As String, ByVal nLen As Integer, Optional ByVal bCheckBrace As Boolean = False)
Dim strLastPos As String = InitializePosition()
Dim selection As TextSelection = ActiveDocument.Selection
Dim strMatch As String
If strOperator.Equals("-") Then
strMatch = "[A-Za-z0-9\)_\]]" & strOperator & "[A-Za-z0-9\(_\*""'&]"
Else
strMatch = "[A-Za-z0-9\)_\]]" & strOperator & "[A-Za-z0-9\(_\*""'&\-]"
End If
' Add one space between the operator
While selection.FindText(strMatch, vsFindOptions.vsFindOptionsRegularExpression) And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
selection.CharLeft()
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
selection.FindText(strMatch, vsFindOptions.vsFindOptionsRegularExpression)
...
...
...
...
End Sub
I actually don't know Basic but it worked for me and I hope it works
for others.
Andreas Schoenle
mailto:aschoen@_remove_gwdg.de
|
|
|
|
|
the following is a reformatted code segment with the macro, obviously more reformatting is needed:
double espl1(double *x, double *y, int n, double *dy, double *ddy,
double *t, int m, double *z, double *dz, double *ddz)
{
int i, j;
double h0, h1, alpha, beta, g, *s;
s = new double [n];
s[0] = dy[0];
dy[0] = 0.0;
h0 = x[1] - x[0];
for (j = 1; j <= n - 2; j++)
{
h1 = x[j + 1] - x[j];
alpha = h0/ (h0 + h1);
beta = (1.0 - alpha)* (y[j] - y[j - 1])/h0;
beta = 3.0* (beta + alpha* (y[j + 1] - y[j])/h1);
dy[j]=-alpha/ (2.0+ (1.0 - alpha)*dy[j - 1]);
s[j] = (beta- (1.0 - alpha)*s[j - 1]);
s[j] = s[j]/ (2.0+ (1.0 - alpha)*dy[j - 1]);
h0 = h1;
}
for (j = n - 2; j >= 0; j--)
dy[j] = dy[j]*dy[j + 1] + s[j];
for (j = 0; j <= n - 2; j++)
s[j] = x[j + 1] - x[j];
for (j = 0; j <= n - 2; j++)
{
h1 = s[j]*s[j];
ddy[j] = 6.0* (y[j + 1] - y[j])/h1 - 2.0* (2.0*dy[j] + dy[j + 1])/s[j];
}
h1 = s[n - 2]*s[n - 2];
ddy[n - 1] = 6.* (y[n - 2] - y[n - 1])/h1 + 2.* (2.*dy[n - 1] + dy[n - 2])/s[n - 2];
g = 0.0;
for (i = 0; i <= n - 2; i++)
{
h1 = 0.5*s[i]* (y[i] + y[i + 1]);
h1 = h1 - s[i]*s[i]*s[i]* (ddy[i] + ddy[i + 1])/24.0;
g = g + h1;
}
for (j = 0; j <= m - 1; j++)
{
if (t[j] >= x[n - 1])
i = n - 2;
else
{
i = 0;
while (t[j]>x[i + 1]) i = i + 1;
}
h1 = (x[i + 1] - t[j])/s[i];
h0 = h1*h1;
z[j] = (3.0*h0 - 2.0*h0*h1)*y[i];
z[j] = z[j] + s[i]* (h0 - h0*h1)*dy[i];
dz[j] = 6.0* (h0 - h1)*y[i]/s[i];
dz[j] = dz[j]+ (3.0*h0 - 2.0*h1)*dy[i];
ddz[j] = (6.0 - 12.0*h1)*y[i]/ (s[i]*s[i]);
ddz[j] = ddz[j]+ (2.0 - 6.0*h1)*dy[i]/s[i];
h1 = (t[j] - x[i])/s[i];
h0 = h1*h1;
z[j] = z[j]+ (3.0*h0 - 2.0*h0*h1)*y[i + 1];
z[j] = z[j] - s[i]* (h0 - h0*h1)*dy[i + 1];
dz[j] = dz[j] - 6.0* (h0 - h1)*y[i + 1]/s[i];
dz[j] = dz[j]+ (3.0*h0 - 2.0*h1)*dy[i + 1];
ddz[j] = ddz[j]+ (6.0 - 12.0*h1)*y[i + 1]/ (s[i]*s[i]);
ddz[j] = ddz[j]- (2.0 - 6.0*h1)*dy[i + 1]/s[i];
}
if(s) delete [] s;
return (g);
}
Thanks any way.
|
|
|
|
|
I ran this on my C# code and it pulled this pragma to column 0. I don't want it to move. What can I do?
|
|
|
|
|
Annoying, isn't it?
That happens as a result of the call to "SmartIndent" on line 231. Comment that out and the problem won't occur.
Regards,
Alvaro
I cannot take anything the Bush administration does seriously. The corruption, the cynical disregard for humanity, the cronyism and incompetence, all wrapped in a slimey flag of ultra-marketed nationalism repulses me. -- consdubya from fark.com.
|
|
|
|
|
http://sourceforge.net/projects/astyle/[^]
I have used it for a very long time (C++)and works perfectly.If you need a shortcut, you can declare it as a tool in MSVC IDE with proper parameters, and create a macro to activate it.
Sorry if I offended anyone.
|
|
|
|
|
Thanks. But an even better alternative is to upgrade to VS.NET 2005.
Regards,
Alvaro
I cannot take anything the Bush administration does seriously. The corruption, the cynical disregard for humanity, the cronyism and incompetence, all wrapped in a slimey flag of ultra-marketed nationalism repulses me. -- consdubya from fark.com.
|
|
|
|
|
Thank you very much for this nice set of macros. I always wonder how ugly my code may look to someone else. When I ran the macros, it pretty much left things intact. I do like the extra spaces after the 'if' statements, but I find it so much easier to but the parenthesis up right next to it while working. That was the only difference I noticed in my code. Thanks again!
|
|
|
|
|
Hi,
I get an Error Message when I run MakeCodeNicer during the following line:
DTE.Documents.Add("Text")
The Message: Die Vorlage "General\Text File" ist für das ausgewählte Projekt ungültig.
in german english: The Template "General\Text File" is not valid for the choosed Project.
I try to reformat C++ code. Any hints? I looked at the options, at google for the error message, in dev help and so on. No hints.
Tschoe,
Rüdiger
|
|
|
|
|
That's strange. Your current project does not allow creating Text files? Have you tried creating a Text file from the "File/New/File..." menu?
Regards,
Alvaro
I cannot take anything the Bush administration does seriously. The corruption, the cynical disregard for humanity, the cronyism and incompetence, all wrapped in a slimey flag of ultra-marketed nationalism repulses me. -- consdubya from fark.com.
|
|
|
|
|
hi Rudiger,
I m facing same problem have you found the workaround
Thnx.
|
|
|
|
|
Good morning,
if I have some deklarations like this:
BigDataTypeStruct *pSomething;
char cValue[CSV_MAX_LINE_LEN],
cLine[CSV_MAX_LINE_LEN];
long i = 0,
z = 1;
the result of reformat replaces the tabs before each line without the datatype:
BigDataTypeStruct *pSomething;
char cValue[CSV_MAX_LINE_LEN],
cLine[CSV_MAX_LINE_LEN];
long i = 0,
z = 1;
and this looks NOT nice!
In my opinion the example code of var deklaration is better readable instead the datatype on each line.
BR
Stephan
|
|
|
|
|
Nice idea, but it doesn't seem to like templates.
Changes foo<bar> to foo < bar> which is a little jarring.
Would be nice if it split for loops into:
for(int i = 0;
i < n;
++i)
{
}
, but I'm sure that's stylistic and bound to cheese some people off.
Good work otherwise tho.
|
|
|
|
|
It's non-free, but there's a 14-day trial; ProFactor StyleManager - a highly configurable Visual Studio source code reformatting plugin.
|
|
|
|
|
Studio auto formatting code has a bad habit of causing blank lines to be filled
with spaces (or tabs) up to the indent level. I created a macro a long time ago
which removes this problem. It may not be the best way to do this (I don't know
the language well, but can create a quick macro and make it work). I have added
a call to this function right after the call to IndentSwitchBody, and now the
MakeCodeNicer will truely blank out the blank lines:
function PurgeNonBlankBlankLines
while ActiveDocument.Selection.FindText("^\:b+$", dsMatchRegExp)
ActiveDocument.Selection.StartOfLine dsFirstText
ActiveDocument.Selection.EndOfLine dsExtend
ActiveDocument.Selection.Delete
wend
end function
Btw, thanks for a good macro and a nice improvement over basic Alt-F8 behavior.
|
|
|
|
|
PRIVATE FUNCTION IsWithinComment
DIM nCurrentLine, nCurrentColumn
DIM nBeginCommentLine, nBeginCommentColumn
DIM nEndCommentLine, nEndCommentColumn
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.Cancel
ActiveDocument.Selection.StartOfLine dsFirstText, dsExtend
IsWithinComment = false
IF (InStr(1, ActiveDocument.Selection, "//", vbTextCompare) > 0) THEN
IsWithinComment = true
nCurrentLine = nCurrentLine + 1
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
IF not IsWithinComment THEN
' Now look to see if we are in a c multiline comment, we do this by simply looking
' from out current position to the beginning of the file for "/*" '
ActiveDocument.Selection.FindText "\/\*", dsMatchCase + dsMatchBackward + dsMatchWord _
+ dsMatchRegExp
bContinue = GetCurrentPosition (strLastPos)
IF bContinue THEN
nBeginCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
' Look forward for the matching "*/" '
ActiveDocument.Selection.FindText "\*\/", dsMatchCase + dsMatchForward + dsMatchWord _
+ dsMatchRegExp
nEndCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
IF nBeginCommentLine <= nCurrentLine and _
nBeginCommentColumn < nCurrentColumn and _
nEndCommentLine >= nCurrentLine and _
nEndCommentColumn > nCurrentColumn THEN
IsWithinComment = true
END IF
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
END IF
END FUNCTION ' IsWithinComment'
Sean C. Hubbell
|
|
|
|
|
PRIVATE FUNCTION IsWithinComment
DIM nCurrentLine, nCurrentColumn
DIM nBeginCommentLine, nBeginCommentColumn
DIM nEndCommentLine, nEndCommentColumn
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.Cancel
ActiveDocument.Selection.StartOfLine dsFirstText, dsExtend
IsWithinComment = false
IF (InStr(1, ActiveDocument.Selection, "//", vbTextCompare) > 0) THEN
IsWithinComment = true
nCurrentLine = nCurrentLine + 1
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
IF not IsWithinComment THEN
' Now look to see if we are in a c multiline comment, we do this by simply looking
' from out current position to the beginning of the file for "/*" '
ActiveDocument.Selection.FindText "\/\*", dsMatchCase + dsMatchBackward + dsMatchWord _
+ dsMatchRegExp
IF bContinue THEN
nBeginCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
' Look forward for the matching "*/" '
ActiveDocument.Selection.FindText "\*\/", dsMatchCase + dsMatchForward + dsMatchWord _
+ dsMatchRegExp
nEndCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
IF nBeginCommentLine <= nCurrentLine and _
nBeginCommentColumn < nCurrentColumn and _
nEndCommentLine >= nCurrentLine and _
nEndCommentColumn > nCurrentColumn THEN
IsWithinComment = true
END IF
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
END IF
END FUNCTION ' IsWithinComment'
Sean C. Hubbell
|
|
|
|
|
Finally, again after another set of testing, this should be the one:
PRIVATE FUNCTION IsWithinComment
DIM nCurrentLine, nCurrentColumn, bContinue
DIM nBeginCommentLine, nBeginCommentColumn
DIM nEndCommentLine, nEndCommentColumn
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.Cancel
ActiveDocument.Selection.StartOfLine dsFirstText, dsExtend
IsWithinComment = false
IF (InStr(1, ActiveDocument.Selection, "//", vbTextCompare) > 0) THEN
IsWithinComment = true
nCurrentLine = nCurrentLine + 1
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
IF not IsWithinComment THEN
' Now look to see if we are in a c multiline comment, we do this by simply looking
' from out current position to the beginning of the file for "/*" '
ActiveDocument.Selection.FindText "\/\*", dsMatchCase + dsMatchBackward + dsMatchWord _
+ dsMatchRegExp
bContinue = GetCurrentPosition (ActiveDocument.Selection)
IF bContinue THEN
nBeginCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
' Look forward for the matching "*/" '
ActiveDocument.Selection.FindText "\*\/", dsMatchCase + dsMatchForward + dsMatchWord _
+ dsMatchRegExp
nEndCommentLine = ActiveDocument.Selection.CurrentLine
nEndCommentColumn = ActiveDocument.Selection.CurrentColumn
IF nBeginCommentLine <= nCurrentLine and _
nBeginCommentColumn < nCurrentColumn and _
nEndCommentLine >= nCurrentLine and _
nEndCommentColumn > nCurrentColumn THEN
IsWithinComment = true
END IF
END IF
ActiveDocument.Selection.MoveTo nCurrentLine, nCurrentColumn
END IF
END FUNCTION ' IsWithinComment'
Sean C. Hubbell
|
|
|
|
|
It doesn't work 100% yet, but I haven't the time to fix it right now. If you fix anything with it, post it here.
'------------------------------------------------------------------------------
'FILE DESCRIPTION: Routines to reformat C/C++ source code.
'Created by Alvaro Mendez - June 10, 1999
'Ported to VS.NET 7.1 by Anders Dalvander - July 18, 2003
'Last Updated: July 18, 2003
'------------------------------------------------------------------------------
Option Explicit On
Imports EnvDTE
Imports System.Diagnostics
Imports Microsoft.VisualStudio.VCProjectEngine
Imports System
Public Module MakeCodeNicer
Sub MakeCodeNicer()
'DESCRIPTION: Reformats the source code to look nicer, the way I like it.
' Check that we have a valid source file
If Not CheckActiveDocument() Then
Exit Sub
End If
' Select the whole file and reformat it
ActiveDocument.Selection.SelectAll()
ReformatSelection()
End Sub
Sub MakeSelectedCodeNicer()
'DESCRIPTION: Reformats the currently selected source code to look nicer.
' Check that we have a valid source file
If Not CheckActiveDocument() Then
Exit Sub
End If
' Check that there's a valid selection
If ActiveDocument.Selection.Text = "" Then
ShowError("NoSelection")
Exit Sub
End If
' Reformat the current selection
ReformatSelection()
End Sub
' Verify there's an active document and that it's valid
Function CheckActiveDocument()
CheckActiveDocument = False
' Check that there's a file to reformat
If ActiveDocument Is Nothing Then
ShowError("NoFile")
Exit Function
End If
' Check that it's at least a text file
If ActiveDocument.Type <> "Text" Then
ShowError("InvalidFile")
Exit Function
End If
CheckActiveDocument = True
End Function
' Show one of the predefined errors in a message box.
Sub ShowError(ByVal strType)
Dim strMessage
Select Case strType
Case "NoFile"
strMessage = "Please open a C/C++ source file " & _
"and run this macro again."
Case "InvalidFile"
strMessage = "Please activate a window containing " & _
"C/C++ source code and run this macro again."
Case "NoSelection"
strMessage = "Please select the source code you want to " & _
"reformat and run this macro again."
Case "OutOfMemory"
strMessage = "This macro is not working properly because " & _
"Visual C++ has apparently run out of memory." & _
vbLf & vbLf & "Unfortunately this is a bug in " & _
"Visual C++. It typically manifests itself " & _
"whenever the macro is run multiple times on very " & _
"large files, inside the same Visual C++ session. " & _
"The only way around it is to open a new Visual " & _
"C++ session for each large file you want to " & _
"reformat." & vbLf & vbLf & "Press OK to go back " & _
"to the original file. You should then exit Visual C++."
Case Else
strMessage = "Unknown Error of type: " & strType
End Select
MsgBox(strMessage, vbExclamation)
End Sub
' Reformat the currently selected source code (if any)
Function ReformatSelection()
' Check if there's something selected
If ActiveDocument.Selection.Text = "" Then
Exit Function
End If
' Copy the selection to the clipboard
ActiveDocument.Selection.Copy()
' Open a new document and change its language to C/C++
' This is required for SmartIndent to work.
DTE.Documents.Add("Text")
ActiveDocument.Language = "C/C++"
' Paste the selection into the new document
ActiveDocument.Selection.Paste()
' Reformat it!
If Not ReformatActiveDocument() Then
ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo)
Exit Function
End If
' Select the resulting code and copy it to the clipboard
ActiveDocument.Selection.SelectAll()
ActiveDocument.Selection.Copy()
' Close the new document (without saving it)
ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo)
' Paste the reformatted code back over the original selection
ActiveDocument.Selection.Paste()
End Function
' Reformat the source code in the currently active file (document)
Function ReformatActiveDocument()
ReformatActiveDocument = False
' Add spaces in a few places and get rid of it in others
Replace(":b+;", ";")
Replace(":b+\:\::b+", "::")
Replace(":b+\(", "(")
Replace(" =\(", " = (")
Replace("if\(", "if (")
Replace("for\(", "for (")
Replace("while\(", "while (")
Replace("switch\(", "switch (")
Replace("catch\(", "catch (")
Replace("return\(", "return (")
Replace("\(:b+", "(")
Replace(":b+\)", ")")
'Replace(";\)", "; )")
Replace(";;:b+\)", ";;)")
Replace("\[:b+", "[")
Replace(":b+\]", "]")
Replace(":b+\[", "[")
Replace(":b+->", "->")
Replace("->:b+", "->")
Replace("\|\(", "| (")
Replace("&\(", "& (")
Replace("\+\(", "+ (")
Replace("\-\(", "- (")
Replace("\*\(", "* (")
Replace("/\(", "/ (")
' Make sure these statements don't end on the same line they started.
BreakSingleLiners("if (")
BreakSingleLiners("for (")
BreakSingleLiners("switch (")
' Break up any lines containing multiple statements
BreakLinesWithMultipleStatements()
' Make sure braces are on lines by themselves (unless followed by comments)
IsolateOnLeft("\{")
IsolateOnRight("\{")
IsolateOnRight("\}")
IsolateOnLeft("\}")
' Break up simple else statements on the same line (except "else if")
Replace("else:b+if \(", "elseif(")
IsolateOnRight("else:b+")
Replace("elseif\(", "else if (")
' Break up case statements appearing on single lines
IsolateOnRight("case .+\::b+")
IsolateOnRight("default\::b+")
IsolateOnLeft("break;")
' Add a space between these operators
FixOperator("=", 1)
FixOperator("==", 2)
FixOperator("!=", 2)
FixOperator("\+=", 2)
FixOperator("-=", 2)
FixOperator("\*=", 2)
FixOperator("/=", 2)
FixOperator("\+", 1)
FixOperator("-", 1)
FixOperator("<=", 2)
FixOperator(">=", 2)
FixOperator("<<", 2)
FixOperator(">>", 2)
FixOperator("&&", 2)
FixOperator("\|\|", 2)
FixOperator("\|", 1)
FixOperator("\?", 1)
FixLessThanAndGreaterThanOperators()
FixExponents()
' Append a space after these
AppendSpace(",")
AppendSpace(";")
' Make sure the first C++ comment of every line has a space after it.
InsertSpaceAfterFirstInLineComment()
' Replace all the trailing whitespace (thanks to Paul Bludov)
ActiveDocument.Selection.ReplaceText(":b+{$}", "\1", vsFindOptions.vsFindOptionsRegularExpression)
' Run Smart Indent on function blocks only
SmartIndentFunctionBlocks()
' Remove any lines that are considered extraneous (ie. extra blank lines)
If Not RemoveExtraneousLines() Then
Exit Function
End If
' Indent every "case" inside switch statements (thanks to Jim Cooper)
IndentSwitchBody()
' Return OK
ReformatActiveDocument = True
End Function
' Is the cursor currently within a quoted string (or character)
Function IsWithinQuotes()
Dim nCurrentLine, nCurrentColumn, iPos, strBuffer, nCount
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.Cancel()
ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText, True)
nCount = 0
iPos = 0
strBuffer = ActiveDocument.Selection.Text
' Count all occurrences of a double quote which apply to quoted strings
Do While True
iPos = InStr(iPos + 1, strBuffer, """", vbTextCompare)
If Not (iPos > 0) Then
Exit Do
End If
If iPos = 1 Then ' if it's the first character, then it's valid
nCount = nCount + 1
Else
' Make sure it's not preceded by a \ or a \\
If Mid(strBuffer, iPos - 1, 1) <> "\" Then
nCount = nCount + 1
ElseIf (iPos > 2) And (Mid(strBuffer, iPos - 2, 1) = "\") Then
nCount = nCount + 1
End If
End If
Loop
' If number of quotes is odd, we must be inside a quoted string!
IsWithinQuotes = ((nCount > 0) And ((nCount Mod 2) <> 0))
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
' If we're not inside a quoted string, check for a quoted character
If Not IsWithinQuotes Then
ActiveDocument.Selection.CharLeft(True)
' If we find a quoted character left of us, check for one on the right
If ActiveDocument.Selection.Text = "'" Then
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharRight(True)
If ActiveDocument.Selection.Text = "\" Then
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharRight(True)
End If
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharRight(True)
If ActiveDocument.Selection.Text = "'" Then
IsWithinQuotes = True
End If
End If
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
End If
' If we're inside quotes, proceed from the next character
If IsWithinQuotes Then
ActiveDocument.Selection.CharRight()
End If
End Function
' Is current selection preceded by a C++ comment? ("//")
Function IsWithinComment()
Dim nCurrentLine, nCurrentColumn
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.Cancel()
ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText, True)
IsWithinComment = False
If (InStr(1, ActiveDocument.Selection.Text, "//", vbTextCompare) > 0) Then
IsWithinComment = True ' since it's commented out
nCurrentLine = nCurrentLine + 1 ' we proceed from the next line
End If
ActiveDocument.Selection.MoveTo(nCurrentLine, 1)
End Function
' Is the cursor on a line with a preprocessor macro? ("#define ")
Function IsPreprocessorMacro()
Dim nCurrentLine, nCurrentColumn
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
IsPreprocessorMacro = False
ActiveDocument.Selection.EndOfLine(True)
If (Mid(LTrimTabs(ActiveDocument.Selection.Text), 1, 8) = "#define ") Or _
(Right(ActiveDocument.Selection.Text, 1) = "\") Then
IsPreprocessorMacro = True ' since it's in a macro
nCurrentLine = nCurrentLine + 1 ' we proceed from the next line
End If
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
End Function
' Should the current selection be ignored?
' (ie., is it within a comment, between quotes, or inside a macro?)
Function ShouldIgnore()
ShouldIgnore = False
If IsWithinQuotes() Then
ShouldIgnore = True
Exit Function
End If
If IsWithinComment() Then
ShouldIgnore = True
Exit Function
End If
If IsPreprocessorMacro() Then
ShouldIgnore = True
End If
End Function
' Put the cursor at the top of the document and return "" to be passed
' initially to GetCurrenPosition
Function InitializePosition()
ActiveDocument.Selection.StartOfDocument()
InitializePosition = ""
End Function
' Retrieve the current position and return true if it's greater than the
' last one. This is used to ensure that the file is only searched once
' (provided the search is started from the top)
Function GetCurrentPosition(ByRef strPos)
Dim nLastLine, nLastColumn, nCurrentLine, nCurrentColumn, iPos, ch
nLastLine = -1
nLastColumn = -1
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
' Parse the last position and extract the line and column
For iPos = 1 To Len(strPos)
ch = Mid(strPos, iPos, 1)
If ch = "," Then
nLastLine = CInt(Mid(strPos, 1, iPos - 1))
nLastColumn = CInt(Mid(strPos, iPos + 1))
Exit For
End If
Next
' Return true if we're currently past the last position
strPos = nCurrentLine & "," & nCurrentColumn
GetCurrentPosition = (nCurrentLine > nLastLine) Or _
((nLastLine = nCurrentLine) And (nCurrentColumn > nLastColumn))
End Function
' Move by a certain number of columns
Sub MoveByColumns(ByVal nBy)
ActiveDocument.Selection.MoveTo(ActiveDocument.Selection.CurrentLine, _
ActiveDocument.Selection.CurrentColumn + nBy)
End Sub
' Replace the given strFrom with strTo case sensitively
Sub Replace(ByVal strFrom, ByVal strTo)
Dim strLastPos, bContinue
strLastPos = InitializePosition()
Do While ActiveDocument.Selection.FindText(strFrom, _
vsFindOptions.vsFindOptionsMatchCase + vsFindOptions.vsFindOptionsRegularExpression)
bContinue = GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at
' the beginning of the line
ActiveDocument.Selection.FindText(strFrom, _
vsFindOptions.vsFindOptionsMatchCase + vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.Text = strTo
ElseIf Not bContinue Then
Exit Do
End If
Loop
End Sub
' Break the given str ending in (, so that instead of this:
' if (a) return b;
' it looks like this:
' if (a)
' return b;
Sub BreakSingleLiners(ByVal str)
Dim strLastPos, strFound, nCol, bBreak, strAfterFound
' Verify str ends in (, the beginning parenthesis
If Right(str, 1) <> "(" Then
Exit Sub
End If
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText(str, vsFindOptions.vsFindOptionsMatchCase) And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText(str, vsFindOptions.vsFindOptionsMatchCase)
' Find the matching brace and go to the end of the line
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharLeft()
ExecuteCommand("Edit.GotoBrace")
ActiveDocument.Selection.CharRight()
nCol = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.EndOfLine(True)
strFound = LTrimTabs(ActiveDocument.Selection.Text)
' If there's anything after the brace that isn't a comment, move
' it to the next line
If (Len(strFound) > 0) And (Left(strFound, 1) <> "/") Then
bBreak = False
' Check if there's a "{" after the statement which should
' also be broken into multiple lines
If (Mid(strFound, 1, 1) = "{") And (Len(strFound) > 1) Then
strAfterFound = LTrimTabs(Mid(strFound, 2))
If strAfterFound <> "" Then
ActiveDocument.Selection.Text = "{" + strAfterFound
ActiveDocument.Selection.MoveTo( _
ActiveDocument.Selection.CurrentLine, nCol)
ActiveDocument.Selection.NewLine()
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.NewLine()
bBreak = True ' primitive but it works
End If
End If
If Not bBreak Then
ActiveDocument.Selection.Text = strFound
ActiveDocument.Selection.MoveTo( _
ActiveDocument.Selection.CurrentLine, nCol)
ActiveDocument.Selection.NewLine()
End If
End If
End If
End While
End Sub
' Trim blanks AND tabs from the left side
Function LTrimTabs(ByVal str)
Dim iPos, ch
For iPos = 1 To Len(str)
ch = Mid(str, iPos, 1)
If ch <> " " And ch <> vbTab Then
Exit For
End If
Next
LTrimTabs = Mid(str, iPos)
End Function
' Isolate the given str on a new line with nothing left of it
Sub IsolateOnLeft(ByVal str)
Dim strLastPos, nLen, bContinue, nCurrentLine, nCurrentColumn
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText("^.*" & str, vsFindOptions.vsFindOptionsRegularExpression + _
vsFindOptions.vsFindOptionsMatchCase) And GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("^.*" & str, _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
' Get the length of the found string
' (which may have been a regular expression)
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.FindText(str, _
vsFindOptions.vsFindOptionsBackwards + vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
nLen = Len(ActiveDocument.Selection.Text)
ActiveDocument.Selection.CharLeft()
If Not ShouldIgnore() Then
' Now that we have the length, we need to redo
' the search and go on
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.FindText("^.*" & str, _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
bContinue = False
' If we're isolating a brace, make sure its matching brace
' isn't on the same line
If (str = "{") Or (str = "}") Then
ActiveDocument.Selection.CharRight()
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.CharLeft()
ExecuteCommand("Edit.GotoBrace")
If ActiveDocument.Selection.CurrentLine = nCurrentLine Then
ActiveDocument.Selection.MoveTo( _
nCurrentLine, nCurrentColumn)
bContinue = True ' we found it so move to the next match
Else
ActiveDocument.Selection.MoveTo(nCurrentLine, 1)
ActiveDocument.Selection.FindText("^.*" & str, _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
End If
End If
If LTrimTabs(ActiveDocument.Selection.Text) <> str And _
Not bContinue Then
ActiveDocument.Selection.CharRight()
MoveByColumns(-nLen)
ActiveDocument.Selection.NewLine()
MoveByColumns(nLen)
End If
GetCurrentPosition(strLastPos)
End If
End If
End While
End Sub
' Isolate the given str so that everything after it is placed on the next line
Sub IsolateOnRight(ByVal str)
Dim strLastPos, strRight, nCurrentLine, nCurrentColumn, nLen
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText(str & ".+$", _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase) And GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
ActiveDocument.Selection.CharLeft()
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText(str & ".+$", _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
' Get the length of the found string
' (which may have been a regular expression)
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.FindText(str, vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
nLen = Len(ActiveDocument.Selection.Text)
' Now that we have the length, we need to redo the search and go on
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.FindText(str & ".+$", _
vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
strRight = LTrimTabs(Mid(ActiveDocument.Selection.Text, nLen + 1))
' Handle braces a bit differently
If (str = "{") Or (str = "}") Then
' If it's a closing brace, and the code after it contains
' a semicolon, leave it alone (ie. variable definition).
If (str = "}") Then
ActiveDocument.Selection.EndOfLine(True)
If (InStr(1, ActiveDocument.Selection.Text, ";", vbTextCompare) _
> 0) Then
strRight = "" ' we found it so move on to the next match
End If
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.CharRight()
End If
' If we're isolating a brace make sure the matching brace
' isn't on the same line
If (strRight <> "") Then
ActiveDocument.Selection.CharLeft()
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
ExecuteCommand("Edit.GotoBrace")
If ActiveDocument.Selection.CurrentLine = nCurrentLine Then
ActiveDocument.Selection.MoveTo( _
nCurrentLine, nCurrentColumn + 1)
strRight = "" ' we found it so move on to the next match
Else
ActiveDocument.Selection.MoveTo( _
nCurrentLine, nCurrentColumn)
ActiveDocument.Selection.FindText( _
str & ".+$", vsFindOptions.vsFindOptionsRegularExpression + vsFindOptions.vsFindOptionsMatchCase)
End If
End If
End If
If (strRight <> "") And _
(Left(strRight, 1) <> "/") And _
(strRight <> ",") And _
(strRight <> ";") And _
(strRight <> "\") Then
ActiveDocument.Selection.CharLeft()
MoveByColumns(nLen)
ActiveDocument.Selection.NewLine()
End If
End If
End While
End Sub
' Place the given strOperator (of nLen REAL characters)
' between spaces (if needed)
Sub FixOperator(ByVal strOperator, ByVal nLen)
Dim strLastPos, strFind
strLastPos = InitializePosition()
' Add one space between the operator
While ActiveDocument.Selection.FindText("[A-Z,a-z,0-9,\),_,\]]" & _
strOperator & "[A-Z,a-z,0-9,\(,_,\*,"",',&]", vsFindOptions.vsFindOptionsRegularExpression) And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
ActiveDocument.Selection.CharLeft()
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("[A-Z,a-z,0-9,\),_,\]]" & _
strOperator & "[A-Z,a-z,0-9,\(,_,\*,"",',&]", vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.Text = " "
MoveByColumns(nLen)
ActiveDocument.Selection.Text = " "
End If
End While
strLastPos = InitializePosition()
' Fix any C++ "operator" member functions which were broken above
While ActiveDocument.Selection.FindText("operator " & strOperator & " ", _
vsFindOptions.vsFindOptionsRegularExpression) And GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("operator " & strOperator & " ", _
vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.Backspace()
MoveByColumns(-nLen)
ActiveDocument.Selection.Backspace()
End If
End While
End Sub
' Fix "<" and ">" operators found inside for, while, and if statements.
Function FixLessThanAndGreaterThanOperators()
' Fix "for" loops
FixLessThanOrGreaterThanOperator("^:b*for \(.*;.*[A-Z,a-z,0-9,), ]+\<[^<=]")
FixLessThanOrGreaterThanOperator("^:b*for \(.*;.*[A-Z,a-z,0-9,), ]+\>[^>=]")
' Fix "while" loops
FixLessThanOrGreaterThanOperator("^:b*while \(.*[A-Z,a-z,0-9,), ]+\<[^<=]")
FixLessThanOrGreaterThanOperator("^:b*while \(.*[A-Z,a-z,0-9,), ]+\>[^>=]")
' Fix "if" statements
FixLessThanOrGreaterThanOperator("^:b*if \(.*[A-Z,a-z,0-9,), ]+\<[^<=]")
FixLessThanOrGreaterThanOperator("^:b*if \(.*[A-Z,a-z,0-9,), ]+\>[^>=]")
End Function
' Fix "<" or ">" operator based on the given search condition.
' It assumes the condition will yield one or more characters before
' the operator and only one character after it.
Function FixLessThanOrGreaterThanOperator(ByVal strSearch)
Dim strLastPos, strFound
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText(strSearch, vsFindOptions.vsFindOptionsRegularExpression + _
vsFindOptions.vsFindOptionsMatchCase) And GetCurrentPosition(strLastPos)
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharLeft()
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the search since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText(strSearch, vsFindOptions.vsFindOptionsRegularExpression + _
vsFindOptions.vsFindOptionsMatchCase)
strFound = ActiveDocument.Selection.Text
' Add a space before it (if needed)
If Mid(strFound, Len(strFound) - 2, 1) <> " " Then
strFound = Left(strFound, Len(strFound) - 2) & " " & _
Right(strFound, 2)
End If
' Add a space after it (if needed)
If Right(strFound, 1) <> " " Then
strFound = Left(strFound, Len(strFound) - 1) & " " & _
Right(strFound, 1)
End If
ActiveDocument.Selection.Text = strFound
End If
End While
End Function
' Append a space after the given strOperator (if it needs it)
Sub AppendSpace(ByVal strOperator)
Dim strLastPos, nCurrentLine, nCurrentColumn
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText(strOperator & _
"[A-Z,a-z,0-9,\(,\-,_,\*,"",',&]", vsFindOptions.vsFindOptionsRegularExpression) And _
GetCurrentPosition(strLastPos)
ActiveDocument.Selection.CharLeft()
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
ActiveDocument.Selection.FindText(strOperator & _
"[A-Z,a-z,0-9,\(,\-,_,\*,"",',&]", vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.CharLeft()
MoveByColumns(Len(strOperator))
ActiveDocument.Selection.Text = " "
End If
End While
End Sub
' Run the SmartIndent command (Alt+F8) on function blocks only.
Function SmartIndentFunctionBlocks()
Dim strLastPos, nColumn, cBeforeBrace
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText("{") And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("{")
' Go to matching brace and reformat tabs
DTE.ExecuteCommand("Edit.GotoBraceExtend")
nColumn = ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.SmartFormat()
ActiveDocument.Selection.CharRight()
If ActiveDocument.Selection.CurrentColumn > nColumn Then
' If SmartFormat indents the block (by mistake), unindent it
ActiveDocument.Selection.CharLeft()
DTE.ExecuteCommand("Edit.GotoBraceExtend")
ActiveDocument.Selection.Unindent()
End If
End If
End While
End Function
' Since Microsoft's "SmartFormat" is not smart enough to indent case
' statements inside the switch body, we'll do it here.
' (Thanks to Jim Cooper)
Function IndentSwitchBody()
Dim nSwitchLine, nFirstLine, nLastLine, strLastPos, iLine
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText("switch", _
vsFindOptions.vsFindOptionsMatchWholeWord + vsFindOptions.vsFindOptionsMatchCase) And GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
nSwitchLine = ActiveDocument.Selection.CurrentLine
' Now find the opening brace and make sure it's on the next line
If ActiveDocument.Selection.FindText("{") And _
Not ShouldIgnore() And _
(ActiveDocument.Selection.CurrentLine = nSwitchLine + 1) Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("{")
' Find next line in file, since earlier code put '{' on
' a line by itself
nFirstLine = ActiveDocument.Selection.CurrentLine + 1
' Go to matching brace and reformat tabs
ExecuteCommand("Edit.GotoBrace")
' Find previous line in file, since earlier code put '}' on
' line by itself
nLastLine = ActiveDocument.Selection.CurrentLine
' Move to the line after the opening brace
ActiveDocument.Selection.GoToLine(nFirstLine, 1)
' Select everything between the braces and indent it
For iLine = nFirstLine To nLastLine - 1
ActiveDocument.Selection.LineDown(True)
Next
ActiveDocument.Selection.Indent()
End If
End If
End While
End Function
' Remove any lines that are considered extraneous (usually blank ones).
Function RemoveExtraneousLines()
Dim strLastPos, nCurrentLine, nCurrentColumn, nLastLine, bContinue
strLastPos = InitializePosition()
RemoveExtraneousLines = True
' Remove any blank lines that fall below any open braces ("{")
While ActiveDocument.Selection.FindText("{") And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("{")
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
' Go to matching brace
ExecuteCommand("Edit.GotoBrace")
' Check if it's on the same line
bContinue = (nCurrentLine <> ActiveDocument.Selection.CurrentLine)
ExecuteCommand("Edit.GotoBrace")
' If the matching brace is on the same line, proceed to the next brace
If bContinue Then
ActiveDocument.Selection.LineDown()
' Cut any blank lines below the {
Do While True
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.EndOfLine(True)
If LTrimTabs(ActiveDocument.Selection.Text) <> "" Then
Exit Do
End If
' Get the last line of the document
ActiveDocument.Selection.EndOfDocument()
nLastLine = ActiveDocument.Selection.CurrentLine
' Remove the extra line
ActiveDocument.Selection.MoveTo(nCurrentLine + 1, 1)
ExecuteCommand("LineCut")
' Make sure we haven't hit the bottom of the file and that LineCut worked
ActiveDocument.Selection.EndOfDocument()
If ActiveDocument.Selection.CurrentLine = nLastLine Then
Exit Do
End If
ActiveDocument.Selection.MoveTo(nCurrentLine + 1, 1)
Loop
End If
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
End If
End While
strLastPos = InitializePosition()
' Remove any blank lines right above any closing braces ("}")
While ActiveDocument.Selection.FindText("}") And _
GetCurrentPosition(strLastPos)
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("}")
ActiveDocument.Selection.CharLeft()
' Cut blank lines above the }
Do While True
ActiveDocument.Selection.LineUp()
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.EndOfLine(True)
nCurrentLine = ActiveDocument.Selection.CurrentLine
If LTrimTabs(ActiveDocument.Selection.Text) <> "" Then
If ActiveDocument.Selection.CurrentLine > 1 Then
ActiveDocument.Selection.LineDown()
End If
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.FindText("}")
strLastPos = ActiveDocument.Selection.CurrentLine & "," & _
ActiveDocument.Selection.CurrentColumn
ActiveDocument.Selection.LineDown()
ActiveDocument.Selection.StartOfLine()
Exit Do
End If
' Get the last line of the document
ActiveDocument.Selection.EndOfDocument()
nLastLine = ActiveDocument.Selection.CurrentLine
' Remove the extra line
ActiveDocument.Selection.MoveTo(nCurrentLine, 1)
ExecuteCommand("LineCut")
' Make sure LineCut worked -- if not something's really messed up
ActiveDocument.Selection.EndOfDocument()
If ActiveDocument.Selection.CurrentLine = nLastLine Then
ShowError("OutOfMemory")
RemoveExtraneousLines = False
Exit Function
End If
ActiveDocument.Selection.MoveTo(nCurrentLine, 1)
Loop
End If
End While
End Function
' Remove all spaces and tabs found in the current selection
Function RemoveSpacesInSelection()
Dim iPos, ch, strNoSpaces
For iPos = 1 To Len(ActiveDocument.Selection.Text)
ch = Mid(ActiveDocument.Selection.Text, iPos, 1)
If ch <> " " And ch <> vbTab Then
strNoSpaces = strNoSpaces + ch
End If
Next
ActiveDocument.Selection.Text = strNoSpaces
End Function
' Fix any code with exponential notation (ie. 3.4e-2) which was
' broken when the + and - operators were fixed above (by FixOperator).
Function FixExponents()
While ActiveDocument.Selection.FindText("[0-9,\.]e [\+\!\-] [0-9]", _
vsFindOptions.vsFindOptionsRegularExpression)
RemoveSpacesInSelection()
End While
End Function
' Break any lines containing multiple statements (separated by semicolons)
Function BreakLinesWithMultipleStatements()
Dim strLastPos, nCurrentLine, nCurrentColumn
strLastPos = InitializePosition()
' Search for multiple semicolons on the same line
Do While ActiveDocument.Selection.FindText(";.+;", vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.CharLeft()
If Not GetCurrentPosition(strLastPos) Then
Exit Do
End If
nCurrentLine = ActiveDocument.Selection.CurrentLine
nCurrentColumn = ActiveDocument.Selection.CurrentColumn
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.MoveTo(nCurrentLine, nCurrentColumn)
ActiveDocument.Selection.FindText(";.+;", vsFindOptions.vsFindOptionsRegularExpression)
nCurrentLine = ActiveDocument.Selection.CurrentLine
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText, True)
' If found, check that the semicolons don't belong to a for loop
If (InStr(1, ActiveDocument.Selection.Text, "for (", _
vbTextCompare) > 0) Then
ActiveDocument.Selection.MoveTo(nCurrentLine + 1, 1)
Else
If ActiveDocument.Selection.Text <> "" Then
ActiveDocument.Selection.CharRight()
End If
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.NewLine()
End If
End If
Loop
End Function
' Make sure the first C++ comment of every line has a space after it.
Function InsertSpaceAfterFirstInLineComment()
Dim strLastPos, nCurrentLine
strLastPos = InitializePosition()
While ActiveDocument.Selection.FindText("//[A-Z,a-z,0-9]", vsFindOptions.vsFindOptionsRegularExpression) _
And GetCurrentPosition(strLastPos)
ActiveDocument.Selection.CharLeft()
' Check if we're inside a comment or between quotes
If Not ShouldIgnore() Then
' Repeat the action since ShouldIgnore puts the cursor at the
' beginning of the line
ActiveDocument.Selection.FindText("//[A-Z,a-z,0-9]", vsFindOptions.vsFindOptionsRegularExpression)
ActiveDocument.Selection.CharRight()
ActiveDocument.Selection.CharLeft()
ActiveDocument.Selection.Text = " "
End If
End While
End Function
' Display a message box if bDebug is true
Sub DebugBox(ByVal strMessage)
Dim bDebug
bDebug = False
If bDebug Then
MsgBox(strMessage)
End If
End Sub
End Module
|
|
|
|
|
I got the error:
(11): Namespace or type 'VCProjectEngine' for the Imports 'Microsoft.VisualStudio.VCProjectEngine' cannot be found.
I removed that, but discovered rather than make the code nicer, it messed it up.
|
|
|
|
|
Now that I upgraded to .net I think its wonderful - but... this is one macro that I really miss - I have to load up a VC6 just to run the macro. Anybody have a port or a converter to convert vc6 macros to vc.net? big booboo on m$ part.
|
|
|
|
|
I think a reference to "VCProjectEngine.dll" has to be added to the macro project in Visual Studio .NET 2003.
|
|
|
|
|