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
…

問題は、「インデックス」という単語の後の数字で行を並べ替えたいのですが、数字が同じフィールドになく、その前に「インデックス」という単語があるだけです。これを完了するにはどうすればよいですか? 誰でも私を助けることができますか?

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 に答える