I've been using the macro below on my laptop with TextMate for quite a while, and just realized I didn't have it on my G5. I went to record it and ended up having a terrible time. It seems that with newer versions of textmate (I couldn't tell you which version I was on when I recorded it on my laptop) when you record the macro below, it adds an "insert text" command with whatever tag has been inserted.
The macro: In an HTML document, type < (it inserts <>, but ignore that), now do: 1) Automation / Start Macro Recording 2) Backwards delete (to delete <, which also removes >) 3) Automation / Insert Closing Tag 4) Automation / Stop Macro Recording
Now save this macro, give it key equivalent /, and here's the sneaky part: set the scope to: text.html invalid.illegal.incomplete
The scope controls when the macro should "fire", and if you press ctrl-shift P inside <>, you'll see the scope of that position, which is what's quoted above. So only inside <> will / fire this macro, which first removes the <> and then inserts the closing tag.
In newer versions, instead of just coming out with
deleteBackward: insertClosingTag:
it also adds
insertText: </html> (or whichever tag you happened to be closing)
I was able to open up the recorded macro in the Property List Editor and remove the third command, but that is not a very elegant solution. This was working properly in the past!
-Kevin