Sort Sexps

最近碰到一个需要排序代码的情况,在给 Org Babel 添加了很多语言之后,顺序完全没规律,看起来不方便,给语言按照字母表排个序就好了:

这个格式已经很整齐了,稍微再整理下用 M-x sort-linesC-u M-| sort 就能达到目的,但是如果排序的单元不以行为单位,比如:


这是一个已从原 https://emacs-china.github.io/blog/2017/08/19/sort-sexps/ 中分离的主题

测试下评论。


使用 Discourse 作为博客评论系统的教程:

这里(EmacsWiki: Sort Words)的 sort-words/sort-symbols 实现更简短,不过都没有办法处理嵌套的情况:

[1, [4, 3], 2]

排序之后变成:

[1, [2, 3], 4]

我想是不是可以换个思路,把选中的文本转换成列表/“语法树”,以数字为例:

(defun sort-numbers (list)
  (sort list 'gt))

(defun gt(a b)
  (let ((a1 (if (listp a) (car (sort-numbers a)) a))
        (b1 (if (listp b) (car (sort-numbers b)) b)))
    (> a1 b1)))

(sort-numbers '(1 4 (5 2) 3)) ;; 假设已经 parse 好了
;; => ((5 2) 4 3 1)

只处理比较常见的数据,比如数组/列表、map等等,把四则运算符等同于一般的分隔符对待。

嗯,文中提到的 sort-sexp 不会破坏语法结构,因为 sort-sexp 比较的是 1, [4, 3], 2 这三个 Sexp,它依赖的是编程语言的语法,而不是正则表达式,也因此它只能排序真正的代码,而不是一般的文字。

# -*- mode: ruby; -*-

ary = [1, [4, 3], 2]

# M-x sort-words
ary = [1, [2, 3], 4]

# M-x sort-symbols
ary = [1, [2, 3], 4]

# M-x chunyang-sort-sexps
ary = [1, 2, [4, 3]]

chunyang-sort-sexps 也就是上面的 sort-sexp,自用的时候加了 Prefix)