Emacs Listpのsort-regexp-fields

Emacsで以下のような行を、先頭のアスタリスクを無視してソートできないかな、と思って探したらsort-regexp-fieldsが見つかりました。

**ccc zzz
aaa yyy
*bbb xxx

のような行を、

aaa yyy
*bbb xxx
**ccc zzz

のようにソートしたいわけです。

使い方は、こんな感じ(Emacsの画面上で、リージョンを指定して実行する場合)。

(sort-regexp-fields nil "正規表現"
                     (region-beginning)
                     (region-end))

わたしの場合は、rubyなんかの普通の?正規表現で書くと

/^\**\s*(\w+).*$/

でマッチした$1の部分でソートすることになります。Emacs Lispの文字列で表す場合は、

"^\\** *\(\\w+\).*$"

になりました。()の中を表すのは”\1″です。

というわけで、

(defun sort-alpha ()
  (interactive)
  (sort-regexp-fields nil "^\\** *\\(\\w+\\).*$" "\\1"
                      (region-beginning)
                      (region-end)))

というのを作ってみました。「nil」の部分をマイナスの数字「-1」にすると逆順にソートされます。

ちなみに「^ 〜 $」として行頭から行末まで全部マッチさせているのが大事なようです。
たとえば、

...
  (sort-regexp-fields nil "\\(\\w+\\)$" "\\1"
...

のように一部分だけ指定して以下をソートすると

ソート前

aaa yyy
bbb xxx
**ccc zzz

ソート後

aaa xxx
bbb yyy
**ccc zzz

のように2カラム目だけがソートされて行の要素がバラバラになってしまいます。

コメント