annotate lisp/format.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 280c8ae2476d
children c00190a8c8ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13352
8dba183df579 Correct initial line typo.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
1 ;;; format.el --- read and save files in multiple formats
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
2
104572
aa590c490d6f (format-alist): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 101345
diff changeset
3 ;; Copyright (C) 1994, 1995, 1997, 1999, 2001, 2002, 2003, 2004, 2005,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106785
diff changeset
4 ;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
5
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
6 ;; Author: Boris Goldowsky <boris@gnu.org>
110015
280c8ae2476d Add "Package:" file headers to denote built-in packages.
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
7 ;; Package: emacs
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
8
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
10
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
14 ;; (at your option) any later version.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
15
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
20
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
23
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
25
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
26 ;; This file defines a unified mechanism for saving & loading files stored
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
27 ;; in different formats. `format-alist' contains information that directs
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
28 ;; Emacs to call an encoding or decoding function when reading or writing
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
29 ;; files that match certain conditions.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
30 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
31 ;; When a file is visited, its format is determined by matching the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
32 ;; beginning of the file against regular expressions stored in
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
33 ;; `format-alist'. If this fails, you can manually translate the buffer
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
34 ;; using `format-decode-buffer'. In either case, the formats used are
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
35 ;; listed in the variable `buffer-file-format', and become the default
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
36 ;; format for saving the buffer. To save a buffer in a different format,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
37 ;; change this variable, or use `format-write-file'.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
38 ;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
39 ;; Auto-save files are normally created in the same format as the visited
56980
1c1ca003ded1 (buffer-auto-save-file-format): Make it permanent local.
Luc Teirlinck <teirllm@auburn.edu>
parents: 55974
diff changeset
40 ;; file, but the variable `buffer-auto-save-file-format' can be set to a
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
41 ;; particularly fast or otherwise preferred format to be used for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
42 ;; auto-saving (or nil to do no encoding on auto-save files, but then you
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
43 ;; risk losing any text-properties in the buffer).
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
44 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
45 ;; You can manually translate a buffer into or out of a particular format
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
46 ;; with the functions `format-encode-buffer' and `format-decode-buffer'.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
47 ;; To translate just the region use the functions `format-encode-region'
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
48 ;; and `format-decode-region'.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
49 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
50 ;; You can define a new format by writing the encoding and decoding
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
51 ;; functions, and adding an entry to `format-alist'. See enriched.el for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
52 ;; an example of how to implement a file format. There are various
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
53 ;; functions defined in this file that may be useful for writing the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
54 ;; encoding and decoding functions:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
55 ;; * `format-annotate-region' and `format-deannotate-region' allow a
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
56 ;; single alist of information to be used for encoding and decoding.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
57 ;; The alist defines a correspondence between strings in the file
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
58 ;; ("annotations") and text-properties in the buffer.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
59 ;; * `format-replace-strings' is similarly useful for doing simple
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
60 ;; string->string translations in a reversible manner.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
61
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
62 ;;; Code:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
63
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
64 (put 'buffer-file-format 'permanent-local t)
56980
1c1ca003ded1 (buffer-auto-save-file-format): Make it permanent local.
Luc Teirlinck <teirllm@auburn.edu>
parents: 55974
diff changeset
65 (put 'buffer-auto-save-file-format 'permanent-local t)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
66
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
67 (defvar format-alist
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
68 ;; FIXME: maybe each item can be purecopied instead of just the strings.
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
69 `((text/enriched ,(purecopy "Extended MIME text/enriched format.")
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
70 ,(purecopy "Content-[Tt]ype:[ \t]*text/enriched")
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
71 enriched-decode enriched-encode t enriched-mode)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
72 (plain ,(purecopy "ISO 8859-1 standard format, no text properties.")
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
73 ;; Plain only exists so that there is an obvious neutral choice in
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
74 ;; the completion list.
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
75 nil nil nil nil nil)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
76 (TeX ,(purecopy "TeX (encoding)")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
77 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
78 iso-tex2iso iso-iso2tex t nil)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
79 (gtex ,(purecopy "German TeX (encoding)")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
80 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
81 iso-gtex2iso iso-iso2gtex t nil)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
82 (html ,(purecopy "HTML/SGML \"ISO 8879:1986//ENTITIES Added Latin 1//EN\" (encoding)")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
83 nil
28394
7640cbe85ab7 (format-alist): Use iso-cvt functions for SGML/HTML.
Dave Love <fx@gnu.org>
parents: 27793
diff changeset
84 iso-sgml2iso iso-iso2sgml t nil)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
85 (rot13 ,(purecopy "rot13")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
86 nil
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
87 ,(purecopy "tr a-mn-z n-za-m") ,(purecopy "tr a-mn-z n-za-m") t nil)
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
88 (duden ,(purecopy "Duden Ersatzdarstellung")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
89 nil
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
90 ,(purecopy "diac") iso-iso2duden t nil)
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
91 (de646 ,(purecopy "German ASCII (ISO 646)")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
92 nil
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
93 ,(purecopy "recode -f iso646-ge:latin1")
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
94 ,(purecopy "recode -f latin1:iso646-ge") t nil)
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
95 (denet ,(purecopy "net German")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
96 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
97 iso-german iso-cvt-read-only t nil)
105939
a0f778f4a995 * term/x-win.el (x-gtk-stock-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105609
diff changeset
98 (esnet ,(purecopy "net Spanish")
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
99 nil
18690
df8ab82c73f3 (format-alist): Don't handle compression here.
Richard M. Stallman <rms@gnu.org>
parents: 18140
diff changeset
100 iso-spanish iso-cvt-read-only t nil))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
101 "List of information about understood file formats.
99737
a04373604128 (format-alist, format-write-file): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 94678
diff changeset
102 Elements are of the form
a04373604128 (format-alist, format-write-file): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 94678
diff changeset
103 \(NAME DOC-STR REGEXP FROM-FN TO-FN MODIFY MODE-FN PRESERVE).
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
104
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
105 NAME is a symbol, which is stored in `buffer-file-format'.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
106
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
107 DOC-STR should be a single line providing more information about the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
108 format. It is currently unused, but in the future will be shown to
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
109 the user if they ask for more information.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
110
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
111 REGEXP is a regular expression to match against the beginning of the file;
104572
aa590c490d6f (format-alist): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 101345
diff changeset
112 it should match only files in that format. REGEXP may be nil, in
aa590c490d6f (format-alist): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 101345
diff changeset
113 which case the format will never be applied automatically to a file.
aa590c490d6f (format-alist): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 101345
diff changeset
114 Use this for formats that you only ever want to apply manually.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
115
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
116 FROM-FN is called to decode files in that format; it takes two args, BEGIN
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
117 and END, and can make any modifications it likes, returning the new
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
118 end. It must make sure that the beginning of the file no longer
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
119 matches REGEXP, or else it will get called again.
19245
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
120 Alternatively, FROM-FN can be a string, which specifies a shell command
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
121 (including options) to be used as a filter to perform the conversion.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
122
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
123 TO-FN is called to encode a region into that format; it takes three
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
124 arguments: BEGIN, END, and BUFFER. BUFFER is the original buffer that
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
125 the data being written came from, which the function could use, for
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
126 example, to find the values of local variables. TO-FN should either
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
127 return a list of annotations like `write-region-annotate-functions',
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
128 or modify the region and return the new end.
19245
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
129 Alternatively, TO-FN can be a string, which specifies a shell command
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
130 (including options) to be used as a filter to perform the conversion.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
131
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
132 MODIFY, if non-nil, means the TO-FN wants to modify the region. If nil,
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
133 TO-FN will not make any changes but will instead return a list of
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
134 annotations.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
135
38046
3a1a2ebbbcdc (format-alist): Doc fix. Suggested by Alex Schroeder <alex@gnu.org>.
Eli Zaretskii <eliz@gnu.org>
parents: 34170
diff changeset
136 MODE-FN, if specified, is called when visiting a file with that format.
3a1a2ebbbcdc (format-alist): Doc fix. Suggested by Alex Schroeder <alex@gnu.org>.
Eli Zaretskii <eliz@gnu.org>
parents: 34170
diff changeset
137 It is called with a single positive argument, on the assumption
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
138 that this would turn on some minor mode.
45749
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
139
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
140 PRESERVE, if non-nil, means that `format-write-file' should not remove
82811
b79364abcd62 (format-alist): Fix typo in doc-string.
Martin Rudalics <rudalics@gmx.at>
parents: 82312
diff changeset
141 this format from `buffer-file-format'.")
105609
bdcd73244f19 Convert comments about autoloads into autoload comments.
Glenn Morris <rgm@gnu.org>
parents: 104612
diff changeset
142 ;;;###autoload
104612
c220a29e75fd Define risky-local-variable property here rather than in files.el.
Glenn Morris <rgm@gnu.org>
parents: 104574
diff changeset
143 (put 'format-alist 'risky-local-variable t)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
144
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
145 ;;; Basic Functions (called from Lisp)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
146
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
147 (defun format-encode-run-method (method from to &optional buffer)
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
148 "Translate using METHOD the text from FROM to TO.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
149 If METHOD is a string, it is a shell command (including options);
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
150 otherwise, it should be a Lisp function.
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
151 BUFFER should be the buffer that the output originally came from."
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
152 (if (stringp method)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
153 (let ((error-buff (get-buffer-create "*Format Errors*"))
24347
eb03024d18fc (format-encode-run-method, format-decode-run-method): Fix previous change.
Dave Love <fx@gnu.org>
parents: 24315
diff changeset
154 (coding-system-for-read 'no-conversion)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
155 format-alist)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
156 (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
157 (widen)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
158 (erase-buffer))
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
159 (if (and (zerop (save-window-excursion
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
160 (shell-command-on-region from to method t t
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
161 error-buff)))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
162 ;; gzip gives zero exit status with bad args, for instance.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
163 (zerop (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
164 (buffer-size))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
165 (bury-buffer error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
166 (switch-to-buffer-other-window error-buff)
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
167 (error "Format encoding failed")))
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
168 (funcall method from to buffer)))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
169
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
170 (defun format-decode-run-method (method from to &optional buffer)
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
171 "Decode using METHOD the text from FROM to TO.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
172 If METHOD is a string, it is a shell command (including options); otherwise,
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
173 it should be a Lisp function. Decoding is done for the given BUFFER."
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
174 (if (stringp method)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
175 (let ((error-buff (get-buffer-create "*Format Errors*"))
24347
eb03024d18fc (format-encode-run-method, format-decode-run-method): Fix previous change.
Dave Love <fx@gnu.org>
parents: 24315
diff changeset
176 (coding-system-for-write 'no-conversion)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
177 format-alist)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
178 (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
179 (widen)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
180 (erase-buffer))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
181 ;; We should perhaps go via a temporary buffer and copy it
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
182 ;; back, in case of errors.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
183 (if (and (zerop (save-window-excursion
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
184 (shell-command-on-region (point-min) (point-max)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
185 method t t
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
186 error-buff)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
187 ;; gzip gives zero exit status with bad args, for instance.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
188 (zerop (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
189 (buffer-size))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
190 (bury-buffer error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
191 (switch-to-buffer-other-window error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
192 (error "Format decoding failed"))
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
193 (point))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
194 (funcall method from to)))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
195
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
196 (defun format-annotate-function (format from to orig-buf format-count)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
197 "Return annotations for writing region as FORMAT.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
198 FORMAT is a symbol naming one of the formats defined in `format-alist'.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
199 It must be a single symbol, not a list like `buffer-file-format'.
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
200 FROM and TO delimit the region to be operated on in the current buffer.
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
201 ORIG-BUF is the original buffer that the data came from.
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
202
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
203 FORMAT-COUNT is an integer specifying how many times this function has
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
204 been called in the process of decoding ORIG-BUF.
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
205
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
206 This function works like a function in `write-region-annotate-functions':
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
207 it either returns a list of annotations, or returns with a different buffer
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
208 current, which contains the modified text to write. In the latter case,
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
209 this function's value is nil.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
210
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
211 For most purposes, consider using `format-encode-region' instead."
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
212 ;; This function is called by write-region (actually
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
213 ;; build_annotations) for each element of buffer-file-format.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
214 (let* ((info (assq format format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
215 (to-fn (nth 4 info))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
216 (modify (nth 5 info)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
217 (if to-fn
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
218 (if modify
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
219 ;; To-function wants to modify region. Copy to safe place.
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
220 (let ((copy-buf (get-buffer-create (format " *Format Temp %d*"
45940
738d95b72204 (format-annotate-function): Copy multibyte flag
Richard M. Stallman <rms@gnu.org>
parents: 45749
diff changeset
221 format-count)))
738d95b72204 (format-annotate-function): Copy multibyte flag
Richard M. Stallman <rms@gnu.org>
parents: 45749
diff changeset
222 (sel-disp selective-display)
51001
9d852ed73287 (format-annotate-function): Copy coding system into the new temp buffer.
Juanma Barranquero <lekktu@gmail.com>
parents: 49588
diff changeset
223 (multibyte enable-multibyte-characters)
9d852ed73287 (format-annotate-function): Copy coding system into the new temp buffer.
Juanma Barranquero <lekktu@gmail.com>
parents: 49588
diff changeset
224 (coding-system buffer-file-coding-system))
45940
738d95b72204 (format-annotate-function): Copy multibyte flag
Richard M. Stallman <rms@gnu.org>
parents: 45749
diff changeset
225 (with-current-buffer copy-buf
738d95b72204 (format-annotate-function): Copy multibyte flag
Richard M. Stallman <rms@gnu.org>
parents: 45749
diff changeset
226 (setq selective-display sel-disp)
51001
9d852ed73287 (format-annotate-function): Copy coding system into the new temp buffer.
Juanma Barranquero <lekktu@gmail.com>
parents: 49588
diff changeset
227 (set-buffer-multibyte multibyte)
9d852ed73287 (format-annotate-function): Copy coding system into the new temp buffer.
Juanma Barranquero <lekktu@gmail.com>
parents: 49588
diff changeset
228 (setq buffer-file-coding-system coding-system))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
229 (copy-to-buffer copy-buf from to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
230 (set-buffer copy-buf)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
231 (format-insert-annotations write-region-annotations-so-far from)
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
232 (format-encode-run-method to-fn (point-min) (point-max) orig-buf)
106785
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
233 (when (buffer-live-p copy-buf)
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
234 (with-current-buffer copy-buf
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
235 ;; Set write-region-post-annotation-function to
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
236 ;; delete the buffer once the write is done, but do
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
237 ;; it after running to-fn so it doesn't affect
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
238 ;; write-region calls in to-fn.
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
239 (set (make-local-variable
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
240 'write-region-post-annotation-function)
a32698d5bb0c (format-annotate-function): Only set
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105939
diff changeset
241 'kill-buffer)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
242 nil)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
243 ;; Otherwise just call function, it will return annotations.
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
244 (funcall to-fn from to orig-buf)))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
245
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
246 (defun format-decode (format length &optional visit-flag)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
247 ;; This function is called by insert-file-contents whenever a file is read.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
248 "Decode text from any known FORMAT.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
249 FORMAT is a symbol appearing in `format-alist' or a list of such symbols,
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
250 or nil, in which case this function tries to guess the format of the data by
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
251 matching against the regular expressions in `format-alist'. After a match is
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
252 found and the region decoded, the alist is searched again from the beginning
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
253 for another match.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
254
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
255 Second arg LENGTH is the number of characters following point to operate on.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
256 If optional third arg VISIT-FLAG is true, set `buffer-file-format'
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
257 to the reverted list of formats used, and call any mode functions defined
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
258 for those formats.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
259
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
260 Return the new length of the decoded region.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
261
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
262 For most purposes, consider using `format-decode-region' instead."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
263 (let ((mod (buffer-modified-p))
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
264 (begin (point))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
265 (end (+ (point) length)))
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
266 (unwind-protect
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
267 (progn
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
268 ;; Don't record undo information for the decoding.
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48214
diff changeset
269
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
270 (if (null format)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
271 ;; Figure out which format it is in, remember list in `format'.
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
272 (let ((try format-alist))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
273 (while try
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
274 (let* ((f (car try))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
275 (regexp (nth 2 f))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
276 (p (point)))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
277 (if (and regexp (looking-at regexp)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
278 (< (match-end 0) (+ begin length)))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
279 (progn
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
280 (push (car f) format)
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
281 ;; Decode it
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
282 (if (nth 3 f)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
283 (setq end (format-decode-run-method (nth 3 f) begin end)))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
284 ;; Call visit function if required
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
285 (if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
286 ;; Safeguard against either of the functions changing pt.
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
287 (goto-char p)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
288 ;; Rewind list to look for another format
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
289 (setq try format-alist))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
290 (setq try (cdr try))))))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
291 ;; Deal with given format(s)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
292 (or (listp format) (setq format (list format)))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
293 (let ((do format) f)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
294 (while do
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
295 (or (setq f (assq (car do) format-alist))
53862
a1177e068d43 (format-decode): Fix format string.
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
296 (error "Unknown format %s" (car do)))
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
297 ;; Decode:
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
298 (if (nth 3 f)
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
299 (setq end (format-decode-run-method (nth 3 f) begin end)))
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
300 ;; Call visit function if required
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
301 (if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
302 (setq do (cdr do))))
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
303 ;; Encode in the opposite order.
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
304 (setq format (reverse format)))
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
305 (if visit-flag
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
306 (setq buffer-file-format format)))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48214
diff changeset
307
34170
019ee6a5a637 (format-decode): Don't change buffer's undo list.
Gerd Moellmann <gerd@gnu.org>
parents: 30926
diff changeset
308 (set-buffer-modified-p mod))
019ee6a5a637 (format-decode): Don't change buffer's undo list.
Gerd Moellmann <gerd@gnu.org>
parents: 30926
diff changeset
309
30926
ca900f999e04 (format-encode-run-method): Fix error message to say
Gerd Moellmann <gerd@gnu.org>
parents: 28394
diff changeset
310 ;; Return new length of region
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
311 (- end begin)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
312
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
313 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
314 ;;; Interactive functions & entry points
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
315 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
316
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
317 (defun format-decode-buffer (&optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
318 "Translate the buffer from some FORMAT.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
319 If the format is not specified, attempt a regexp-based guess.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
320 Set `buffer-file-format' to the format used, and call any
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
321 format-specific mode functions."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
322 (interactive
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64762
diff changeset
323 (list (format-read "Translate buffer from format (default guess): ")))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
324 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
325 (goto-char (point-min))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
326 (format-decode format (buffer-size) t)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
327
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
328 (defun format-decode-region (from to &optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
329 "Decode the region from some format.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
330 Arg FORMAT is optional; if omitted the format will be determined by looking
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
331 for identifying regular expressions at the beginning of the region."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
332 (interactive
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
333 (list (region-beginning) (region-end)
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64762
diff changeset
334 (format-read "Translate region from format (default guess): ")))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
335 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
336 (goto-char from)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
337 (format-decode format (- to from) nil)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
338
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
339 (defun format-encode-buffer (&optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
340 "Translate the buffer into FORMAT.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
341 FORMAT defaults to `buffer-file-format'. It is a symbol naming one of the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
342 formats defined in `format-alist', or a list of such symbols."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
343 (interactive
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
344 (list (format-read (format "Translate buffer to format (default %s): "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
345 buffer-file-format))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
346 (format-encode-region (point-min) (point-max) format))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
347
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
348 (defun format-encode-region (beg end &optional format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
349 "Translate the region into some FORMAT.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
350 FORMAT defaults to `buffer-file-format'. It is a symbol naming
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
351 one of the formats defined in `format-alist', or a list of such symbols."
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
352 (interactive
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
353 (list (region-beginning) (region-end)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
354 (format-read (format "Translate region to format (default %s): "
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
355 buffer-file-format))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
356 (if (null format) (setq format buffer-file-format))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
357 (if (symbolp format) (setq format (list format)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
358 (save-excursion
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
359 (goto-char end)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
360 (let ((cur-buf (current-buffer))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
361 (end (point-marker)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
362 (while format
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
363 (let* ((info (assq (car format) format-alist))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
364 (to-fn (nth 4 info))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
365 (modify (nth 5 info))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
366 result)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
367 (if to-fn
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
368 (if modify
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
369 (setq end (format-encode-run-method to-fn beg end
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
370 (current-buffer)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
371 (format-insert-annotations
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
372 (funcall to-fn beg end (current-buffer)))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
373 (setq format (cdr format)))))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
374
54708
dc6cd68555d1 (format-write-file): Add optional argument CONFIRM and make it behave
Luc Teirlinck <teirllm@auburn.edu>
parents: 54469
diff changeset
375 (defun format-write-file (filename format &optional confirm)
100110
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
376 "Write current buffer into FILENAME, using a format based on FORMAT.
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
377 Constructs the actual format starting from FORMAT, then appending
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
378 any elements from the value of `buffer-file-format' with a non-nil
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
379 `preserve' flag (see the documentation of `format-alist'), if they
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
380 are not already present in FORMAT. It then updates `buffer-file-format'
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
381 with this format, making it the default for future saves.
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
382
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
383 If the buffer is already visiting a file, you can specify a
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
384 directory name as FILENAME, to write a file of the same old name
99997
af179ae8c25b (format-write-file): Improve previous doc fix.
Glenn Morris <rgm@gnu.org>
parents: 99737
diff changeset
385 in that directory.
54708
dc6cd68555d1 (format-write-file): Add optional argument CONFIRM and make it behave
Luc Teirlinck <teirllm@auburn.edu>
parents: 54469
diff changeset
386
100110
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
387 If optional third arg CONFIRM is non-nil, asks for confirmation before
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
388 overwriting an existing file. Interactively, requires confirmation
02ed951e3c8f (format-write-file): Rewrite doc yet again.
Glenn Morris <rgm@gnu.org>
parents: 99997
diff changeset
389 unless you supply a prefix argument."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
390 (interactive
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
391 ;; Same interactive spec as write-file, plus format question.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
392 (let* ((file (if buffer-file-name
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
393 (read-file-name "Write file: "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
394 nil nil nil nil)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
395 (read-file-name "Write file: "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
396 (cdr (assq 'default-directory
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
397 (buffer-local-variables)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
398 nil nil (buffer-name))))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
399 (fmt (format-read (format "Write file `%s' in format: "
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
400 (file-name-nondirectory file)))))
54708
dc6cd68555d1 (format-write-file): Add optional argument CONFIRM and make it behave
Luc Teirlinck <teirllm@auburn.edu>
parents: 54469
diff changeset
401 (list file fmt (not current-prefix-arg))))
45749
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
402 (let ((old-formats buffer-file-format)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
403 preserve-formats)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
404 (dolist (fmt old-formats)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
405 (let ((aelt (assq fmt format-alist)))
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
406 (if (nth 7 aelt)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
407 (push fmt preserve-formats))))
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
408 (setq buffer-file-format format)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
409 (dolist (fmt preserve-formats)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
410 (unless (memq fmt buffer-file-format)
8dd957dbfbcc (format-alist): Document new element PRESERVE.
Richard M. Stallman <rms@gnu.org>
parents: 44377
diff changeset
411 (setq buffer-file-format (append buffer-file-format (list fmt))))))
54708
dc6cd68555d1 (format-write-file): Add optional argument CONFIRM and make it behave
Luc Teirlinck <teirllm@auburn.edu>
parents: 54469
diff changeset
412 (write-file filename confirm))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
413
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
414 (defun format-find-file (filename format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
415 "Find the file FILENAME using data format FORMAT.
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
416 If FORMAT is nil then do not do any format conversion."
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
417 (interactive
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
418 ;; Same interactive spec as write-file, plus format question.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
419 (let* ((file (read-file-name "Find file: "))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
420 (fmt (format-read (format "Read file `%s' in format: "
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
421 (file-name-nondirectory file)))))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
422 (list file fmt)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
423 (let ((format-alist nil))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
424 (find-file filename))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
425 (if format
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
426 (format-decode-buffer format)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
427
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
428 (defun format-insert-file (filename format &optional beg end)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
429 "Insert the contents of file FILENAME using data format FORMAT.
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
430 If FORMAT is nil then do not do any format conversion.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
431 The optional third and fourth arguments BEG and END specify
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
432 the part (in bytes) of the file to read.
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
433
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
434 The return value is like the value of `insert-file-contents':
54469
0610337ed9b5 (format-insert-file): Always return a list of two elements,
Luc Teirlinck <teirllm@auburn.edu>
parents: 53862
diff changeset
435 a list (ABSOLUTE-FILE-NAME SIZE)."
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
436 (interactive
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
437 ;; Same interactive spec as write-file, plus format question.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
438 (let* ((file (read-file-name "Find file: "))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
439 (fmt (format-read (format "Read file `%s' in format: "
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
440 (file-name-nondirectory file)))))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
441 (list file fmt)))
82312
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
442 (let (value size old-undo)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
443 ;; Record only one undo entry for the insertion. Inhibit point-motion and
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
444 ;; modification hooks as with `insert-file-contents'.
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
445 (let ((inhibit-point-motion-hooks t)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
446 (inhibit-modification-hooks t))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
447 ;; Don't bind `buffer-undo-list' to t here to assert that
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
448 ;; `insert-file-contents' may record whether the buffer was unmodified
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
449 ;; before.
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
450 (let ((format-alist nil))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
451 (setq value (insert-file-contents filename nil beg end))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
452 (setq size (nth 1 value)))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
453 (when (consp buffer-undo-list)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
454 (let ((head (car buffer-undo-list)))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
455 (when (and (consp head)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
456 (equal (car head) (point))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
457 (equal (cdr head) (+ (point) size)))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
458 ;; Remove first entry from `buffer-undo-list', we shall insert
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
459 ;; another one below.
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
460 (setq old-undo (cdr buffer-undo-list)))))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
461 (when format
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
462 (let ((buffer-undo-list t))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
463 (setq size (format-decode format size)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
464 value (list (car value) size)))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
465 (unless (eq buffer-undo-list t)
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
466 (setq buffer-undo-list
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
467 (cons (cons (point) (+ (point) size)) old-undo)))))
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
468 (unless inhibit-modification-hooks
f285691bc158 (format-insert-file): Make sure that at most one undo
Martin Rudalics <rudalics@gmx.at>
parents: 78236
diff changeset
469 (run-hook-with-args 'after-change-functions (point) (+ (point) size) 0))
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
470 value))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
471
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
472 (defun format-read (&optional prompt)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
473 "Read and return the name of a format.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
474 Return value is a list, like `buffer-file-format'; it may be nil.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
475 Formats are defined in `format-alist'. Optional arg is the PROMPT to use."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
476 (let* ((table (mapcar (lambda (x) (list (symbol-name (car x))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
477 format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
478 (ans (completing-read (or prompt "Format: ") table nil t)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
479 (if (not (equal "" ans)) (list (intern ans)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
480
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
481
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
482 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
483 ;;; Below are some functions that may be useful in writing encoding and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
484 ;;; decoding functions for use in format-alist.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
485 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
486
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
487 (defun format-replace-strings (alist &optional reverse beg end)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
488 "Do multiple replacements on the buffer.
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
489 ALIST is a list of (FROM . TO) pairs, which should be proper arguments to
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
490 `search-forward' and `replace-match', respectively.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
491 Optional second arg REVERSE, if non-nil, means the pairs are (TO . FROM),
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
492 so that you can use the same list in both directions if it contains only
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
493 literal strings.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
494 Optional args BEG and END specify a region of the buffer on which to operate."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
495 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
496 (save-restriction
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
497 (or beg (setq beg (point-min)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
498 (if end (narrow-to-region (point-min) end))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
499 (while alist
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
500 (let ((from (if reverse (cdr (car alist)) (car (car alist))))
24315
382a7de604b6 (format-replace-strings): Fix value of TO in REVERSE case.
Richard M. Stallman <rms@gnu.org>
parents: 24156
diff changeset
501 (to (if reverse (car (car alist)) (cdr (car alist)))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
502 (goto-char beg)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
503 (while (search-forward from nil t)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
504 (goto-char (match-beginning 0))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
505 (insert to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
506 (set-text-properties (- (point) (length to)) (point)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
507 (text-properties-at (point)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
508 (delete-region (point) (+ (point) (- (match-end 0)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
509 (match-beginning 0)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
510 (setq alist (cdr alist)))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
511
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
512 ;;; Some list-manipulation functions that we need.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
513
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
514 (defun format-delq-cons (cons list)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
515 "Remove the given CONS from LIST by side effect and return the new LIST.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
516 Since CONS could be the first element of LIST, write
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
517 `\(setq foo \(format-delq-cons element foo))' to be sure of changing
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
518 the value of `foo'."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
519 (if (eq cons list)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
520 (cdr list)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
521 (let ((p list))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
522 (while (not (eq (cdr p) cons))
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 38046
diff changeset
523 (if (null p) (error "format-delq-cons: not an element"))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
524 (setq p (cdr p)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
525 ;; Now (cdr p) is the cons to delete
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
526 (setcdr p (cdr cons))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
527 list)))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48214
diff changeset
528
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
529 (defun format-make-relatively-unique (a b)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
530 "Delete common elements of lists A and B, return as pair.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
531 Compare using `equal'."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
532 (let* ((acopy (copy-sequence a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
533 (bcopy (copy-sequence b))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
534 (tail acopy))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
535 (while tail
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
536 (let ((dup (member (car tail) bcopy))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
537 (next (cdr tail)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
538 (if dup (setq acopy (format-delq-cons tail acopy)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
539 bcopy (format-delq-cons dup bcopy)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
540 (setq tail next)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
541 (cons acopy bcopy)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
542
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
543 (defun format-common-tail (a b)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
544 "Given two lists that have a common tail, return it.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
545 Compare with `equal', and return the part of A that is equal to the
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
546 equivalent part of B. If even the last items of the two are not equal,
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
547 return nil."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
548 (let ((la (length a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
549 (lb (length b)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
550 ;; Make sure they are the same length
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
551 (if (> la lb)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
552 (setq a (nthcdr (- la lb) a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
553 (setq b (nthcdr (- lb la) b))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
554 (while (not (equal a b))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
555 (setq a (cdr a)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
556 b (cdr b)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
557 a)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
558
27793
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
559 (defun format-proper-list-p (list)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
560 "Return t if LIST is a proper list.
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
561 A proper list is a list ending with a nil cdr, not with an atom "
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
562 (when (listp list)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
563 (while (consp list)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
564 (setq list (cdr list)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
565 (null list)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
566
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
567 (defun format-reorder (items order)
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
568 "Arrange ITEMS to follow partial ORDER.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
569 Elements of ITEMS equal to elements of ORDER will be rearranged
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
570 to follow the ORDER. Unmatched items will go last."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
571 (if order
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
572 (let ((item (member (car order) items)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
573 (if item
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
574 (cons (car item)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
575 (format-reorder (format-delq-cons item items)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
576 (cdr order)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
577 (format-reorder items (cdr order))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
578 items))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
579
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
580 (put 'face 'format-list-valued t) ; These text-properties take values
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
581 (put 'unknown 'format-list-valued t) ; that are lists, the elements of which
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
582 ; should be considered separately.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
583 ; See format-deannotate-region and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
584 ; format-annotate-region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
585
24983
583275537b14 (top-level): Give `display' property `format-list-atomic-p.
Gerd Moellmann <gerd@gnu.org>
parents: 24347
diff changeset
586 ;; This text property has list values, but they are treated atomically.
583275537b14 (top-level): Give `display' property `format-list-atomic-p.
Gerd Moellmann <gerd@gnu.org>
parents: 24347
diff changeset
587
583275537b14 (top-level): Give `display' property `format-list-atomic-p.
Gerd Moellmann <gerd@gnu.org>
parents: 24347
diff changeset
588 (put 'display 'format-list-atomic-p t)
583275537b14 (top-level): Give `display' property `format-list-atomic-p.
Gerd Moellmann <gerd@gnu.org>
parents: 24347
diff changeset
589
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
590 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
591 ;;; Decoding
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
592 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
593
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
594 (defun format-deannotate-region (from to translations next-fn)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
595 "Translate annotations in the region into text properties.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
596 This sets text properties between FROM to TO as directed by the
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
597 TRANSLATIONS and NEXT-FN arguments.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
598
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
599 NEXT-FN is a function that searches forward from point for an annotation.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
600 It should return a list of 4 elements: \(BEGIN END NAME POSITIVE). BEGIN and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
601 END are buffer positions bounding the annotation, NAME is the name searched
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
602 for in TRANSLATIONS, and POSITIVE should be non-nil if this annotation marks
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
603 the beginning of a region with some property, or nil if it ends the region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
604 NEXT-FN should return nil if there are no annotations after point.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
605
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
606 The basic format of the TRANSLATIONS argument is described in the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
607 documentation for the `format-annotate-region' function. There are some
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
608 additional things to keep in mind for decoding, though:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
609
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
610 When an annotation is found, the TRANSLATIONS list is searched for a
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
611 text-property name and value that corresponds to that annotation. If the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
612 text-property has several annotations associated with it, it will be used only
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
613 if the other annotations are also in effect at that point. The first match
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
614 found whose annotations are all present is used.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
615
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
616 The text property thus determined is set to the value over the region between
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
617 the opening and closing annotations. However, if the text-property name has a
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
618 non-nil `format-list-valued' property, then the value will be consed onto the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
619 surrounding value of the property, rather than replacing that value.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
620
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
621 There are some special symbols that can be used in the \"property\" slot of
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
622 the TRANSLATIONS list: PARAMETER and FUNCTION \(spelled in uppercase).
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
623 Annotations listed under the pseudo-property PARAMETER are considered to be
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
624 arguments of the immediately surrounding annotation; the text between the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
625 opening and closing parameter annotations is deleted from the buffer but saved
44377
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
626 as a string.
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
627
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
628 The surrounding annotation should be listed under the pseudo-property
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
629 FUNCTION. Instead of inserting a text-property for this annotation,
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
630 the function listed in the VALUE slot is called to make whatever
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
631 changes are appropriate. It can also return a list of the form
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
632 \(START LOC PROP VALUE) which specifies a property to put on. The
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
633 function's first two arguments are the START and END locations, and
7c3b2b1a90ac (format-deannotate-region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 42546
diff changeset
634 the rest of the arguments are any PARAMETERs found in that region.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
635
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
636 Any annotations that are found by NEXT-FN but not defined by TRANSLATIONS
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
637 are saved as values of the `unknown' text-property \(which is list-valued).
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
638 The TRANSLATIONS list should usually contain an entry of the form
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
639 \(unknown \(nil format-annotate-value))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
640 to write these unknown annotations back into the file."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
641 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
642 (save-restriction
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
643 (narrow-to-region (point-min) to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
644 (goto-char from)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
645 (let (next open-ans todo loc unknown-ans)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
646 (while (setq next (funcall next-fn))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
647 (let* ((loc (nth 0 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
648 (end (nth 1 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
649 (name (nth 2 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
650 (positive (nth 3 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
651 (found nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
652
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
653 ;; Delete the annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
654 (delete-region loc end)
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
655 (cond
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
656 ;; Positive annotations are stacked, remembering location
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
657 (positive (push `(,name ((,loc . nil))) open-ans))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
658 ;; It is a negative annotation:
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
659 ;; Close the top annotation & add its text property.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
660 ;; If the file's nesting is messed up, the close might not match
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
661 ;; the top thing on the open-annotations stack.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
662 ;; If no matching annotation is open, just ignore the close.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
663 ((not (assoc name open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
664 (message "Extra closing annotation (%s) in file" name))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
665 ;; If one is open, but not on the top of the stack, close
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
666 ;; the things in between as well. Set `found' when the real
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
667 ;; one is closed.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
668 (t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
669 (while (not found)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
670 (let* ((top (car open-ans)) ; first on stack: should match.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
671 (top-name (car top)) ; text property name
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
672 (top-extents (nth 1 top)) ; property regions
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
673 (params (cdr (cdr top))) ; parameters
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
674 (aalist translations)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
675 (matched nil))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
676 (if (equal name top-name)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
677 (setq found t)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
678 (message "Improper nesting in file."))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
679 ;; Look through property names in TRANSLATIONS
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
680 (while aalist
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
681 (let ((prop (car (car aalist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
682 (alist (cdr (car aalist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
683 ;; And look through values for each property
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
684 (while alist
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
685 (let ((value (car (car alist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
686 (ans (cdr (car alist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
687 (if (member top-name ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
688 ;; This annotation is listed, but still have to
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
689 ;; check if multiple annotations are satisfied
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
690 (if (member nil (mapcar (lambda (r)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
691 (assoc r open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
692 ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
693 nil ; multiple ans not satisfied
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
694 ;; If there are multiple annotations going
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
695 ;; into one text property, split up the other
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
696 ;; annotations so they apply individually to
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
697 ;; the other regions.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
698 (setcdr (car top-extents) loc)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
699 (let ((to-split ans) this-one extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
700 (while to-split
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
701 (setq this-one
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
702 (assoc (car to-split) open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
703 extents (nth 1 this-one))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
704 (if (not (eq this-one top))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
705 (setcar (cdr this-one)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
706 (format-subtract-regions
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
707 extents top-extents)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
708 (setq to-split (cdr to-split))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
709 ;; Set loop variables to nil so loop
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
710 ;; will exit.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
711 (setq alist nil aalist nil matched t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
712 ;; pop annotation off stack.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
713 open-ans (cdr open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
714 (let ((extents top-extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
715 (start (car (car top-extents)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
716 (loc (cdr (car top-extents))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
717 (while extents
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
718 (cond
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
719 ;; Check for pseudo-properties
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
720 ((eq prop 'PARAMETER)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
721 ;; A parameter of the top open ann:
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
722 ;; delete text and use as arg.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
723 (if open-ans
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
724 ;; (If nothing open, discard).
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
725 (setq open-ans
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
726 (cons
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
727 (append (car open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
728 (list
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
729 (buffer-substring
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
730 start loc)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
731 (cdr open-ans))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
732 (delete-region start loc))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
733 ((eq prop 'FUNCTION)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
734 ;; Not a property, but a function.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
735 (let ((rtn
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
736 (apply value start loc params)))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
737 (if rtn (push rtn todo))))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
738 (t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
739 ;; Normal property/value pair
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
740 (setq todo
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
741 (cons (list start loc prop value)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
742 todo))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
743 (setq extents (cdr extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
744 start (car (car extents))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
745 loc (cdr (car extents))))))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
746 (setq alist (cdr alist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
747 (setq aalist (cdr aalist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
748 (if (not matched)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
749 ;; Didn't find any match for the annotation:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
750 ;; Store as value of text-property `unknown'.
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
751 (let ((extents top-extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
752 (start (car (car top-extents)))
20087
3a72c0f0ad69 (format-deannotate-region): In case of unmatched tags,
Karl Heuer <kwzh@gnu.org>
parents: 19631
diff changeset
753 (loc (or (cdr (car top-extents)) loc)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
754 (while extents
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
755 (setq open-ans (cdr open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
756 todo (cons (list start loc 'unknown top-name)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
757 todo)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
758 unknown-ans (cons name unknown-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
759 extents (cdr extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
760 start (car (car extents))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
761 loc (cdr (car extents))))))))))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
762
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
763 ;; Once entire file has been scanned, add the properties.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
764 (while todo
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
765 (let* ((item (car todo))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
766 (from (nth 0 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
767 (to (nth 1 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
768 (prop (nth 2 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
769 (val (nth 3 item)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
770
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
771 (if (numberp val) ; add to ambient value if numeric
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
772 (format-property-increment-region from to prop val 0)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
773 (put-text-property
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
774 from to prop
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
775 (cond ((get prop 'format-list-valued) ; value gets consed onto
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
776 ; list-valued properties
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
777 (let ((prev (get-text-property from prop)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
778 (cons val (if (listp prev) prev (list prev)))))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
779 (t val))))) ; normally, just set to val.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
780 (setq todo (cdr todo)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
781
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
782 (if unknown-ans
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
783 (message "Unknown annotations: %s" unknown-ans))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
784
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
785 (defun format-subtract-regions (minu subtra)
55974
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
786 "Remove from the regions in MINUEND the regions in SUBTRAHEND.
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
787 A region is a dotted pair (FROM . TO). Both parameters are lists of
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
788 regions. Each list must contain nonoverlapping, noncontiguous
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
789 regions, in descending order. The result is also nonoverlapping,
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
790 noncontiguous, and in descending order. The first element of MINUEND
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
791 can have a cdr of nil, indicating that the end of that region is not
55974
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
792 yet known.
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
793
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
794 \(fn MINUEND SUBTRAHEND)"
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
795 (let* ((minuend (copy-alist minu))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
796 (subtrahend (copy-alist subtra))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
797 (m (car minuend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
798 (s (car subtrahend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
799 results)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
800 (while (and minuend subtrahend)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
801 (cond
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
802 ;; The minuend starts after the subtrahend ends; keep it.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
803 ((> (car m) (cdr s))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
804 (push m results)
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
805 (setq minuend (cdr minuend)
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
806 m (car minuend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
807 ;; The minuend extends beyond the end of the subtrahend. Chop it off.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
808 ((or (null (cdr m)) (> (cdr m) (cdr s)))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
809 (push (cons (1+ (cdr s)) (cdr m)) results)
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
810 (setcdr m (cdr s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
811 ;; The subtrahend starts after the minuend ends; throw it away.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
812 ((< (cdr m) (car s))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
813 (setq subtrahend (cdr subtrahend) s (car subtrahend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
814 ;; The subtrahend extends beyond the end of the minuend. Chop it off.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
815 (t ;(<= (cdr m) (cdr s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
816 (if (>= (car m) (car s))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
817 (setq minuend (cdr minuend) m (car minuend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
818 (setcdr m (1- (car s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
819 (setq subtrahend (cdr subtrahend) s (car subtrahend))))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
820 (nconc (nreverse results) minuend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
821
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
822 ;; This should probably go somewhere other than format.el. Then again,
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
823 ;; indent.el has alter-text-property. NOTE: We can also use
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
824 ;; next-single-property-change instead of text-property-not-all, but then
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
825 ;; we have to see if we passed TO.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
826 (defun format-property-increment-region (from to prop delta default)
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
827 "In the region from FROM to TO increment property PROP by amount DELTA.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
828 DELTA may be negative. If property PROP is nil anywhere
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
829 in the region, it is treated as though it were DEFAULT."
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
830 (let ((cur from) val newval next)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
831 (while cur
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
832 (setq val (get-text-property cur prop)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
833 newval (+ (or val default) delta)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
834 next (text-property-not-all cur to prop val))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
835 (put-text-property cur (or next to) prop newval)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
836 (setq cur next))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
837
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
838 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
839 ;;; Encoding
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
840 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
841
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
842 (defun format-insert-annotations (list &optional offset)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
843 "Apply list of annotations to buffer as `write-region' would.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
844 Insert each element of the given LIST of buffer annotations at its
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
845 appropriate place. Use second arg OFFSET if the annotations' locations are
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
846 not relative to the beginning of the buffer: annotations will be inserted
55974
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
847 at their location-OFFSET+1 \(ie, the offset is treated as the position of
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
848 the first character in the buffer)."
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
849 (if (not offset)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
850 (setq offset 0)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
851 (setq offset (1- offset)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
852 (let ((l (reverse list)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
853 (while l
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
854 (goto-char (- (car (car l)) offset))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
855 (insert (cdr (car l)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
856 (setq l (cdr l)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
857
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
858 (defun format-annotate-value (old new)
42470
fd37f9aafadc Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
859 "Return OLD and NEW as a \(CLOSE . OPEN) annotation pair.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
860 Useful as a default function for TRANSLATIONS alist when the value of the text
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
861 property is the name of the annotation that you want to use, as it is for the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
862 `unknown' text property."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
863 (cons (if old (list old))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
864 (if new (list new))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
865
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
866 (defun format-annotate-region (from to translations format-fn ignore)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
867 "Generate annotations for text properties in the region.
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
868 Search for changes between FROM and TO, and describe them with a list of
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
869 annotations as defined by alist TRANSLATIONS and FORMAT-FN. IGNORE lists text
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
870 properties not to consider; any text properties that are neither ignored nor
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
871 listed in TRANSLATIONS are warned about.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
872 If you actually want to modify the region, give the return value of this
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
873 function to `format-insert-annotations'.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
874
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
875 Format of the TRANSLATIONS argument:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
876
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
877 Each element is a list whose car is a PROPERTY, and the following
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
878 elements have the form (VALUE ANNOTATIONS...).
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
879 Whenever the property takes on the value VALUE, the annotations
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
880 \(as formatted by FORMAT-FN) are inserted into the file.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
881 When the property stops having that value, the matching negated annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
882 will be inserted \(it may actually be closed earlier and reopened, if
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
883 necessary, to keep proper nesting).
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
884
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
885 If VALUE is a list, then each element of the list is dealt with
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
886 separately.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
887
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
888 If a VALUE is numeric, then it is assumed that there is a single annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
889 and each occurrence of it increments the value of the property by that number.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
890 Thus, given the entry \(left-margin \(4 \"indent\")), if the left margin
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
891 changes from 4 to 12, two <indent> annotations will be generated.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
892
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
893 If the VALUE is nil, then instead of annotations, a function should be
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
894 specified. This function is used as a default: it is called for all
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
895 transitions not explicitly listed in the table. The function is called with
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
896 two arguments, the OLD and NEW values of the property. It should return
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
897 a cons cell (CLOSE . OPEN) as `format-annotate-single-property-change' does.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
898
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
899 The same TRANSLATIONS structure can be used in reverse for reading files."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
900 (let ((all-ans nil) ; All annotations - becomes return value
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
901 (open-ans nil) ; Annotations not yet closed
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
902 (loc nil) ; Current location
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
903 (not-found nil)) ; Properties that couldn't be saved
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
904 (while (or (null loc)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
905 (and (setq loc (next-property-change loc nil to))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
906 (< loc to)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
907 (or loc (setq loc from))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
908 (let* ((ans (format-annotate-location loc (= loc from) ignore translations))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
909 (neg-ans (format-reorder (aref ans 0) open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
910 (pos-ans (aref ans 1))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
911 (ignored (aref ans 2)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
912 (setq not-found (append ignored not-found)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
913 ignore (append ignored ignore))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
914 ;; First do the negative (closing) annotations
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
915 (while neg-ans
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
916 ;; Check if it's missing. This can happen (eg, a numeric property
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
917 ;; going negative can generate closing annotations before there are
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
918 ;; any open). Warn user & ignore.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
919 (if (not (member (car neg-ans) open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
920 (message "Can't close %s: not open." (car neg-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
921 (while (not (equal (car neg-ans) (car open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
922 ;; To close anno. N, need to first close ans 1 to N-1,
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
923 ;; remembering to re-open them later.
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
924 (push (car open-ans) pos-ans)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
925 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
926 (cons (cons loc (funcall format-fn (car open-ans) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
927 all-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
928 (setq open-ans (cdr open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
929 ;; Now remove the one we're really interested in from open list.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
930 (setq open-ans (cdr open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
931 ;; And put the closing annotation here.
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
932 (push (cons loc (funcall format-fn (car neg-ans) nil))
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
933 all-ans))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
934 (setq neg-ans (cdr neg-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
935 ;; Now deal with positive (opening) annotations
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
936 (let ((p pos-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
937 (while pos-ans
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
938 (push (car pos-ans) open-ans)
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
939 (push (cons loc (funcall format-fn (car pos-ans) t))
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
940 all-ans)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
941 (setq pos-ans (cdr pos-ans))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
942
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
943 ;; Close any annotations still open
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
944 (while open-ans
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
945 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
946 (cons (cons to (funcall format-fn (car open-ans) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
947 all-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
948 (setq open-ans (cdr open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
949 (if not-found
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
950 (message "These text properties could not be saved:\n %s"
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
951 not-found))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
952 (nreverse all-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
953
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
954 ;;; Internal functions for format-annotate-region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
955
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
956 (defun format-annotate-location (loc all ignore translations)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
957 "Return annotation(s) needed at location LOC.
55974
b8d3cea56c44 (format-insert-annotations, format-annotate-location): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 54708
diff changeset
958 This includes any properties that change between LOC - 1 and LOC.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
959 If ALL is true, don't look at previous location, but generate annotations for
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
960 all non-nil properties.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
961 Third argument IGNORE is a list of text-properties not to consider.
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
962 Use the TRANSLATIONS alist (see `format-annotate-region' for doc).
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
963
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
964 Return value is a vector of 3 elements:
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
965 1. List of annotations to close
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
966 2. List of annotations to open.
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
967 3. List of properties that were ignored or couldn't be annotated.
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
968
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
969 The annotations in lists 1 and 2 need not be strings.
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
970 They can be whatever the FORMAT-FN in `format-annotate-region'
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
971 can handle. If that is `enriched-make-annotation', they can be
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
972 either strings, or lists of the form (PARAMETER VALUE)."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
973 (let* ((prev-loc (1- loc))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
974 (before-plist (if all nil (text-properties-at prev-loc)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
975 (after-plist (text-properties-at loc))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
976 p negatives positives prop props not-found)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
977 ;; make list of all property names involved
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
978 (setq p before-plist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
979 (while p
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
980 (if (not (memq (car p) props))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
981 (push (car p) props))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
982 (setq p (cdr (cdr p))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
983 (setq p after-plist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
984 (while p
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
985 (if (not (memq (car p) props))
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
986 (push (car p) props))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
987 (setq p (cdr (cdr p))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
988
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
989 (while props
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
990 (setq prop (pop props))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
991 (if (memq prop ignore)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
992 nil ; If it's been ignored before, ignore it now.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
993 (let ((before (if all nil (car (cdr (memq prop before-plist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
994 (after (car (cdr (memq prop after-plist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
995 (if (equal before after)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
996 nil ; no change; ignore
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
997 (let ((result (format-annotate-single-property-change
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
998 prop before after translations)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
999 (if (not result)
48214
22a18a9dae2a (format-decode): Be careful with the order in `format'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45940
diff changeset
1000 (push prop not-found)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1001 (setq negatives (nconc negatives (car result))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1002 positives (nconc positives (cdr result)))))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1003 (vector negatives positives not-found)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1004
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1005 (defun format-annotate-single-property-change (prop old new translations)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
1006 "Return annotations for property PROP changing from OLD to NEW.
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1007 These are searched for in the translations alist TRANSLATIONS
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1008 (see `format-annotate-region' for the format).
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
1009 If NEW does not appear in the list, but there is a default function,
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
1010 then call that function.
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
1011 Return a cons of the form (CLOSE . OPEN)
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1012 where CLOSE is a list of annotations to close
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1013 and OPEN is a list of annotations to open.
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1014
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1015 The annotations in CLOSE and OPEN need not be strings.
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1016 They can be whatever the FORMAT-FN in `format-annotate-region'
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1017 can handle. If that is `enriched-make-annotation', they can be
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1018 either strings, or lists of the form (PARAMETER VALUE)."
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1019
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1020 (let ((prop-alist (cdr (assoc prop translations)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1021 default)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1022 (if (not prop-alist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1023 nil
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1024 ;; If either old or new is a list, have to treat both that way.
27793
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1025 (if (and (or (listp old) (listp new))
24983
583275537b14 (top-level): Give `display' property `format-list-atomic-p.
Gerd Moellmann <gerd@gnu.org>
parents: 24347
diff changeset
1026 (not (get prop 'format-list-atomic-p)))
27793
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1027 (if (or (not (format-proper-list-p old))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1028 (not (format-proper-list-p new)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1029 (format-annotate-atomic-property-change prop-alist old new)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1030 (let* ((old (if (listp old) old (list old)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1031 (new (if (listp new) new (list new)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1032 (tail (format-common-tail old new))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1033 close open)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1034 (while old
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1035 (setq close
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1036 (append (car (format-annotate-atomic-property-change
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1037 prop-alist (car old) nil))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1038 close)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1039 old (cdr old)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1040 (while new
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1041 (setq open
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1042 (append (cdr (format-annotate-atomic-property-change
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1043 prop-alist nil (car new)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1044 open)
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1045 new (cdr new)))
d1722c46d998 (format-annotate-single-property-change): Handle
Gerd Moellmann <gerd@gnu.org>
parents: 24983
diff changeset
1046 (format-make-relatively-unique close open)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1047 (format-annotate-atomic-property-change prop-alist old new)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1048
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1049 (defun format-annotate-atomic-property-change (prop-alist old new)
72247
2d16125405b4 Docstring style and grammar tweaks; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68651
diff changeset
1050 "Internal function to annotate a single property change.
42546
a5795efa232a (format-replace-strings, format-subtract-regions)
Richard M. Stallman <rms@gnu.org>
parents: 42470
diff changeset
1051 PROP-ALIST is the relevant element of a TRANSLATIONS list.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1052 OLD and NEW are the values."
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1053 (let (num-ann)
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1054 ;; If old and new values are numbers,
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1055 ;; look for a number in PROP-ALIST.
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
1056 (if (and (or (null old) (numberp old))
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
1057 (or (null new) (numberp new)))
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1058 (progn
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1059 (setq num-ann prop-alist)
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1060 (while (and num-ann (not (numberp (car (car num-ann)))))
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1061 (setq num-ann (cdr num-ann)))))
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1062 (if num-ann
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
1063 ;; Numerical annotation - use difference
19359
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1064 (progn
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1065 ;; If property is numeric, nil means 0
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1066 (cond ((and (numberp old) (null new))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1067 (setq new 0))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1068 ((and (numberp new) (null old))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1069 (setq old 0)))
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
1070
19359
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1071 (let* ((entry (car num-ann))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1072 (increment (car entry))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1073 (n (ceiling (/ (float (- new old)) (float increment))))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1074 (anno (car (cdr entry))))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1075 (if (> n 0)
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1076 (cons nil (make-list n anno))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
1077 (cons (make-list (- n) anno) nil))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1078
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1079 ;; Standard annotation
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
1080 (let ((close (and old (cdr (assoc old prop-alist))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1081 (open (and new (cdr (assoc new prop-alist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1082 (if (or close open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1083 (format-make-relatively-unique close open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1084 ;; Call "Default" function, if any
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1085 (let ((default (assq nil prop-alist)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1086 (if default
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1087 (funcall (car (cdr default)) old new))))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
1088
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
1089 (provide 'format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
1090
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91327
diff changeset
1091 ;; arch-tag: c387e9c7-a93d-47bf-89bc-8ca67e96755a
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
1092 ;;; format.el ends here