I am not an expert on any of the free/open/*nix compatible IDEs, but I can list a few things that Visual Studio does which I would be curious to know how other solutions compare. Please note all of the things below happen without compiling any code (despite the fact some of them require deep understanding of the code). A lot probably require Visual Assist which is something that just about everyone I know in the games industry uses if they use Visual Studio every day. I must admit, I would be surprised if any free solution offers anything like all the stuff below, but I would be surprised in a good way. The list below isn't at all exhaustive, I just put down the first dozen things that I noted from looking at a single source file and considering the sorts of operations I do on a day to day basis.
1. Decent auto-complete. By decent I mean if I start typing a variable, firstly it intelligently offers a list potential variables. This intelligent list doesn't just display words from the current document/project, it is actually aware of the scope at which I am typing, so if inside a member function of a class, it will know the class member variables are available, also globals and so on. Once I have typed the variable in, if it is an instance of a class struct, when I type the dot operator (as in '.') if the variable is actually a pointer, it'll auto-correct this to -> and it will then display an accurate list of functions/variables exposed by the instance in question. Upon selecting something from this list, say a function name, it'll then copy this suggestion into the text editor and bring up a tip box which shows me exactly what parameters the function takes, on top of this it'll suggest parameters I may want to pass into the function. I have an editor open right now, and for a test typed:
m_B <- this was enough for it to suggest m_BoundsCalculator
m_BoundsCalculator.S <- this was enough for it to suggest SetRoamBox
m_BoundsCalculator.SetRoamBox( <- after filling this in, it gave me the prototype:
- void SetRoamBox( const Vector2 & roamBoxMin, const Vector2 & roamBoxMax )
it also suggested that the first parameter I want to use is m_RoamAreaMin which is correct
m_BoundsCalculator.SetRoamBox( m_RoamAreaMin, <- it then suggested the second paramter may want to be m_RoamAreaMax which is correct
m_BoundsCalculator.SetRoamBox( m_RoamAreaMin, m_RoamAreaMax );
So I typed something like: m_B <enter> S <enter> <enter> <enter> and it correctly worked out I wanted:
m_BoundsCalculator.SetRoamBox( m_RoamAreaMin, m_RoamAreaMax );
This is nothing to do with being lazy, it is about getting things done fast and accurately. Knowing exactly what parameters a function takes, seeing which variables are available at the current scope, it means being able to just 'code' without flipping between various files/headers looking up parameters etc. This becomes even more valuable when working with code that isn't yours (multiple submitters, third party SDKs, etc.)
You can also note that as soon as I declare a new variable, 'int testing;' immediately Visual Studio is then 'aware' of this variable.
2. Enum values, I can just click on an enum (anywhere in code) and Visual Studio tells me its value (again without compiling), so if a project has a massive enum list, and you need to know the value of one in the middle of the list you don't have to manually count, or compile/run, it just tells you.
3. Refactor variables, I can right click a variable and rename it. This isn't a simple search/replace, not even a 'clever' regex search and replace, this is a refactor that knows the code. For instance, if inside a class I have a variable m_Count (and please don't preach about whether this is a good name or not, if you work on large projects, closed or open source, you have to deal with good and bad code), and I want to rename this variable to m_IdleCount, doing a replace for m_Count would be very bad if multiple classes have an m_Count variable, some of them public, some of them private. The m_Count could be littered across the entire code base, but only half the instances of it would actually need replacing. With Visual Studio it knows all of this, it will only replace the correct ones and also tell you what is has done/is doing in case you want to review.
4. Find variable/class/value/etc., again I don't mean a simple search. Say I have a sprite, MySprite and it has a render function, Render, and I want to find all the cases of this Render function being called, I can't grep for 'Render' as that function name will be used by loads of other things to. With Visual Studio it is able to actually search for cases when Render is being called on a MySprite class. If the Render function is virtual and comes from a base class, it handles this too.
5. Refactor function signatures, so I can add a parameter to a function, it'll automatically fix up declaration and definition, it'll then use the clever find functionality to find instances of said function and put them in a list so you can go through and fix them up.
6. See through defines, by this I mean I can have a define that say adds a function to a class:
#define ADD_MESSAGE_RECEIVER( ) \
void ReceiveMessage( int p1, int p2 ) \
{ \
HandleMessage( p1, p2 ); \
}
class MyClass
{
public:
ADD_MESSAGE_RECEIVER( );
};
Visual Studio can 'see through' this, so when I have an instance of MyClass and hit dot (as in .) it will list 'ReceiveMessage' as one of the functions. This is the tip of the iceberg, it can see through much more, I personally think it is very impressive.
7. Go to definition/declaration, so I can have the cursor over any variable, method, enum, define, etc. and jump to the declaration/definition. Again this doesn't require compiling code. It is also clever as it will 'see through' defines, like in the above example. It will also see through templates. I have seen some very complex macro/template/inheritance code and again it is able to see through all of this. This isn't compile time stuff, or CTAGS, this is real time stuff that works (and works a lot better than any CTAGS implementation I have ever tried).
8. Information current editor position, so if the cursor is over a member variable, in my test I have the cursor on 'm_DebugPrim' it has information that tells me 'PrimitiveHandle m_DebugPrim' so I know m_DebugPrim is a PrimitiveHandle. If I move right, a function is being called on m_DebugPrim, in this case it is m_DebugPrim.SetSortPriority, as I move over 'SetSortPriority' it tells me 'void SetSortPriority( unsigned int SortPriority )'. At any point I can use the definition/declaration information, so if I press Alt-G right now it gives me two options:
Engine\Base\Graphics\RenderHandles.cpp:153 void SetSortPriority( unsigned int SortPriority ) {...} 1
Engine\Base\Graphics\RenderHandles.h:53 void SetSortPriority( unsigned int SortPriority ) 2
I can see which is the definition by {...} at the end, I can also quickly jump to either (1/2 keys).
9. Provide function parameter information, so inside a function call, there is a list of parameters, I want to know what they do, if I have the cursor over say the second parameter, hit CTRL + SHIFT + SPACE, it a random case it tells me:
RayCastResult RayCastTerrain( const Vector2 & startPosition, const Vector2 & vec = Vector2( 0.f, -128.f ) )
And the second parameter 'const Vector2 & vec = Vector2( 0.f, -128.f )' is in bold. This is very handy for functions that takes loads of parameters, rather than counting how many commas there are before the current variable, Visual Studio will just tell you, if you then use the cursor keys to go left and right, as you pass to the next variable it'll update the bold variable. You can also note in the above it tells me that the second parameter has a 'default' value, in this case Vector2( 0.f, -128.f ).
10. Implementing virtual functions, say I have a hierarchy of 8 classes, with various virtual functions that can optionally be implemented. I can look at any level of this hierarchy, but say I look at the final child, I can right click on the child class and and 'Implement Virtual Methods...' this will give me a list of all virtual methods, arranged per class, for each of the base/parent classes. It'll show which ones are already implemented (check box that is ticked) and which ones aren't (no tick in box). If I go ahead and tick a couple of the unimplemented virtual methods and click okay, it'll then implement these functions for me. So it'll add the declaration to the header, and the definition to the source file. The default definition just throws an exception.
11. Integrated CPU/GPU debugger and profiler, since Visual Studio 2012 the GPU debugger (PiX basically) is integrated into Visual Studio. So not only can you set quickly through code, set break points, hardware watch points, step through disassembly etc. you can also step through shader code, move the program counter, back trace a pixel, view draw lists, view meshes pre/post transform, view shader output, and so much more. Anyone doing serious graphics work will testify that you absolutely need a tool like this.
12. Fast debugger, the speed that you can step through stuff in Visual Studio is really quick. The only debugger in the last 10 years I have used that is faster is the PS2 debugger from SN Systems (the PS3 one got slower and then got integrated into Visual Studio). Maybe other debuggers around are fast too? Certainly Xcode/GDB/CodeBlocks is never anywhere near as fast when ever I have used it.