• 作成:

Emacs Lispでsort-dwimを書きました

前から書こうと思ってましたがだるくてやってなかったものです.

(defun sort-dwim ()
  "1行選択している時は単語のソート, 選択してない時はパラグラフの行ソート, 選択している時はその範囲の行ソート"
  (interactive)
  (save-excursion
    (if (and (use-region-p)
             (eq (line-number-at-pos (region-beginning)) (line-number-at-pos (region-end))))
        (progn
          (kill-region (region-beginning) (region-end))
          (let ((line (car kill-ring)))
            (setq kill-ring (cdr kill-ring))
            (insert (string-join (sort (split-string line) (lambda (a b) (string< a b))) " "))))
      (progn (unless (use-region-p) (mark-paragraph))
             (sort-lines nil (region-beginning) (region-end))))))

世の中には sort-words.el : regionの単語をソートする!Emacs Lisp初級者はソースコードも読んでみようなんてものもあるらしいですが. まあこれぐらいなら外部ライブラリを使わずに書いて良さそうですね.

しかしEmacs Lispのsortがデフォルト比較引数を用意していないのには驚きました. 引数が省略可能な言語でソートにデフォルト引数がない言語はC言語以外であんまりなさそう.