Agreed, I think of macro as a superset of multiple-cursors. Heck, with macro you can even run arbitrary code to generate text dynamically. I had the pleasure of doing this multiple times.
In Emacs, you can use multiple registers for storing code and data for this purpose
In Emacs, you can use multiple registers for storing code and data for this purpose