annotate lisp/sort.el @ 18092:8428d56cd207

(smtpmail-via-smtp): Recognize XVRB as a synonym for VERB and XONE as a synonym for ONEX. (smtpmail-read-response): Add "%s" to `message' calls to avoid problems with percent signs in strings. (smtpmail-read-response): Return all lines of the response text as a list of strings. Formerly only the first line was returned. This is insufficient when one wants to parse e.g. an EHLO response. Ignore responses starting with "0". This is necessary to support the VERB SMTP extension. (smtpmail-via-smtp): Try EHLO and find out which SMTP service extensions the receiving mailer supports. Issue the ONEX and XUSR commands if the corresponding extensions are supported. Issue VERB if supported and `smtpmail-debug-info' is non-nil. Add SIZE attribute to MAIL FROM: command if SIZE extension is supported. Add code that could set the BODY= attribute to MAIL FROM: if the receiving mailer supports 8BITMIME. This is currently disabled, since doing it right might involve adding MIME headers to, and in some cases reencoding, the message.
author Richard M. Stallman <rms@gnu.org>
date Sun, 01 Jun 1997 22:24:22 +0000
parents b06dea50c67a
children 142900099257
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1 ;;; sort.el --- commands to sort text in an Emacs buffer.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
2
11235
e6bdaaa6ce1b Update copyright.
Karl Heuer <kwzh@gnu.org>
parents: 10763
diff changeset
3 ;; Copyright (C) 1986, 1987, 1994, 1995 Free Software Foundation, Inc.
840
113281b361ec *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
4
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
5 ;; Author: Howie Kaye
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
6 ;; Maintainer: FSF
814
38b2499cb3e9 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
7 ;; Keywords: unix
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
8
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; any later version.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13643
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13643
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13643
diff changeset
24 ;; Boston, MA 02111-1307, USA.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2185
diff changeset
26 ;;; Commentary:
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2185
diff changeset
27
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13643
diff changeset
28 ;; This package provides the sorting facilities documented in the Emacs
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13643
diff changeset
29 ;; user's manual.
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2185
diff changeset
30
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
31 ;;; Code:
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32
3409
09bba81c038f (sort-fold-case): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
33 (defvar sort-fold-case nil
09bba81c038f (sort-fold-case): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
34 "*Non-nil if the buffer sort functions should ignore case.")
09bba81c038f (sort-fold-case): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
35
6474
79765ff7bfa1 (sort-subr): Add autoload.
Richard M. Stallman <rms@gnu.org>
parents: 5747
diff changeset
36 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 (defun sort-subr (reverse nextrecfun endrecfun &optional startkeyfun endkeyfun)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 "General text sorting routine to divide buffer into records and sort them.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 Arguments are REVERSE NEXTRECFUN ENDRECFUN &optional STARTKEYFUN ENDKEYFUN.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
41 We divide the accessible portion of the buffer into disjoint pieces
998
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
42 called sort records. A portion of each sort record (perhaps all of
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
43 it) is designated as the sort key. The records are rearranged in the
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
44 buffer in order by their sort keys. The records may or may not be
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
45 contiguous.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 Usually the records are rearranged in order of ascending sort key.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 If REVERSE is non-nil, they are rearranged in order of descending sort key.
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
49 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
50 the sort order.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 The next four arguments are functions to be called to move point
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 across a sort record. They will be called many times from within sort-subr.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 NEXTRECFUN is called with point at the end of the previous record.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 It moves point to the start of the next record.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 It should move point to the end of the buffer if there are no more records.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 The first record is assumed to start at the position of point when sort-subr
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 is called.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60
1836
fe4f7650a94b (sort-subr): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 998
diff changeset
61 ENDRECFUN is called with point within the record.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 It should move point to the end of the record.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63
1836
fe4f7650a94b (sort-subr): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 998
diff changeset
64 STARTKEYFUN moves from the start of the record to the start of the key.
fe4f7650a94b (sort-subr): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 998
diff changeset
65 It may return either a non-nil value to be used as the key, or
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
66 else the key is the substring between the values of point after
135
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
67 STARTKEYFUN and ENDKEYFUN are called. If STARTKEYFUN is nil, the key
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
68 starts at the beginning of the record.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 ENDKEYFUN moves from the start of the sort key to the end of the sort key.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 ENDKEYFUN may be nil if STARTKEYFUN returns a value or if it would be the
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 same as ENDRECFUN."
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
73 ;; Heuristically try to avoid messages if sorting a small amt of text.
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
74 (let ((messages (> (- (point-max) (point-min)) 50000)))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
75 (save-excursion
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
76 (if messages (message "Finding sort keys..."))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
77 (let* ((sort-lists (sort-build-lists nextrecfun endrecfun
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
78 startkeyfun endkeyfun))
3409
09bba81c038f (sort-fold-case): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
79 (old (reverse sort-lists))
09bba81c038f (sort-fold-case): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2315
diff changeset
80 (case-fold-search sort-fold-case))
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
81 (if (null sort-lists)
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
82 ()
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
83 (or reverse (setq sort-lists (nreverse sort-lists)))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
84 (if messages (message "Sorting records..."))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
85 (setq sort-lists
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
86 (if (fboundp 'sortcar)
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
87 (sortcar sort-lists
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
88 (cond ((numberp (car (car sort-lists)))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
89 ;; This handles both ints and floats.
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
90 '<)
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
91 ((consp (car (car sort-lists)))
1844
d48f094be56e (sort-build-lists): Record the key as pair of positions;
Richard M. Stallman <rms@gnu.org>
parents: 1836
diff changeset
92 (function
d48f094be56e (sort-build-lists): Record the key as pair of positions;
Richard M. Stallman <rms@gnu.org>
parents: 1836
diff changeset
93 (lambda (a b)
d48f094be56e (sort-build-lists): Record the key as pair of positions;
Richard M. Stallman <rms@gnu.org>
parents: 1836
diff changeset
94 (> 0 (compare-buffer-substrings
1845
aeb1a834481b (sort-subr): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 1844
diff changeset
95 nil (car a) (cdr a)
aeb1a834481b (sort-subr): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 1844
diff changeset
96 nil (car b) (cdr b))))))
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
97 (t
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
98 'string<)))
998
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
99 (sort sort-lists
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
100 (cond ((numberp (car (car sort-lists)))
6991
72393aa69dd2 (sort-subr): Use car-less-than-car when appropriate.
Richard M. Stallman <rms@gnu.org>
parents: 6474
diff changeset
101 'car-less-than-car)
998
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
102 ((consp (car (car sort-lists)))
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
103 (function
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
104 (lambda (a b)
1844
d48f094be56e (sort-build-lists): Record the key as pair of positions;
Richard M. Stallman <rms@gnu.org>
parents: 1836
diff changeset
105 (> 0 (compare-buffer-substrings
1845
aeb1a834481b (sort-subr): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 1844
diff changeset
106 nil (car (car a)) (cdr (car a))
aeb1a834481b (sort-subr): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 1844
diff changeset
107 nil (car (car b)) (cdr (car b)))))))
998
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
108 (t
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
109 (function
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
110 (lambda (a b)
61c6983219ff entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 996
diff changeset
111 (string< (car a) (car b)))))))))
996
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
112 (if reverse (setq sort-lists (nreverse sort-lists)))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
113 (if messages (message "Reordering buffer..."))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
114 (sort-reorder-buffer sort-lists old)))
0e8ace07a231 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 840
diff changeset
115 (if messages (message "Reordering buffer... Done"))))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 nil)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 ;; Parse buffer into records using the arguments as Lisp expressions;
136
4d8caa5e2cba *** empty log message ***
root <root>
parents: 135
diff changeset
119 ;; return a list of records. Each record looks like (KEY STARTPOS . ENDPOS)
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;; where KEY is the sort key (a number or string),
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 ;; and STARTPOS and ENDPOS are the bounds of this record in the buffer.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 ;; The records appear in the list lastmost first!
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 (defun sort-build-lists (nextrecfun endrecfun startkeyfun endkeyfun)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 (let ((sort-lists ())
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 (start-rec nil)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 done key)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 ;; Loop over sort records.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 ;(goto-char (point-min)) -- it is the caller's responsibility to
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 ;arrange this if necessary
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 (while (not (eobp))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 (setq start-rec (point)) ;save record start
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 (setq done nil)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 ;; Get key value, or move to start of key.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 (setq key (catch 'key
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 (or (and startkeyfun (funcall startkeyfun))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 ;; If key was not returned as value,
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 ;; move to end of key and get key from the buffer.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 (let ((start (point)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 (funcall (or endkeyfun
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 (prog1 endrecfun (setq done t))))
1844
d48f094be56e (sort-build-lists): Record the key as pair of positions;
Richard M. Stallman <rms@gnu.org>
parents: 1836
diff changeset
143 (cons start (point))))))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 ;; Move to end of this record (start of next one, or end of buffer).
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 (cond ((prog1 done (setq done nil)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (endrecfun (funcall endrecfun))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 (nextrecfun (funcall nextrecfun) (setq done t)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (if key (setq sort-lists (cons
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 ;; consing optimization in case in which key
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 ;; is same as record.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 (if (and (consp key)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 (equal (car key) start-rec)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (equal (cdr key) (point)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 (cons key key)
135
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
155 (cons key (cons start-rec (point))))
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
156 sort-lists)))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 (and (not done) nextrecfun (funcall nextrecfun)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 sort-lists))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 (defun sort-reorder-buffer (sort-lists old)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 (let ((inhibit-quit t)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (last (point-min))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 (min (point-min)) (max (point-max)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 ;; Make sure insertions done for reordering
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 ;; do not go after any markers at the end of the sorted region,
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 ;; by inserting a space to separate them.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 (goto-char (point-max))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 (insert-before-markers " ")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 (narrow-to-region min (1- (point-max)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (while sort-lists
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 (goto-char (point-max))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (insert-buffer-substring (current-buffer)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 last
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (nth 1 (car old)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 (goto-char (point-max))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 (insert-buffer-substring (current-buffer)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 (nth 1 (car sort-lists))
135
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
178 (cdr (cdr (car sort-lists))))
e1b5a59d0f91 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 86
diff changeset
179 (setq last (cdr (cdr (car old)))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 sort-lists (cdr sort-lists)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 old (cdr old)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (goto-char (point-max))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (insert-buffer-substring (current-buffer)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 last
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 max)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 ;; Delete the original copy of the text.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (delete-region min max)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 ;; Get rid of the separator " ".
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 (goto-char (point-max))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 (narrow-to-region min (1+ (point)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 (delete-region (point) (1+ (point)))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
193 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (defun sort-lines (reverse beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 "Sort lines in region alphabetically; argument means descending order.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 Called from a program, there are three arguments:
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
197 REVERSE (non-nil means reverse order), BEG and END (region to sort).
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
198 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
199 the sort order."
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (interactive "P\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 (narrow-to-region beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (goto-char (point-min))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (sort-subr reverse 'forward-line 'end-of-line))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
207 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defun sort-paragraphs (reverse beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 "Sort paragraphs in region alphabetically; argument means descending order.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 Called from a program, there are three arguments:
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
211 REVERSE (non-nil means reverse order), BEG and END (region to sort).
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
212 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
213 the sort order."
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (interactive "P\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (narrow-to-region beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (goto-char (point-min))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 (sort-subr reverse
5747
cbd0de32e997 (sort-paragraphs): Use proper paragraph definition instead of just checking
Karl Heuer <kwzh@gnu.org>
parents: 5418
diff changeset
220 (function
cbd0de32e997 (sort-paragraphs): Use proper paragraph definition instead of just checking
Karl Heuer <kwzh@gnu.org>
parents: 5418
diff changeset
221 (lambda ()
cbd0de32e997 (sort-paragraphs): Use proper paragraph definition instead of just checking
Karl Heuer <kwzh@gnu.org>
parents: 5418
diff changeset
222 (while (and (not (eobp)) (looking-at paragraph-separate))
cbd0de32e997 (sort-paragraphs): Use proper paragraph definition instead of just checking
Karl Heuer <kwzh@gnu.org>
parents: 5418
diff changeset
223 (forward-line 1))))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 'forward-paragraph))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
226 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 (defun sort-pages (reverse beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 "Sort pages in region alphabetically; argument means descending order.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 Called from a program, there are three arguments:
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
230 REVERSE (non-nil means reverse order), BEG and END (region to sort).
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
231 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
232 the sort order."
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 (interactive "P\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 (narrow-to-region beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 (goto-char (point-min))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (sort-subr reverse
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 (function (lambda () (skip-chars-forward "\n")))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 'forward-page))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 (defvar sort-fields-syntax-table nil)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (if sort-fields-syntax-table nil
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 (let ((table (make-syntax-table))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (i 0))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 (while (< i 256)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (modify-syntax-entry i "w" table)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (setq i (1+ i)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 (modify-syntax-entry ?\ " " table)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 (modify-syntax-entry ?\t " " table)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 (modify-syntax-entry ?\n " " table)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 (modify-syntax-entry ?\. "_" table) ; for floating pt. numbers. -wsr
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 (setq sort-fields-syntax-table table)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
255 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 (defun sort-numeric-fields (field beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 "Sort lines in region numerically by the ARGth field of each line.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 Fields are separated by whitespace and numbered from 1 up.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 Specified field must contain a number in each line of the region.
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
260 With a negative arg, sorts by the ARGth field counted from the right.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 Called from a program, there are three arguments:
5418
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
262 FIELD, BEG and END. BEG and END specify region to sort."
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 (interactive "p\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 (sort-fields-1 field beg end
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 (function (lambda ()
4238
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
266 (sort-skip-fields field)
2185
5bf3a379d7b5 * sort.el (sort-float-fields, sort-numeric-fields): Use
Jim Blandy <jimb@redhat.com>
parents: 2184
diff changeset
267 (string-to-number
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 (buffer-substring
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 (point)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 ;; This is just wrong! Even without floats...
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 ;; (skip-chars-forward "[0-9]")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 (forward-sexp 1)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (point))))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 nil))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276
5418
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
277 ;;;;;###autoload
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
278 ;;(defun sort-float-fields (field beg end)
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
279 ;; "Sort lines in region numerically by the ARGth field of each line.
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
280 ;;Fields are separated by whitespace and numbered from 1 up. Specified field
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
281 ;;must contain a floating point number in each line of the region. With a
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
282 ;;negative arg, sorts by the ARGth field counted from the right. Called from a
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
283 ;;program, there are three arguments: FIELD, BEG and END. BEG and END specify
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
284 ;;region to sort."
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
285 ;; (interactive "p\nr")
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
286 ;; (sort-fields-1 field beg end
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
287 ;; (function (lambda ()
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
288 ;; (sort-skip-fields field)
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
289 ;; (string-to-number
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
290 ;; (buffer-substring
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
291 ;; (point)
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
292 ;; (save-excursion
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
293 ;; (re-search-forward
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
294 ;; "[+-]?[0-9]*\.?[0-9]*\\([eE][+-]?[0-9]+\\)?")
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
295 ;; (point))))))
6eb86cda3856 (sort-float-fields): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 4247
diff changeset
296 ;; nil))
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
297
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
298 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (defun sort-fields (field beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 "Sort lines in region lexicographically by the ARGth field of each line.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 Fields are separated by whitespace and numbered from 1 up.
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
302 With a negative arg, sorts by the ARGth field counted from the right.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 Called from a program, there are three arguments:
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
304 FIELD, BEG and END. BEG and END specify region to sort.
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
305 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
306 the sort order."
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (interactive "p\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 (sort-fields-1 field beg end
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (function (lambda ()
4238
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
310 (sort-skip-fields field)
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 nil))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 (function (lambda () (skip-chars-forward "^ \t\n")))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (defun sort-fields-1 (field beg end startkeyfun endkeyfun)
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
315 (let ((tbl (syntax-table)))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
316 (if (zerop field) (setq field 1))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (unwind-protect
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 (narrow-to-region beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (goto-char (point-min))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 (set-syntax-table sort-fields-syntax-table)
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
323 (sort-subr nil
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 'forward-line 'end-of-line
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 startkeyfun endkeyfun)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (set-syntax-table tbl))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327
4238
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
328 ;; Position at the beginning of field N on the current line,
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
329 ;; assuming point is initially at the beginning of the line.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 (defun sort-skip-fields (n)
4238
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
331 (if (> n 0)
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
332 ;; Skip across N - 1 fields.
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
333 (let ((i (1- n)))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
334 (while (> i 0)
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
335 (skip-chars-forward " \t")
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
336 (skip-chars-forward "^ \t\n")
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
337 (setq i (1- i)))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
338 (skip-chars-forward " \t")
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
339 (if (eolp)
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
340 (error "Line has too few fields: %s"
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
341 (buffer-substring
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
342 (save-excursion (beginning-of-line) (point))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
343 (save-excursion (end-of-line) (point))))))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
344 (end-of-line)
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
345 ;; Skip back across - N - 1 fields.
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
346 (let ((i (1- (- n))))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
347 (while (> i 0)
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
348 (skip-chars-backward " \t")
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
349 (skip-chars-backward "^ \t\n")
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
350 (setq i (1- i)))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
351 (skip-chars-backward " \t"))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
352 (if (bolp)
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 (error "Line has too few fields: %s"
4238
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
354 (buffer-substring
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
355 (save-excursion (beginning-of-line) (point))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
356 (save-excursion (end-of-line) (point)))))
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
357 ;; Position at the front of the field
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
358 ;; even if moving backwards.
6a22eb586080 (sort-skip-fields): Really implement fields as runs
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
359 (skip-chars-backward "^ \t\n")))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360
10763
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
361 (defvar sort-regexp-fields-regexp)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
362 (defvar sort-regexp-record-end)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
363
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
364 ;; Move to the beginning of the next match for record-regexp,
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
365 ;; and set sort-regexp-record-end to the end of that match.
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
366 ;; If the next match is empty and does not advance point,
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
367 ;; skip one character and try again.
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
368 (defun sort-regexp-fields-next-record ()
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
369 (let ((oldpos (point)))
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
370 (and (re-search-forward sort-regexp-fields-regexp nil 'move)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
371 (setq sort-regexp-record-end (match-end 0))
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
372 (if (= sort-regexp-record-end oldpos)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
373 (progn
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
374 (forward-char 1)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
375 (re-search-forward sort-regexp-fields-regexp nil 'move)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
376 (setq sort-regexp-record-end (match-end 0)))
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
377 t)
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
378 (goto-char (match-beginning 0)))))
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
379
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
380 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (defun sort-regexp-fields (reverse record-regexp key-regexp beg end)
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3409
diff changeset
382 "Sort the region lexicographically as specified by RECORD-REGEXP and KEY.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 RECORD-REGEXP specifies the textual units which should be sorted.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 For example, to sort lines RECORD-REGEXP would be \"^.*$\"
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 KEY specifies the part of each record (ie each match for RECORD-REGEXP)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 is to be used for sorting.
13643
146c5daf3019 (sort-regexp-fields): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
387 If it is \"\\\\digit\" then the digit'th \"\\\\(...\\\\)\" match field from
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 RECORD-REGEXP is used.
13643
146c5daf3019 (sort-regexp-fields): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
389 If it is \"\\\\&\" then the whole record is used.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 Otherwise, it is a regular-expression for which to search within the record.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 If a match for KEY is not found within a record then that record is ignored.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 With a negative prefix arg sorts in reverse order.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
395 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
396 the sort order.
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
397
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 For example: to sort lines in the region by the first word on each line
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 starting with the letter \"f\",
13643
146c5daf3019 (sort-regexp-fields): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
400 RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\\\=\\<f\\\\w*\\\\>\""
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
401 ;; using negative prefix arg to mean "reverse" is now inconsistent with
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
402 ;; other sort-.*fields functions but then again this was before, since it
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
403 ;; didn't use the magnitude of the arg to specify anything.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 (interactive "P\nsRegexp specifying records to sort:
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 sRegexp specifying key within record: \nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 (cond ((or (equal key-regexp "") (equal key-regexp "\\&"))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 (setq key-regexp 0))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 ((string-match "\\`\\\\[1-9]\\'" key-regexp)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (setq key-regexp (- (aref key-regexp 1) ?0))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 (narrow-to-region beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 (goto-char (point-min))
10763
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
414 (let (sort-regexp-record-end
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
415 (sort-regexp-fields-regexp record-regexp))
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
416 (re-search-forward sort-regexp-fields-regexp)
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 (setq sort-regexp-record-end (point))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (goto-char (match-beginning 0))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (sort-subr reverse
10763
d5a22f90865d (sort-regexp-fields-next-record): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
420 'sort-regexp-fields-next-record
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (function (lambda ()
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (goto-char sort-regexp-record-end)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (function (lambda ()
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (let ((n 0))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (cond ((numberp key-regexp)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (setq n key-regexp))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 ((re-search-forward
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 key-regexp sort-regexp-record-end t)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 (setq n 0))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 (t (throw 'key nil)))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (condition-case ()
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
432 (cons (match-beginning n)
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
433 (match-end n))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 ;; if there was no such register
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 (error (throw 'key nil)))))))))))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (defvar sort-columns-subprocess t)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
440 ;;;###autoload
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (defun sort-columns (reverse &optional beg end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 "Sort lines in region alphabetically by a certain range of columns.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 For the purpose of this command, the region includes
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 the entire line that point is in and the entire line the mark is in.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 The column positions of point and mark bound the range of columns to sort on.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 A prefix argument means sort into reverse order.
16765
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
447 The variable `sort-fold-case' determines whether alphabetic case affects
b06dea50c67a Many doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 16655
diff changeset
448 the sort order.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 Note that `sort-columns' rejects text that contains tabs,
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 because tabs could be split across the specified columns
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 and it doesn't know how to handle that. Also, when possible,
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 it uses the `sort' utility program, which doesn't understand tabs.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 Use \\[untabify] to convert tabs to spaces before sorting."
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 (interactive "P\nr")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 (let (beg1 end1 col-beg1 col-end1 col-start col-end)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 (goto-char (min beg end))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 (setq col-beg1 (current-column))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 (beginning-of-line)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 (setq beg1 (point))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 (goto-char (max beg end))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 (setq col-end1 (current-column))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 (forward-line)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 (setq end1 (point))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 (setq col-start (min col-beg1 col-end1))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 (setq col-end (max col-beg1 col-end1))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (if (search-backward "\t" beg1 t)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 (error "sort-columns does not work with tabs. Use M-x untabify."))
16655
c7b0fffd4c2e (sort-columns): Don't use `sort' utility if the text has text properties.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
470 (if (not (or (eq system-type 'vax-vms)
c7b0fffd4c2e (sort-columns): Don't use `sort' utility if the text has text properties.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
471 (text-properties-at beg1)
c7b0fffd4c2e (sort-columns): Don't use `sort' utility if the text has text properties.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
472 (< (next-property-change beg1 nil end1) end1)))
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 ;; Use the sort utility if we can; it is 4 times as fast.
16655
c7b0fffd4c2e (sort-columns): Don't use `sort' utility if the text has text properties.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
474 ;; Do not use it if there are any properties in the region,
c7b0fffd4c2e (sort-columns): Don't use `sort' utility if the text has text properties.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
475 ;; since the sort utility would lose the properties.
70
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 (call-process-region beg1 end1 "sort" t t nil
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (if reverse "-rt\n" "-t\n")
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 (concat "+0." col-start)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 (concat "-0." col-end))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 ;; On VMS, use Emacs's own facilities.
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 (save-excursion
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 (save-restriction
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (narrow-to-region beg1 end1)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 (goto-char beg1)
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 (sort-subr reverse 'forward-line 'end-of-line
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 (function (lambda () (move-to-column col-start) nil))
28fb18d48c35 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 (function (lambda () (move-to-column col-end) nil)))))))))
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
488
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 136
diff changeset
489 ;;;###autoload
86
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
490 (defun reverse-region (beg end)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
491 "Reverse the order of lines in a region.
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
492 From a program takes two point or marker arguments, BEG and END."
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
493 (interactive "r")
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
494 (if (> beg end)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
495 (let (mid) (setq mid end end beg beg mid)))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
496 (save-excursion
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
497 ;; put beg at the start of a line and end and the end of one --
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
498 ;; the largest possible region which fits this criteria
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
499 (goto-char beg)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
500 (or (bolp) (forward-line 1))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
501 (setq beg (point))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
502 (goto-char end)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
503 ;; the test for bolp is for those times when end is on an empty line;
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
504 ;; it is probably not the case that the line should be included in the
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
505 ;; reversal; it isn't difficult to add it afterward.
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
506 (or (and (eolp) (not (bolp))) (progn (forward-line -1) (end-of-line)))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
507 (setq end (point-marker))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
508 ;; the real work. this thing cranks through memory on large regions.
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
509 (let (ll (do t))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
510 (while do
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
511 (goto-char beg)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
512 (setq ll (cons (buffer-substring (point) (progn (end-of-line) (point)))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
513 ll))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
514 (setq do (/= (point) end))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
515 (delete-region beg (if do (1+ (point)) (point))))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
516 (while (cdr ll)
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
517 (insert (car ll) "\n")
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
518 (setq ll (cdr ll)))
278f3b6206cc *** empty log message ***
root <root>
parents: 70
diff changeset
519 (insert (car ll)))))
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 258
diff changeset
520
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 258
diff changeset
521 (provide 'sort)
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 258
diff changeset
522
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
523 ;;; sort.el ends here