Author |
Topic |
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Mar 25 2004 : 10:11:38 AM
|
I'm 99% sure this has nothing to do with VAX, and 99.9% sure that it's because I've done something stupid, but I'm wondering if anyone else is seeing this.
I had a macro I wrote for VC6 that reformats comments. Nothing fancy or complicated: it just makes each line as long as it can be, up to 80 chars. Pretty simple, and in VC6, it runs virtually instantaneously.
So, I "ported" it to the wonderfully overblown VS.NET macro editor, and, once I finally corrected all the trivial syntax mutations, it runs very slowly. How slowly? It's so slow, I could do it faster by hand. It's so slow, it looks like what they show in bad movies - you know, the cursor moves... one... character... at... a... time...
I checked UseNet, and didn't see any howling about this, which makes me think (a) I've done something stupid that's causing the slowness, (b) we have collectively decided that the .NET IDE is beyond hope, and stopped posting complaints, or (c) it has something to do with VAX (even when disabled).
Before I uninstall VAX to test further, I just wanted to check if anyone else has seen this. TIA.
|
|
SvenC
Tomato Guru
Germany
339 Posts |
Posted - Mar 25 2004 : 10:14:22 AM
|
If you paste you macro into this thread I will give it a try... |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Mar 25 2004 : 10:22:32 AM
|
Thanks! (Be warned, I am a lousy macro writer...)
Option Strict Off
Option Explicit Off
Imports EnvDTE
Imports System.Diagnostics
Public Module MyModule
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'DESCRIPTION: Splits C++ style comments over several lines.
Sub ResplitComments()
' The line the user placed us on must start with a comment.
If ResplitComments_IsComment() = True Then
' Scroll up until we come to a non-comment line (or we hit top of file).
Do
If ActiveDocument.Selection.CurrentLine > 1 Then
ActiveDocument.Selection.LineUp()
If ResplitComments_IsComment() = False Then
Exit Do
End If
Else
Exit Do
End If
Loop
' We're either on (a) the line above the first comment line, or (b) line
' one, which happens to be a comment. Handle either case, and move down
' a line to get to the first comment line.
If ActiveDocument.Selection.CurrentLine > 1 Or ResplitComments_IsComment() = False Then
ActiveDocument.Selection.LineDown()
End If
' At this point, we're at the first comment line, which is indented
' by some whitespace. We need to know exactly what that whitespace is,
' so that we can start each comment line with it, so that the comment
' lines are indented the same.
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.WordRight(True)
sIndenting = ActiveDocument.Selection.Text
' If there isn't any leading whitespace we have to be sure not to put
' the slashes in there! Also, there is a special case for a single
' leading space (weirdness in how 'WordRight' behaves with a single space).
If ActiveDocument.Selection.Text = "// " Then
sIndenting = ""
End If
If ActiveDocument.Selection.Text = " // " Then
sIndenting = " "
End If
' Now we need to know the actual column the slashes start at, so that
' we can tell when we've backed up too far.
ActiveDocument.Selection.StartOfLine()
ActiveDocument.Selection.FindText("//")
nIndenting = ActiveDocument.Selection.CurrentColumn
' At this point, we're on the first comment line. Process each line in
' succession ('DoCurrentLine' returns false only if it fails to split).
nFirstLine = ActiveDocument.Selection.CurrentLine
Do While True = ResplitComments_DoCurrentLine(sIndenting, nIndenting)
' If this line has more than 80 chars on it, or the next line is a
' comment, then we aren't done yet.
ActiveDocument.Selection.EndOfLine()
If ActiveDocument.Selection.CurrentColumn <= 80 Then
If ResplitComments_IsNextComment() = False Then
Exit Do
End If
End If
Loop
' Done. Scroll up so we can see the whole comment.
nLastLine = ActiveDocument.Selection.CurrentLine
ActiveDocument.Selection.GotoLine(nFirstLine)
ActiveDocument.Selection.GotoLine(nLastLine)
ActiveDocument.Selection.EndOfLine()
Else
' If the first two non-whitespace chars on this line aren't //, then the user
' has placed us on a invalid line for this macro.
MsgBox("You must place the cursor anywhere inside a set of C++ style comments!")
ActiveDocument.Selection.StartOfLine()
End If
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ResplitComments_DoCurrentLine
Function ResplitComments_DoCurrentLine(ByVal sIndenting, ByVal nIndenting)
ResplitComments_DoCurrentLine = True
' Append the next line to this line (deleting its leading whitespace
' and comments markers, and inserting a space), if it's a comment.
bNextLineIsComment = ResplitComments_IsNextComment()
If bNextLineIsComment Then
ActiveDocument.Selection.EndOfLine()
ActiveDocument.Selection.Delete()
ActiveDocument.Selection.Text = " "
Do
ActiveDocument.Selection.CharRight(True)
If ActiveDocument.Selection.Text = " " Or ActiveDocument.Selection.Text = " " Or ActiveDocument.Selection.Text = "/" Then
ActiveDocument.Selection.Delete()
Else
Exit Do
End If
Loop
End If
' Move to the start of this line and move to the right one char at a time,
' until we go too far - then back up to the first whitespace.
ActiveDocument.Selection.StartOfLine()
Do
' Select the next character on this line, and see that it's not a CR.
ActiveDocument.Selection.CharRight(True)
If 0 < Len(ActiveDocument.Selection.Text) Then
If 13 <> Asc(ActiveDocument.Selection.Text) Then
' Not a CR, so move to the right of it.
ActiveDocument.Selection.CharRight()
If ActiveDocument.Selection.CurrentColumn > 81 Then
' We've gone too far. Back up until we hit the first whitespace.
Do
ActiveDocument.Selection.CharLeft(True)
If ActiveDocument.Selection.Text = " " Or ActiveDocument.Selection.Text = " " Then
'??
'??ActiveDocument.Selection.CharRight()
'??ActiveDocument.Selection.DeleteWhitespace()
'??
ActiveDocument.Selection.Text = Chr(13) + sIndenting + "// "
Exit Function
Else
' Be sure we haven't backed up as far as we can go
' and *still* can't find any whitespace - we'll just
' give up.
If nIndenting + 1 = ActiveDocument.Selection.CurrentColumn Then
MsgBox("No whitespace to break this line on - aborting!")
ActiveDocument.Selection.StartOfLine()
ResplitComments_DoCurrentLine = False
Exit Function
Else
ActiveDocument.Selection.CharLeft()
End If
End If
Loop
End If
Else
Exit Do
End If
Else
Exit Do
End If
Loop
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Does the current line start with a C++ style comment?
Function ResplitComments_IsComment()
ResplitComments_IsComment = False
' Go to start of line and move right until you run out of whitespace.
ActiveDocument.Selection.StartOfLine()
Do
ActiveDocument.Selection.CharRight(True)
If ActiveDocument.Selection.Text <> " " And ActiveDocument.Selection.Text <> " " Then
Exit Do
End If
ActiveDocument.Selection.CharRight()
Loop
' Of course, if you hit a CR, or you're on an empty line, you're done
' looking - don't go to the next line.
If 0 < Len(ActiveDocument.Selection.Text) Then
If 13 <> Asc(ActiveDocument.Selection.Text) Then
' Check that the first two non-whitespace chars on this line are //.
ActiveDocument.Selection.CharRight(True)
If ActiveDocument.Selection.Text = "//" Then
ResplitComments_IsComment = True
End If
Else
ActiveDocument.Selection.CharLeft()
End If
Else
ActiveDocument.Selection.CharLeft()
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Is the *next* line (if there is one) a comment?
Function ResplitComments_IsNextComment()
ResplitComments_IsNextComment = False
' See if we're already on the last line in the file.
nCurrentLine = ActiveDocument.Selection.CurrentLine
ActiveDocument.Selection.LineDown()
nNextLine = ActiveDocument.Selection.CurrentLine
' If there is a next line, is it a comment?
'MsgBox("nCurrentLine: " + CStr(nCurrentLine) + " - nNextLine: "+ CStr(nNextLine))
If nCurrentLine <> nNextLine Then
ResplitComments_IsNextComment = ResplitComments_IsComment()
ActiveDocument.Selection.LineUp()
End If
End Function
End Module
|
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 26 2004 : 09:32:28 AM
|
VAX 1221 definetly has something to do with this. using VS .NET 2003 i am converting some C code from UNIX to C++ for windows, and i was considering the code:
int nType = 0; // is there data for this column?
int nSampleOrigin = 0; // is there data for this column?
int nProcedure = 0; // is there data for this column?
int nAmount = 0; // is there data for this column?
int nCollected = 0; // is there data for this column?
int nReceived = 0; // is there data for this column?
int nSiteCode = 0; // is there data for this column?
int nLabCode = 0; // is there data for this column?
for each line i wanted to change the type from int to bool, the first letter of the variable names from 'n' to 'b' and the initial value from 0 to false.
so i told VS to record a temporary macro, to simply hold and then play back the set sequence of key presses that will do this, and then move me onto the next line.
VS was very slow to record this macro, although that may simply be my machine. when i can to run this macro (with VAX enabled) it was very slow! i expected this macro to run in a fraction of a second, since the equiventent macro in VIM 6 would execute almost instantaneously.
instead i was able to sit here watching the cursor move around, executing the macro. disabling VAX and then re-running the macro resulted in the macro running a lot faster, at least 50% faster, but still far slower than i would have expected
for reference, i have saved this macro, which produced:
Option Strict Off
Option Explicit Off
Imports EnvDTE
Imports System.Diagnostics
Public Module RecordingModule
Sub convertIntToBool()
DTE.ActiveDocument.Selection.CharRight(True, 3)
DTE.ActiveDocument.Selection.Text = "bl"
DTE.ActiveDocument.Selection.DeleteLeft
DTE.ActiveDocument.Selection.Text = "ool"
DTE.ActiveDocument.Selection.Delete(2)
DTE.ActiveDocument.Selection.Text = " "
DTE.ActiveDocument.Selection.Delete
DTE.ActiveDocument.Selection.Text = "b"
DTE.ActiveDocument.Selection.WordRight(False, 2)
DTE.ActiveDocument.Selection.Delete
DTE.ActiveDocument.Selection.Text = "false"
DTE.ActiveDocument.Selection.StartOfLine(VsStartOfLineOptions.VsStartOfLineOptionsFirstText)
DTE.ActiveDocument.Selection.LineDown
End Sub
End Module
you may notice i hade and corrected a typo while recording this. for some reason most macro's i record contain at least one typo i have to correct
normal editing is fine with VAX enabled, so this speed effect is specific to macros. |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 26 2004 : 09:36:34 AM
|
*grrr* the saved macro didnt work as expected when i played it, so treat it with a degree of caution.
edit: further, the speed problem isnt reproducable here now i have turned VAX back on. i had to re record the macro, but did this with VAX disabled. i will keep an eye out for this, since i use macros a lot in VIM. |
zen is the art of being at one with the two'ness |
Edited by - feline on Mar 26 2004 09:39:10 AM |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Mar 26 2004 : 09:45:24 AM
|
One thing I didn't mention in my original post is that I understand that (for now, anyway), we must disable VAX to record or play macros (see: http://forum.wholetomato.com/forum/topic.asp?TOPIC_ID=1813). The unbearable slowdown I'm talking about happens with VAX disabled... |
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 26 2004 : 11:17:55 AM
|
i have now managed to record and play a temporary macro in VS .NET 2003 WITH VAX enabled.
it is possible that the first set of problems were caused by my workstation giving way under the weight of programs i am running *frustrated* i am not running that much, but VS seems to be very resource hungry. |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 31 2004 : 07:08:07 AM
|
following some more experimenting, recording a temporary macro, and playing it back the *first* time is staggeringly slow. playing the same temporary macro again very quickly seems to run at a much better speed.
Larry, is this as bad if you run the macro twice on two different comments in quick succession? |
zen is the art of being at one with the two'ness |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 31 2004 : 11:13:58 AM
|
what i am currently doing is slowly driving me around the bend, i could do with a change of pace. i presume that a comment made up of a series of short lines will be a valid test case. i will have a go at reproducing this for you.
since i am not yet a VS macro expert, will it be happy with a comment like:
// this is my
// test comment to see how this is
// going to work on this machine, since if it
// happens here as well that is info
also, do i select the comment then run the macro? or just position my cursor in the comment before running it? |
zen is the art of being at one with the two'ness |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Mar 31 2004 : 11:20:26 AM
|
Yes, that's exactly the kind of comment I'm trying to "clean up". Just position your cursor anywhere in the comment before running it. Thanks!
|
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Mar 31 2004 : 11:55:08 AM
|
*puzzled expression*
running VS .NET 2003, i have opened the Macro Explorer, and under MyMacros i have created a new thing called "commentCompress". under this thing i have created a macro, which is now called "ResplitComments".
then i went into edit ResplitComments, and i pasted the entire macro from this tread. when i right click on ResplitComments and select run, with my cursor in the middle of the comment from this thread, nothing happens.
i suspect i havent plugged this macro into VS correctly. but if so, then what did i do wrong?
at the bottom of this macro i have edited it to say:
Public Module commentCompress
Sub ResplitComments()
End Sub
End Module
however this doesnt seem to be working |
zen is the art of being at one with the two'ness |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Mar 31 2004 : 12:00:57 PM
|
Yeah, I remember flailing around with names of modules and things to get it to work. Wish I could remember exactly what I did. All I remember is that the way things are named does *not* work the way you would think it does... shocking, I know. Maybe a reboot is in order...
The .NET IDE sucks so hard, I think WT should consider just creating a new IDE from scratch. The worst anyone could do would be to come up with something half-assed thats full of bugs and almost unusable, and that's what we have now, so at least we wouldn't be any worse off. I'm sure WT could do much better...
|
|
|
feline
Whole Tomato Software
United Kingdom
19017 Posts |
Posted - Apr 01 2004 : 04:59:46 AM
|
initially i dont know how to get VS to recognise and run this macro
still, i am a serious macro user in VIM, so it is only a matter of time until i teach myself how macro's work in VS. given how much like VB they look this might be quite a long time, but it is bound to happen. i will have another go at reproducing this when i have worked out how to run the macro.
as for the IDE, you are so right! |
zen is the art of being at one with the two'ness |
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Apr 01 2004 : 6:55:58 PM
|
Build 1225 increases speed of recording and playback of macros when VA X is loaded. |
Whole Tomato Software, Inc. |
Edited by - support on Apr 05 2004 10:51:28 PM |
|
|
|
Topic |
|