Sorting Rectangles

Mickey has a nice solution to the last VimGolf in Emacs challenge. It certainly doesn't win on total keystrokes but it does demonstrate a really powerful method for solving problems like the challenge. Mickey uses sort-regexp-fields to sort parts of each line by

  1. Picking out the part of each line after the =␠ as a field
  2. Sorting the specified fields using the whole field as the key

Since only the specified fields are moved, this effectively switches the ends of the two lines leaving the beginnings of the lines where they were. A very nice solution and a powerful technique. Mickey has an excellent write up on sort-regexp-fields here.

This result is reminiscent of Fuco's solution where he specified a rectangle that contained the same fields and then reversed the lines in that rectangle. That got me thinking about whether you could sort those fields instead of reversing them. Fuco used 【Meta+Shift+r】 to reverse the lines so I thought maybe there was a similar command for sorting them—【Meta+Shift+s】 perhaps. It turns out that no such command exists but there is 【Meta+|】 which pipes the rectangle to a shell command and with a preceding 【Ctrl+u】 will replace the rectangle with the result. Thus given

abc 789
def 123
ghi 456

we can get

abc 123
def 456
ghi 789


Ctrl+s Space Move to upper left of triangle
Ctrl+Return Enter CUA rectangle mode
Ctrl+s 6 Move to lower right of triangle
Ctrl+u Meta+|sort Sort and replace rectangle

That's a bit faster and easier than sort-regexp-fields but not as powerful because with sort-regexp-fields you can use just a part of the field (rather than the whole field) as a key and the fields don't have to form a rectangle.

To illustrate that last point, suppose you have

abc 789
123 def
ghi 456

and you want

abc 123
456 def
ghi 789

You can do that with

Ctrl+x h Mark buffer
Meta+xsort-regexp-fields Call sort-regexp-fields
[1-9]+ Define fields
\& Define keys

Mickey remarks that these challenges are pointless but fun. They're certainly fun and they're pointless in the sense that the solutions are mostly ad hoc and not useful outside of the challenge they solve but I, at least, find them useful as a way to learn new Emacs techniques. With just this last challenge, I learned about reversing lines in a rectangle and sort-regexp-fields and both of those are things I will most certainly find useful later even if I'm unlikely to need to resolve the particular challenge where I learned them.

This entry was posted in General and tagged . Bookmark the permalink.