最近碰到一个需要排序代码的情况,在给 Org Babel 添加了很多语言之后,顺序完全没规律,看起来不方便,给语言按照字母表排个序就好了:
这个格式已经很整齐了,稍微再整理下用 M-x sort-lines
或 C-u M-| sort
就能达到目的,但是如果排序的单元不以行为单位,比如:
这是一个已从原 https://emacs-china.github.io/blog/2017/08/19/sort-sexps/ 中分离的主题
最近碰到一个需要排序代码的情况,在给 Org Babel 添加了很多语言之后,顺序完全没规律,看起来不方便,给语言按照字母表排个序就好了:
这个格式已经很整齐了,稍微再整理下用 M-x sort-lines
或 C-u M-| sort
就能达到目的,但是如果排序的单元不以行为单位,比如:
测试下评论。
使用 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)