| Hint to Part 8 Exercise | |
| Using a global command can cut the length of the command | |
| sequence roughly in half. The correct way to use it depends on | |
| something I did not explicitly say about global commands, but | |
| which you should be able to guess from what I did say. | |
| Answer to Part 8 Exercise | |
| A fairly simple way to handle both writing the tab-revised | |
| version of your file and keeping the original version in the | |
| editor buffer is this sequence: | |
| :.g/^/%s/\({*\)^I^I/\1{/g|%s/^\({*\)^I/\1 /|%s/{/^I/g|w | |
| u | |
| The first line is pretty straightforward, excepting the initial | |
| global command. Otherwise it just replaces every pair of tabs at | |
| the start of a line with the dummy character "{", then changes | |
| any remaining solitary tab in the initial whitespace with four | |
| space characters, changes every dummy "{" to a single tab, and | |
| finally writes the file. | |
| That initial global command seems silly, I know. It scans over | |
| just the current line, it marks that line without fail because | |
| every line has a starting point, and so it ends up running the | |
| remaining commands on the line for sure and exactly once. This is | |
| just what the command line would do without that initial global. | |
| So why is it there? | |
| The answer is in that second line. When you run an undo after a | |
| global command, you don't just undo the last command the global | |
| ran; you undo every buffer change done by every command the | |
| global ran. (Note that the u is not preceded by a colon (":"); | |
| it is a screen-mode command.) So as soon as the write is | |
| finished, the undo puts the entire buffer back as it was. | |
| Back to Part 8 | |
| Back to the index |