2

我如何使用sort-regexp-fields来模拟排序数字字段。我试过这样:

123
345
90
80
1999

M-x sort-regexp-fields

Regexp specifying records to sort:\ ([0-9]+\)

Regexp specifying key within record:\, \#1

但它行不通。我真正想要排序的是这样的:

foo index: 123
index: 345 boo
…

问题是:我想按“index”这个词后面的数字对行进行排序,但是数字不在同一个字段中,它们只是在它前面有一个“index”这个词。我应该怎么做才能完成这个?有人可以帮助我吗?

4

2 回答 2

3

sort-regexp-fields不进行字典比较,并且没有简单的方法可以让它做到这一点。也就是说,我们可以使用定义我们自己的命令的技巧,并使用该命令向一些建议发出信号,以便在字典比较中进行鞋拔。

如果您在要比较的行周围标记区域,则以下命令会执行您想要的操作:

(defun my-line-sort (begin end)
  (interactive "r")
  (sort-regexp-fields nil "^.*: +\\([0-9]+\\).*$" "\\1" begin end))

(defun compare-buffer-substrings-lexigraphically (b1 b2)
  (< (string-to-number (buffer-substring-no-properties (car b1) (cdr b1)))
     (string-to-number (buffer-substring-no-properties (car b2) (cdr b2)))))

(defadvice sort-subr (before sort-subr-lexical-compare activate)
  "In special case, force predicate to be a lexical compare"
  (when (eq this-command 'my-line-sort)
    (ad-set-arg 5 'compare-buffer-substrings-lexigraphically)))
于 2012-12-19T04:23:05.380 回答
0

如果我正确理解您的情况,这将满足您的要求:

M-xsort-regexp-fieldsRETindex: \([0-9]+\)RET\1RET

于 2012-12-19T16:40:33.557 回答