3 ms·
No, yours replaces empty lines with 'printf("@%d\n", __LINE);@'. The GP replaces empty lines with 'printf("@%d\n", __LINE__);' The replacement doesn't wrap any
by king_geedorah 3y ago
No, yours replaces empty lines with 'printf("@%d\n", __LINE);@'. The GP replaces empty lines with 'printf("@%d\n", __LINE__);' The replacement doesn't wrap any code. It annotates that certain points in the source have been reached at runtime. Yours wouldn't compile, which seriously limits its usefulness.
- gcr 3y agoAh, I misinterpreted. The trick only replaces blank lines, I thought it would work on any line because I thought that `@` was a special output token that would cause vim to insert a copy of the matched input. It isn't.
- gcr 3y agoDigging into this a bit, here's the command I thought I wanted: :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 &
- king_geedorah 3y agoMakes sense. I suppose one could also use a debug macro that stringifies the statement to avoid the problems you described. Might be something like: #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.