:%s/^printf("@%d\\n", __LINE__);$//Would this be better?
s/^$/printf("@%d\\n", __LINE__);@
:s/.*/printf("& -- %d\\n", __LINE__); &
This only works on lines that don't have string literals and behaves badly on lines that span block boundaries.I had confused @ and &
#define DEBUG_PRINT(stmt) printf(#stmt“ — %d\n”, __LINE__)
Then your replacement could be something like:
s/.*/DEBUG_PRINT(&); &;Which would print out the statement being executed and the line it is at in the program.
Also you’ll want :%s instead of :s, as the latter will only replace on the line on which the cursor is positioned.
Come to think of it, you’ll probably not want this to happen on lines which are themselves preprocessor directives or those with comments, function signatures, or (exclusively) punctuation like with braces. All this to say, I’m sure it could be done, but it gets into the weeds very quickly.
Which I think is a good habit to have anyway. Some people use comments without preceding empty lines (oh why) to delineate code, so they'd have to change the regex a bit to make this work.
s/^$/printf("@%d\\n", __LINE__);
To place a line printf on every empty line in the program, to quickly find out where your code crashes on the next run.
Obviates most of my need for external debuggers, and works over serial lines etc where setting up a debugger is going to be a hassle or simply not possible.