annotate man/forms.texi @ 29005:b396df3a5181

(ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to CODING_FINISH_INSUFFICIENT_SRC if there's not enough source. (ONE_MORE_CHAR, EMIT_CHAR, EMIT_ONE_BYTE, EMIT_TWO_BYTE, EMIT_BYTES): New macros. (THREE_MORE_BYTES, DECODE_CHARACTER_ASCII, DECODE_CHARACTER_DIMENSION1, DECODE_CHARACTER_DIMENSION2): These macros deleted. (CHECK_CODE_RANGE_A0_FF): This macro deleted. (detect_coding_emacs_mule): Use UNIBYTE_STR_AS_MULTIBYTE_P to check the validity of multibyte sequence. (decode_coding_emacs_mule): New function. (encode_coding_emacs_mule): New macro. (detect_coding_iso2022): Use ONE_MORE_BYTE to fetch a byte from the source. (DECODE_ISO_CHARACTER): Just return a character code. (DECODE_COMPOSITION_START): Set coding->result instead of result. (decode_coding_iso2022, decode_coding_sjis_big5, decode_eol): Use EMIT_CHAR to produced decoded characters. Exit the loop only by macros ONE_MORE_BYTE or EMIT_CHAR. Don't handle the case of last block here. (ENCODE_ISO_CHARACTER): Don't translate character here. Produce only position codes for an invalid character. (encode_designation_at_bol): Return new destination pointer. 5th arg DSTP is changed to DST. (encode_coding_iso2022, decode_coding_sjis_big5): Get a character from the source by ONE_MORE_CHAR. Don't handle the case of last block here. (DECODE_SJIS_BIG5_CHARACTER, ENCODE_SJIS_BIG5_CHARACTER): These macros deleted. (detect_coding_sjis, detect_coding_big5, detect_coding_utf_8, detect_coding_utf_16, detect_coding_ccl): Use ONE_MORE_BYTE and TWO_MORE_BYTES to fetch a byte from the source. (encode_eol): Pay attention to coding->src_multibyte. (detect_coding, detect_eol): Preserve members src_multibyte and dst_multibyte. (DECODING_BUFFER_MAG): Return 2 even for coding_type_raw_text. (encoding_buffer_size): Set magnification to 3 for all coding systems that require encoding. (ccl_coding_driver): For decoding, be sure that the result is valid multibyte sequence. (decode_coding): Initialize coding->errors and coding->result. For emacs-mule, call decode_coding_emacs_mule. For no-conversion and raw-text, always call decode_eol. Handle the case of last block here. If not coding->dst_multibyte, convert the resulting sequence to unibyte. (encode_coding): Initialize coding->errors and coding->result. For emacs-mule, call encode_coding_emacs_mule. For no-conversion and raw-text, always call encode_eol. Handle the case of last block here. (shrink_decoding_region, shrink_encoding_region): Detect cases that we can't skip data more rigidly. (code_convert_region): Setup src_multibyte and dst_multibyte members of coding. For decoding, if the buffer is multibyte, convert the source sequence to unibyte in advance. For encoding, if the buffer is multibyte, convert the resulting sequence to multibyte afterward. (run_pre_post_conversion_on_str): New function. (code_convert_string): Deleted and divided into the following two. (decode_coding_string, encode_coding_string): New functions. (code_convert_string1, code_convert_string_norecord): Call one of above. (Fdecode_sjis_char, Fdecode_big5_char): Use MAKE_CHAR instead of MAKE_NON_ASCII_CHAR. (Fset_terminal_coding_system_internal, Fset_safe_terminal_coding_system_internal): Setup src_multibyte and dst_multibyte members. (init_coding_once): Initialize iso_code_class with new enum ISO_control_0 and ISO_control_1.
author Kenichi Handa <handa@m17n.org>
date Fri, 19 May 2000 23:54:56 +0000
parents ac7e9e5e2ccb
children 95bdbefcdac6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25829
Dave Love <fx@gnu.org>
parents:
diff changeset
1 \input texinfo @c -*-texinfo-*-
Dave Love <fx@gnu.org>
parents:
diff changeset
2 @c documentation for forms-mode
Dave Love <fx@gnu.org>
parents:
diff changeset
3 @c Written by Johan Vromans, and edited by Richard Stallman
Dave Love <fx@gnu.org>
parents:
diff changeset
4
Dave Love <fx@gnu.org>
parents:
diff changeset
5 @comment %**start of header (This is for running Texinfo on a region.)
Dave Love <fx@gnu.org>
parents:
diff changeset
6 @setfilename ../info/forms
Dave Love <fx@gnu.org>
parents:
diff changeset
7 @settitle Forms Mode User's Manual
Dave Love <fx@gnu.org>
parents:
diff changeset
8 @syncodeindex vr cp
Dave Love <fx@gnu.org>
parents:
diff changeset
9 @syncodeindex fn cp
Dave Love <fx@gnu.org>
parents:
diff changeset
10 @syncodeindex ky cp
Dave Love <fx@gnu.org>
parents:
diff changeset
11 @iftex
Dave Love <fx@gnu.org>
parents:
diff changeset
12 @finalout
Dave Love <fx@gnu.org>
parents:
diff changeset
13 @setchapternewpage odd
Dave Love <fx@gnu.org>
parents:
diff changeset
14 @end iftex
Dave Love <fx@gnu.org>
parents:
diff changeset
15 @c @smallbook
Dave Love <fx@gnu.org>
parents:
diff changeset
16 @comment %**end of header (This is for running Texinfo on a region.)
Dave Love <fx@gnu.org>
parents:
diff changeset
17
Dave Love <fx@gnu.org>
parents:
diff changeset
18 @dircategory Editors
Dave Love <fx@gnu.org>
parents:
diff changeset
19 @direntry
Dave Love <fx@gnu.org>
parents:
diff changeset
20 * Forms: (forms). Emacs package for editing data bases
Dave Love <fx@gnu.org>
parents:
diff changeset
21 by filling in forms.
Dave Love <fx@gnu.org>
parents:
diff changeset
22 @end direntry
Dave Love <fx@gnu.org>
parents:
diff changeset
23
Dave Love <fx@gnu.org>
parents:
diff changeset
24 @ifinfo
Dave Love <fx@gnu.org>
parents:
diff changeset
25 This file documents Forms mode, a form-editing major mode for GNU Emacs.
Dave Love <fx@gnu.org>
parents:
diff changeset
26
Dave Love <fx@gnu.org>
parents:
diff changeset
27 Permission is granted to make and distribute verbatim copies of this
Dave Love <fx@gnu.org>
parents:
diff changeset
28 manual provided the copyright notice and this permission notice are
Dave Love <fx@gnu.org>
parents:
diff changeset
29 preserved on all copies.
Dave Love <fx@gnu.org>
parents:
diff changeset
30
Dave Love <fx@gnu.org>
parents:
diff changeset
31 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
32 Permission is granted to process this file through TeX and print the
Dave Love <fx@gnu.org>
parents:
diff changeset
33 results, provided the printed document carries copying permission notice
Dave Love <fx@gnu.org>
parents:
diff changeset
34 identical to this one except for the removal of this paragraph (this
Dave Love <fx@gnu.org>
parents:
diff changeset
35 paragraph not being relevant to the printed manual).
Dave Love <fx@gnu.org>
parents:
diff changeset
36
Dave Love <fx@gnu.org>
parents:
diff changeset
37 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
38 @end ifinfo
Dave Love <fx@gnu.org>
parents:
diff changeset
39
Dave Love <fx@gnu.org>
parents:
diff changeset
40 @iftex
Dave Love <fx@gnu.org>
parents:
diff changeset
41 @titlepage
Dave Love <fx@gnu.org>
parents:
diff changeset
42 @sp 6
Dave Love <fx@gnu.org>
parents:
diff changeset
43 @center @titlefont{Forms Mode User's Manual}
Dave Love <fx@gnu.org>
parents:
diff changeset
44 @sp 4
Dave Love <fx@gnu.org>
parents:
diff changeset
45 @center Forms-Mode version 2
Dave Love <fx@gnu.org>
parents:
diff changeset
46 @sp 1
Dave Love <fx@gnu.org>
parents:
diff changeset
47 @center for GNU Emacs 20.1
Dave Love <fx@gnu.org>
parents:
diff changeset
48 @sp 1
Dave Love <fx@gnu.org>
parents:
diff changeset
49 @center June 1997
Dave Love <fx@gnu.org>
parents:
diff changeset
50 @sp 5
Dave Love <fx@gnu.org>
parents:
diff changeset
51 @center Johan Vromans
Dave Love <fx@gnu.org>
parents:
diff changeset
52 @center @i{jvromans@@squirrel.nl}
Dave Love <fx@gnu.org>
parents:
diff changeset
53 @page
Dave Love <fx@gnu.org>
parents:
diff changeset
54
Dave Love <fx@gnu.org>
parents:
diff changeset
55 @vskip 0pt plus 1filll
Dave Love <fx@gnu.org>
parents:
diff changeset
56 Copyright @copyright{} 1989, 1997 Free Software Foundation, Inc.
Dave Love <fx@gnu.org>
parents:
diff changeset
57
Dave Love <fx@gnu.org>
parents:
diff changeset
58 Permission is granted to make and distribute verbatim copies of
Dave Love <fx@gnu.org>
parents:
diff changeset
59 this manual provided the copyright notice and this permission notice
Dave Love <fx@gnu.org>
parents:
diff changeset
60 are preserved on all copies.
Dave Love <fx@gnu.org>
parents:
diff changeset
61 @page
Dave Love <fx@gnu.org>
parents:
diff changeset
62 @end titlepage
Dave Love <fx@gnu.org>
parents:
diff changeset
63 @end iftex
Dave Love <fx@gnu.org>
parents:
diff changeset
64
Dave Love <fx@gnu.org>
parents:
diff changeset
65 @ifinfo
Dave Love <fx@gnu.org>
parents:
diff changeset
66 @node Top
Dave Love <fx@gnu.org>
parents:
diff changeset
67 @top Forms Mode
Dave Love <fx@gnu.org>
parents:
diff changeset
68
Dave Love <fx@gnu.org>
parents:
diff changeset
69 Forms mode is an Emacs major mode for working with simple textual data
Dave Love <fx@gnu.org>
parents:
diff changeset
70 bases in a forms-oriented manner. In Forms mode, the information in
Dave Love <fx@gnu.org>
parents:
diff changeset
71 these files is presented in an Emacs window in a user-defined format,
Dave Love <fx@gnu.org>
parents:
diff changeset
72 one record at a time. The user can view records or modify their
Dave Love <fx@gnu.org>
parents:
diff changeset
73 contents.
Dave Love <fx@gnu.org>
parents:
diff changeset
74
Dave Love <fx@gnu.org>
parents:
diff changeset
75 Forms mode is not a simple major mode, but requires two files to do its
Dave Love <fx@gnu.org>
parents:
diff changeset
76 job: a control file and a data file. The data file holds the
Dave Love <fx@gnu.org>
parents:
diff changeset
77 actual data to be presented. The control file describes
Dave Love <fx@gnu.org>
parents:
diff changeset
78 how to present it.
Dave Love <fx@gnu.org>
parents:
diff changeset
79
Dave Love <fx@gnu.org>
parents:
diff changeset
80 @menu
Dave Love <fx@gnu.org>
parents:
diff changeset
81 * Forms Example:: An example: editing the password data base.
Dave Love <fx@gnu.org>
parents:
diff changeset
82 * Entering and Exiting Forms Mode::
Dave Love <fx@gnu.org>
parents:
diff changeset
83 How to visit a file in Forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
84 * Forms Commands:: Special commands to use while in Forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
85 * Data File Format:: How to format the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
86 * Control File Format:: How to control forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
87 * Format Description:: How to define the forms layout.
Dave Love <fx@gnu.org>
parents:
diff changeset
88 * Modifying Forms Contents:: How to modify.
Dave Love <fx@gnu.org>
parents:
diff changeset
89 * Miscellaneous:: Forms mode messages and other remarks.
Dave Love <fx@gnu.org>
parents:
diff changeset
90 * Error Messages:: List of error messages forms mode can produce.
Dave Love <fx@gnu.org>
parents:
diff changeset
91 * Long Example:: A more complex control file example.
Dave Love <fx@gnu.org>
parents:
diff changeset
92 * Credits:: Thanks everyone.
Dave Love <fx@gnu.org>
parents:
diff changeset
93 * Index:: Index to this manual.
Dave Love <fx@gnu.org>
parents:
diff changeset
94 @end menu
Dave Love <fx@gnu.org>
parents:
diff changeset
95 @end ifinfo
Dave Love <fx@gnu.org>
parents:
diff changeset
96
Dave Love <fx@gnu.org>
parents:
diff changeset
97 @node Forms Example
Dave Love <fx@gnu.org>
parents:
diff changeset
98 @chapter Forms Example
Dave Love <fx@gnu.org>
parents:
diff changeset
99
Dave Love <fx@gnu.org>
parents:
diff changeset
100 Let's illustrate Forms mode with an example. Suppose you are looking at
Dave Love <fx@gnu.org>
parents:
diff changeset
101 the @file{/etc/passwd} file, and the screen looks like this:
Dave Love <fx@gnu.org>
parents:
diff changeset
102
Dave Love <fx@gnu.org>
parents:
diff changeset
103 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
104 ====== /etc/passwd ======
Dave Love <fx@gnu.org>
parents:
diff changeset
105
Dave Love <fx@gnu.org>
parents:
diff changeset
106 User : root Uid: 0 Gid: 1
Dave Love <fx@gnu.org>
parents:
diff changeset
107
Dave Love <fx@gnu.org>
parents:
diff changeset
108 Name : Super User
Dave Love <fx@gnu.org>
parents:
diff changeset
109
Dave Love <fx@gnu.org>
parents:
diff changeset
110 Home : /
Dave Love <fx@gnu.org>
parents:
diff changeset
111
Dave Love <fx@gnu.org>
parents:
diff changeset
112 Shell: /bin/sh
Dave Love <fx@gnu.org>
parents:
diff changeset
113 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
114
Dave Love <fx@gnu.org>
parents:
diff changeset
115 As you can see, the familiar fields from the entry for the super user
Dave Love <fx@gnu.org>
parents:
diff changeset
116 are all there, but instead of being colon-separated on one single line,
Dave Love <fx@gnu.org>
parents:
diff changeset
117 they make up a forms.
Dave Love <fx@gnu.org>
parents:
diff changeset
118
Dave Love <fx@gnu.org>
parents:
diff changeset
119 The contents of the forms consist of the contents of the fields of the
Dave Love <fx@gnu.org>
parents:
diff changeset
120 record (e.g. @samp{root}, @samp{0}, @samp{1}, @samp{Super User})
Dave Love <fx@gnu.org>
parents:
diff changeset
121 interspersed with normal text (e.g @samp{User : }, @samp{Uid: }).
Dave Love <fx@gnu.org>
parents:
diff changeset
122
Dave Love <fx@gnu.org>
parents:
diff changeset
123 If you modify the contents of the fields, Forms mode will analyze your
Dave Love <fx@gnu.org>
parents:
diff changeset
124 changes and update the file appropriately. You cannot modify the
Dave Love <fx@gnu.org>
parents:
diff changeset
125 interspersed explanatory text (unless you go to some trouble about it),
Dave Love <fx@gnu.org>
parents:
diff changeset
126 because that is marked read-only (@pxref{Text Properties,,, elisp, The
Dave Love <fx@gnu.org>
parents:
diff changeset
127 Emacs Lisp Reference Manual}).
Dave Love <fx@gnu.org>
parents:
diff changeset
128
Dave Love <fx@gnu.org>
parents:
diff changeset
129 The Forms mode control file specifies the relationship between the
Dave Love <fx@gnu.org>
parents:
diff changeset
130 format of @file{/etc/passwd} and what appears on the screen in Forms
Dave Love <fx@gnu.org>
parents:
diff changeset
131 mode. @xref{Control File Format}.
Dave Love <fx@gnu.org>
parents:
diff changeset
132
Dave Love <fx@gnu.org>
parents:
diff changeset
133 @node Entering and Exiting Forms Mode
Dave Love <fx@gnu.org>
parents:
diff changeset
134 @chapter Entering and Exiting Forms Mode
Dave Love <fx@gnu.org>
parents:
diff changeset
135
Dave Love <fx@gnu.org>
parents:
diff changeset
136 @table @kbd
Dave Love <fx@gnu.org>
parents:
diff changeset
137 @findex forms-find-file
Dave Love <fx@gnu.org>
parents:
diff changeset
138 @item M-x forms-find-file @key{RET} @var{control-file} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
139 Visit a database using Forms mode. Specify the name of the
Dave Love <fx@gnu.org>
parents:
diff changeset
140 @strong{control file}, not the data file!
Dave Love <fx@gnu.org>
parents:
diff changeset
141
Dave Love <fx@gnu.org>
parents:
diff changeset
142 @findex forms-find-file-other-window
Dave Love <fx@gnu.org>
parents:
diff changeset
143 @item M-x forms-find-file-other-window @key{RET} @var{control-file} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
144 Similar, but displays the file in another window.
Dave Love <fx@gnu.org>
parents:
diff changeset
145 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
146
Dave Love <fx@gnu.org>
parents:
diff changeset
147 The command @code{forms-find-file} evaluates the file
Dave Love <fx@gnu.org>
parents:
diff changeset
148 @var{control-file}, and also visits it in Forms mode. What you see in
Dave Love <fx@gnu.org>
parents:
diff changeset
149 its buffer is not the contents of this file, but rather a single record
Dave Love <fx@gnu.org>
parents:
diff changeset
150 of the corresponding data file that is visited in its own buffer. So
Dave Love <fx@gnu.org>
parents:
diff changeset
151 there are two buffers involved in Forms mode: the @dfn{forms buffer}
Dave Love <fx@gnu.org>
parents:
diff changeset
152 that is initially used to visit the control file and that shows the
Dave Love <fx@gnu.org>
parents:
diff changeset
153 records being browsed, and the @dfn{data buffer} that holds the data
Dave Love <fx@gnu.org>
parents:
diff changeset
154 file being visited. The latter buffer is normally not visible.
Dave Love <fx@gnu.org>
parents:
diff changeset
155
Dave Love <fx@gnu.org>
parents:
diff changeset
156 Initially, the first record is displayed in the forms buffer.
Dave Love <fx@gnu.org>
parents:
diff changeset
157 The mode line displays the major mode name @samp{Forms}, followed by the
Dave Love <fx@gnu.org>
parents:
diff changeset
158 minor mode @samp{View} if the data base is read-only. The number of the
Dave Love <fx@gnu.org>
parents:
diff changeset
159 current record (@var{n}) and the total number of records in the
Dave Love <fx@gnu.org>
parents:
diff changeset
160 file(@var{t}) are shown in the mode line as @samp{@var{n}/@var{t}}. For
Dave Love <fx@gnu.org>
parents:
diff changeset
161 example:
Dave Love <fx@gnu.org>
parents:
diff changeset
162
Dave Love <fx@gnu.org>
parents:
diff changeset
163 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
164 --%%-Emacs: passwd-demo (Forms View 1/54)----All-------
Dave Love <fx@gnu.org>
parents:
diff changeset
165 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
166
Dave Love <fx@gnu.org>
parents:
diff changeset
167 If the buffer is not read-only, you may change the buffer to modify the
Dave Love <fx@gnu.org>
parents:
diff changeset
168 fields in the record. When you move to a different record, the contents
Dave Love <fx@gnu.org>
parents:
diff changeset
169 of the buffer are parsed using the specifications in
Dave Love <fx@gnu.org>
parents:
diff changeset
170 @code{forms-format-list}, and the data file is updated. If the record
Dave Love <fx@gnu.org>
parents:
diff changeset
171 has fields that aren't included in the display, they are not changed.
Dave Love <fx@gnu.org>
parents:
diff changeset
172
Dave Love <fx@gnu.org>
parents:
diff changeset
173 @vindex forms-mode-hooks
Dave Love <fx@gnu.org>
parents:
diff changeset
174 Entering Forms mode runs the normal hook @code{forms-mode-hooks} to
Dave Love <fx@gnu.org>
parents:
diff changeset
175 perform user-defined customization.
Dave Love <fx@gnu.org>
parents:
diff changeset
176
Dave Love <fx@gnu.org>
parents:
diff changeset
177 To save any modified data, you can use @kbd{C-x C-s}
Dave Love <fx@gnu.org>
parents:
diff changeset
178 (@code{forms-save-buffer}). This does not save the forms buffer (which would
Dave Love <fx@gnu.org>
parents:
diff changeset
179 be rather useless), but instead saves the buffer visiting the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
180
Dave Love <fx@gnu.org>
parents:
diff changeset
181 To terminate Forms mode, you can use @kbd{C-x C-s} (@code{forms-save-buffer})
Dave Love <fx@gnu.org>
parents:
diff changeset
182 and then kill the forms buffer. However, the data buffer will still
Dave Love <fx@gnu.org>
parents:
diff changeset
183 remain. If this is not desired, you have to kill this buffer too.
Dave Love <fx@gnu.org>
parents:
diff changeset
184
Dave Love <fx@gnu.org>
parents:
diff changeset
185 @node Forms Commands
Dave Love <fx@gnu.org>
parents:
diff changeset
186 @chapter Forms Commands
Dave Love <fx@gnu.org>
parents:
diff changeset
187
Dave Love <fx@gnu.org>
parents:
diff changeset
188 The commands of Forms mode belong to the @kbd{C-c} prefix, with one
Dave Love <fx@gnu.org>
parents:
diff changeset
189 exception: @key{TAB}, which moves to the next field. Forms mode uses
Dave Love <fx@gnu.org>
parents:
diff changeset
190 different key maps for normal mode and read-only mode. In read-only
Dave Love <fx@gnu.org>
parents:
diff changeset
191 Forms mode, you can access most of the commands without the @kbd{C-c}
Dave Love <fx@gnu.org>
parents:
diff changeset
192 prefix, but you must type ordinary letters instead of control
Dave Love <fx@gnu.org>
parents:
diff changeset
193 characters; for example, type @kbd{n} instead of @kbd{C-c C-n}.
Dave Love <fx@gnu.org>
parents:
diff changeset
194
Dave Love <fx@gnu.org>
parents:
diff changeset
195 If your Emacs has been built with X-toolkit support, Forms mode will
Dave Love <fx@gnu.org>
parents:
diff changeset
196 provide its own menu with a number of Forms mode commands.
Dave Love <fx@gnu.org>
parents:
diff changeset
197
Dave Love <fx@gnu.org>
parents:
diff changeset
198 @table @kbd
Dave Love <fx@gnu.org>
parents:
diff changeset
199 @findex forms-next-record
Dave Love <fx@gnu.org>
parents:
diff changeset
200 @kindex C-c C-n
Dave Love <fx@gnu.org>
parents:
diff changeset
201 @item C-c C-n
Dave Love <fx@gnu.org>
parents:
diff changeset
202 Show the next record (@code{forms-next-record}). With a numeric
Dave Love <fx@gnu.org>
parents:
diff changeset
203 argument @var{n}, show the @var{n}th next record.
Dave Love <fx@gnu.org>
parents:
diff changeset
204
Dave Love <fx@gnu.org>
parents:
diff changeset
205 @findex forms-prev-record
Dave Love <fx@gnu.org>
parents:
diff changeset
206 @kindex C-c C-p
Dave Love <fx@gnu.org>
parents:
diff changeset
207 @item C-c C-p
Dave Love <fx@gnu.org>
parents:
diff changeset
208 Show the previous record (@code{forms-prev-record}). With a numeric
Dave Love <fx@gnu.org>
parents:
diff changeset
209 argument @var{n}, show the @var{n}th previous record.
Dave Love <fx@gnu.org>
parents:
diff changeset
210
Dave Love <fx@gnu.org>
parents:
diff changeset
211 @findex forms-jump-record
Dave Love <fx@gnu.org>
parents:
diff changeset
212 @kindex C-c C-l
Dave Love <fx@gnu.org>
parents:
diff changeset
213 @item C-c C-l
Dave Love <fx@gnu.org>
parents:
diff changeset
214 Jump to a record by number (@code{forms-jump-record}). Specify
Dave Love <fx@gnu.org>
parents:
diff changeset
215 the record number with a numeric argument.
Dave Love <fx@gnu.org>
parents:
diff changeset
216
Dave Love <fx@gnu.org>
parents:
diff changeset
217 @findex forms-first-record
Dave Love <fx@gnu.org>
parents:
diff changeset
218 @kindex C-c <
Dave Love <fx@gnu.org>
parents:
diff changeset
219 @item C-c <
Dave Love <fx@gnu.org>
parents:
diff changeset
220 Jump to the first record (@code{forms-first-record}).
Dave Love <fx@gnu.org>
parents:
diff changeset
221
Dave Love <fx@gnu.org>
parents:
diff changeset
222 @findex forms-last-record
Dave Love <fx@gnu.org>
parents:
diff changeset
223 @kindex C-c >
Dave Love <fx@gnu.org>
parents:
diff changeset
224 @item C-c >
Dave Love <fx@gnu.org>
parents:
diff changeset
225 Jump to the last record (@code{forms-last-record}). This command also
Dave Love <fx@gnu.org>
parents:
diff changeset
226 recalculates the number of records in the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
227
Dave Love <fx@gnu.org>
parents:
diff changeset
228 @findex forms-next-field
Dave Love <fx@gnu.org>
parents:
diff changeset
229 @kindex TAB
Dave Love <fx@gnu.org>
parents:
diff changeset
230 @item @key{TAB}
Dave Love <fx@gnu.org>
parents:
diff changeset
231 @kindex C-c TAB
Dave Love <fx@gnu.org>
parents:
diff changeset
232 @itemx C-c @key{TAB}
Dave Love <fx@gnu.org>
parents:
diff changeset
233 Jump to the next field in the current record (@code{forms-next-field}).
Dave Love <fx@gnu.org>
parents:
diff changeset
234 With a numeric argument @var{n}, jump forward @var{n} fields. If this command
Dave Love <fx@gnu.org>
parents:
diff changeset
235 would move past the last field, it wraps around to the first field.
Dave Love <fx@gnu.org>
parents:
diff changeset
236
Dave Love <fx@gnu.org>
parents:
diff changeset
237 @findex forms-toggle-read-only
Dave Love <fx@gnu.org>
parents:
diff changeset
238 @kindex C-c C-q
Dave Love <fx@gnu.org>
parents:
diff changeset
239 @item C-c C-q
Dave Love <fx@gnu.org>
parents:
diff changeset
240 Toggles read-only mode (@code{forms-toggle-read-only}). In read-only
Dave Love <fx@gnu.org>
parents:
diff changeset
241 Forms mode, you cannot edit the fields; most Forms mode commands can be
Dave Love <fx@gnu.org>
parents:
diff changeset
242 accessed without the prefix @kbd{C-c} if you use the normal letter
Dave Love <fx@gnu.org>
parents:
diff changeset
243 instead (for example, type @kbd{n} instead of @kbd{C-c C-n}). In edit
Dave Love <fx@gnu.org>
parents:
diff changeset
244 mode, you can edit the fields and thus change the contents of the data
Dave Love <fx@gnu.org>
parents:
diff changeset
245 base; you must begin Forms mode commands with @code{C-c}. Switching
Dave Love <fx@gnu.org>
parents:
diff changeset
246 to edit mode is allowed only if you have write access to the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
247
Dave Love <fx@gnu.org>
parents:
diff changeset
248 @findex forms-insert-record
Dave Love <fx@gnu.org>
parents:
diff changeset
249 @kindex C-c C-o
Dave Love <fx@gnu.org>
parents:
diff changeset
250 @item C-c C-o
Dave Love <fx@gnu.org>
parents:
diff changeset
251 Create a new record and insert it before the current record
Dave Love <fx@gnu.org>
parents:
diff changeset
252 (@code{forms-insert-record}). It starts out with empty (or default)
Dave Love <fx@gnu.org>
parents:
diff changeset
253 contents for its fields; you can then edit the fields. With a numeric
Dave Love <fx@gnu.org>
parents:
diff changeset
254 argument, the new record is created @emph{after} the current one.
Dave Love <fx@gnu.org>
parents:
diff changeset
255 See also @code{forms-modified-record-filter} in @ref{Modifying Forms
Dave Love <fx@gnu.org>
parents:
diff changeset
256 Contents}.
Dave Love <fx@gnu.org>
parents:
diff changeset
257
Dave Love <fx@gnu.org>
parents:
diff changeset
258 @findex forms-delete-record
Dave Love <fx@gnu.org>
parents:
diff changeset
259 @kindex C-c C-k
Dave Love <fx@gnu.org>
parents:
diff changeset
260 @item C-c C-k
Dave Love <fx@gnu.org>
parents:
diff changeset
261 Delete the current record (@code{forms-delete-record}). You are
Dave Love <fx@gnu.org>
parents:
diff changeset
262 prompted for confirmation before the record is deleted unless a numeric
Dave Love <fx@gnu.org>
parents:
diff changeset
263 argument has been provided.
Dave Love <fx@gnu.org>
parents:
diff changeset
264
Dave Love <fx@gnu.org>
parents:
diff changeset
265 @findex forms-search-forward
Dave Love <fx@gnu.org>
parents:
diff changeset
266 @kindex C-c C-s @var{regexp} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
267 @item C-c C-s @var{regexp} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
268 Search forward for @var{regexp} in all records following this one
Dave Love <fx@gnu.org>
parents:
diff changeset
269 (@code{forms-search-forward}). If found, this record is shown.
Dave Love <fx@gnu.org>
parents:
diff changeset
270 If you give an empty argument, the previous regexp is used again.
Dave Love <fx@gnu.org>
parents:
diff changeset
271
Dave Love <fx@gnu.org>
parents:
diff changeset
272 @findex forms-search-backward
Dave Love <fx@gnu.org>
parents:
diff changeset
273 @kindex C-c C-r @var{regexp} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
274 @item C-c C-r @var{regexp} @key{RET}
Dave Love <fx@gnu.org>
parents:
diff changeset
275 Search backward for @var{regexp} in all records following this one
Dave Love <fx@gnu.org>
parents:
diff changeset
276 (@code{forms-search-backward}). If found, this record is shown.
Dave Love <fx@gnu.org>
parents:
diff changeset
277 If you give an empty argument, the previous regexp is used again.
Dave Love <fx@gnu.org>
parents:
diff changeset
278
Dave Love <fx@gnu.org>
parents:
diff changeset
279 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
280 @findex forms-exit
Dave Love <fx@gnu.org>
parents:
diff changeset
281 @kindex C-c C-x
Dave Love <fx@gnu.org>
parents:
diff changeset
282 @item C-c C-x
Dave Love <fx@gnu.org>
parents:
diff changeset
283 Terminate Forms mode processing (@code{forms-exit}). The data file is
Dave Love <fx@gnu.org>
parents:
diff changeset
284 saved if it has been modified.
Dave Love <fx@gnu.org>
parents:
diff changeset
285
Dave Love <fx@gnu.org>
parents:
diff changeset
286 @findex forms-exit-no-save
Dave Love <fx@gnu.org>
parents:
diff changeset
287 @item M-x forms-exit-no-save
Dave Love <fx@gnu.org>
parents:
diff changeset
288 Terminates forms mode processing without saving modified data first.
Dave Love <fx@gnu.org>
parents:
diff changeset
289 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
290
Dave Love <fx@gnu.org>
parents:
diff changeset
291 @findex forms-prev-field
Dave Love <fx@gnu.org>
parents:
diff changeset
292 @item M-x forms-prev-field
Dave Love <fx@gnu.org>
parents:
diff changeset
293 Similar to @code{forms-next-field} but moves backwards.
Dave Love <fx@gnu.org>
parents:
diff changeset
294
Dave Love <fx@gnu.org>
parents:
diff changeset
295 @findex forms-save-buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
296 @item M-x forms-save-buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
297 @kindex C-x C-s
Dave Love <fx@gnu.org>
parents:
diff changeset
298 @itemx C-x C-s
Dave Love <fx@gnu.org>
parents:
diff changeset
299 Forms mode replacement for @code{save-buffer}. When executed in the
Dave Love <fx@gnu.org>
parents:
diff changeset
300 forms buffer it will save the contents of the (modified) data buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
301 instead. In Forms mode this function will be bound to @kbd{C-x C-s}.
Dave Love <fx@gnu.org>
parents:
diff changeset
302
Dave Love <fx@gnu.org>
parents:
diff changeset
303 @findex forms-print
Dave Love <fx@gnu.org>
parents:
diff changeset
304 @item M-x forms-print
Dave Love <fx@gnu.org>
parents:
diff changeset
305 This command can be used to make a formatted print
Dave Love <fx@gnu.org>
parents:
diff changeset
306 of the contents of the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
307
Dave Love <fx@gnu.org>
parents:
diff changeset
308 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
309
Dave Love <fx@gnu.org>
parents:
diff changeset
310 In addition the command @kbd{M-x revert-buffer} is useful in Forms mode
Dave Love <fx@gnu.org>
parents:
diff changeset
311 just as in other modes.
Dave Love <fx@gnu.org>
parents:
diff changeset
312
Dave Love <fx@gnu.org>
parents:
diff changeset
313 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
314 @vindex forms-forms-scroll
Dave Love <fx@gnu.org>
parents:
diff changeset
315 @findex scroll-up
Dave Love <fx@gnu.org>
parents:
diff changeset
316 @findex scroll-down
Dave Love <fx@gnu.org>
parents:
diff changeset
317 If the variable @code{forms-forms-scrolls} is set to a value other
Dave Love <fx@gnu.org>
parents:
diff changeset
318 than @code{nil} (which it is, by default), the Emacs functions
Dave Love <fx@gnu.org>
parents:
diff changeset
319 @code{scroll-up} and @code{scroll-down} will perform a
Dave Love <fx@gnu.org>
parents:
diff changeset
320 @code{forms-next-record} and @code{forms-prev-record} when in forms
Dave Love <fx@gnu.org>
parents:
diff changeset
321 mode. So you can use your favourite page commands to page through the
Dave Love <fx@gnu.org>
parents:
diff changeset
322 data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
323
Dave Love <fx@gnu.org>
parents:
diff changeset
324 @vindex forms-forms-jump
Dave Love <fx@gnu.org>
parents:
diff changeset
325 @findex beginning-of-buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
326 @findex end-of-buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
327 Likewise, if the variable @code{forms-forms-jump} is not @code{nil}
Dave Love <fx@gnu.org>
parents:
diff changeset
328 (which it is, by default), Emacs functions @code{beginning-of-buffer}
Dave Love <fx@gnu.org>
parents:
diff changeset
329 and @code{end-of-buffer} will perform @code{forms-first-record} and
Dave Love <fx@gnu.org>
parents:
diff changeset
330 @code{forms-last-record} when in forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
331 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
332
Dave Love <fx@gnu.org>
parents:
diff changeset
333 The following function key definitions are set up in Forms mode
Dave Love <fx@gnu.org>
parents:
diff changeset
334 (whether read-only or not):
Dave Love <fx@gnu.org>
parents:
diff changeset
335
Dave Love <fx@gnu.org>
parents:
diff changeset
336 @table @kbd
Dave Love <fx@gnu.org>
parents:
diff changeset
337 @kindex next
Dave Love <fx@gnu.org>
parents:
diff changeset
338 @item next
Dave Love <fx@gnu.org>
parents:
diff changeset
339 forms-next-record
Dave Love <fx@gnu.org>
parents:
diff changeset
340
Dave Love <fx@gnu.org>
parents:
diff changeset
341 @kindex prior
Dave Love <fx@gnu.org>
parents:
diff changeset
342 @item prior
Dave Love <fx@gnu.org>
parents:
diff changeset
343 forms-prev-record
Dave Love <fx@gnu.org>
parents:
diff changeset
344
Dave Love <fx@gnu.org>
parents:
diff changeset
345 @kindex begin
Dave Love <fx@gnu.org>
parents:
diff changeset
346 @item begin
Dave Love <fx@gnu.org>
parents:
diff changeset
347 forms-first-record
Dave Love <fx@gnu.org>
parents:
diff changeset
348
Dave Love <fx@gnu.org>
parents:
diff changeset
349 @kindex end
Dave Love <fx@gnu.org>
parents:
diff changeset
350 @item end
Dave Love <fx@gnu.org>
parents:
diff changeset
351 forms-last-record
Dave Love <fx@gnu.org>
parents:
diff changeset
352
Dave Love <fx@gnu.org>
parents:
diff changeset
353 @kindex S-Tab
Dave Love <fx@gnu.org>
parents:
diff changeset
354 @findex forms-prev-field
Dave Love <fx@gnu.org>
parents:
diff changeset
355 @item S-Tab
Dave Love <fx@gnu.org>
parents:
diff changeset
356 forms-prev-field
Dave Love <fx@gnu.org>
parents:
diff changeset
357 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
358
Dave Love <fx@gnu.org>
parents:
diff changeset
359 @node Data File Format
Dave Love <fx@gnu.org>
parents:
diff changeset
360 @chapter Data File Format
Dave Love <fx@gnu.org>
parents:
diff changeset
361
Dave Love <fx@gnu.org>
parents:
diff changeset
362 @cindex record
Dave Love <fx@gnu.org>
parents:
diff changeset
363 @cindex field
Dave Love <fx@gnu.org>
parents:
diff changeset
364 @vindex forms-field-sep
Dave Love <fx@gnu.org>
parents:
diff changeset
365 Files for use with Forms mode are very simple---each @dfn{record}
Dave Love <fx@gnu.org>
parents:
diff changeset
366 (usually one line) forms the contents of one form. Each record consists
Dave Love <fx@gnu.org>
parents:
diff changeset
367 of a number of @dfn{fields}, which are separated by the value of the
Dave Love <fx@gnu.org>
parents:
diff changeset
368 string @code{forms-field-sep}, which is @code{"\t"} (a Tab) by default.
Dave Love <fx@gnu.org>
parents:
diff changeset
369
Dave Love <fx@gnu.org>
parents:
diff changeset
370 @vindex forms-read-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
371 @vindex forms-write-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
372 If the format of the data file is not suitable enough you can define the
Dave Love <fx@gnu.org>
parents:
diff changeset
373 filter functions @code{forms-read-file-filter} and
Dave Love <fx@gnu.org>
parents:
diff changeset
374 @code{forms-write-file-filter}. @code{forms-read-file-filter} is called
Dave Love <fx@gnu.org>
parents:
diff changeset
375 when the data file is read from disk into the data buffer. It operates
Dave Love <fx@gnu.org>
parents:
diff changeset
376 on the data buffer, ignoring read-only protections. When the data file
Dave Love <fx@gnu.org>
parents:
diff changeset
377 is saved to disk @code{forms-write-file-filter} is called to cancel the
Dave Love <fx@gnu.org>
parents:
diff changeset
378 effects of @code{forms-read-file-filter}. After being saved,
Dave Love <fx@gnu.org>
parents:
diff changeset
379 @code{forms-read-file-filter} is called again to prepare the data buffer
Dave Love <fx@gnu.org>
parents:
diff changeset
380 for further processing.
Dave Love <fx@gnu.org>
parents:
diff changeset
381
Dave Love <fx@gnu.org>
parents:
diff changeset
382 @cindex pseudo-newline
Dave Love <fx@gnu.org>
parents:
diff changeset
383 @vindex forms-multi-line
Dave Love <fx@gnu.org>
parents:
diff changeset
384 Fields may contain text which shows up in the forms in multiple lines.
Dave Love <fx@gnu.org>
parents:
diff changeset
385 These lines are separated in the field using a ``pseudo-newline''
Dave Love <fx@gnu.org>
parents:
diff changeset
386 character which is defined by the value of the string
Dave Love <fx@gnu.org>
parents:
diff changeset
387 @code{forms-multi-line}. Its default value is @code{"\^k"} (a Control-K
Dave Love <fx@gnu.org>
parents:
diff changeset
388 character). If it is
Dave Love <fx@gnu.org>
parents:
diff changeset
389 set to @code{nil}, multiple line fields are prohibited.
Dave Love <fx@gnu.org>
parents:
diff changeset
390
Dave Love <fx@gnu.org>
parents:
diff changeset
391 If the data file does not exist, it is automatically created.
Dave Love <fx@gnu.org>
parents:
diff changeset
392
Dave Love <fx@gnu.org>
parents:
diff changeset
393 @node Control File Format
Dave Love <fx@gnu.org>
parents:
diff changeset
394 @chapter Control File Format
Dave Love <fx@gnu.org>
parents:
diff changeset
395
Dave Love <fx@gnu.org>
parents:
diff changeset
396 @cindex control file
Dave Love <fx@gnu.org>
parents:
diff changeset
397 The Forms mode @dfn{control file} serves two purposes. First, it names
Dave Love <fx@gnu.org>
parents:
diff changeset
398 the data file to use, and defines its format and properties. Second,
Dave Love <fx@gnu.org>
parents:
diff changeset
399 the Emacs buffer it occupies is used by Forms mode to display the forms.
Dave Love <fx@gnu.org>
parents:
diff changeset
400
Dave Love <fx@gnu.org>
parents:
diff changeset
401 The contents of the control file are evaluated as a Lisp program. It
Dave Love <fx@gnu.org>
parents:
diff changeset
402 should set the following Lisp variables to suitable values:
Dave Love <fx@gnu.org>
parents:
diff changeset
403
Dave Love <fx@gnu.org>
parents:
diff changeset
404 @table @code
Dave Love <fx@gnu.org>
parents:
diff changeset
405 @vindex forms-file
Dave Love <fx@gnu.org>
parents:
diff changeset
406 @item forms-file
Dave Love <fx@gnu.org>
parents:
diff changeset
407 This variable specifies the name of the data file. Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
408
Dave Love <fx@gnu.org>
parents:
diff changeset
409 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
410 (setq forms-file "my/data-file")
Dave Love <fx@gnu.org>
parents:
diff changeset
411 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
412
Dave Love <fx@gnu.org>
parents:
diff changeset
413 If the control file doesn't set @code{forms-file}, Forms mode
Dave Love <fx@gnu.org>
parents:
diff changeset
414 reports an error.
Dave Love <fx@gnu.org>
parents:
diff changeset
415
Dave Love <fx@gnu.org>
parents:
diff changeset
416 @vindex forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
417 @item forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
418 This variable describes the way the fields of the record are formatted on
Dave Love <fx@gnu.org>
parents:
diff changeset
419 the screen. For details, see @ref{Format Description}.
Dave Love <fx@gnu.org>
parents:
diff changeset
420
Dave Love <fx@gnu.org>
parents:
diff changeset
421 @vindex forms-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
422 @item forms-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
423 This variable holds the number of fields in each record of the data
Dave Love <fx@gnu.org>
parents:
diff changeset
424 file. Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
425
Dave Love <fx@gnu.org>
parents:
diff changeset
426 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
427 (setq forms-number-of-fields 10)
Dave Love <fx@gnu.org>
parents:
diff changeset
428 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
429 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
430
Dave Love <fx@gnu.org>
parents:
diff changeset
431 If the control file does not set @code{forms-format-list} a default
Dave Love <fx@gnu.org>
parents:
diff changeset
432 format is used. In this situation, Forms mode will deduce the number of
Dave Love <fx@gnu.org>
parents:
diff changeset
433 fields from the data file providing this file exists and
Dave Love <fx@gnu.org>
parents:
diff changeset
434 @code{forms-number-of-records} has not been set in the control file.
Dave Love <fx@gnu.org>
parents:
diff changeset
435
Dave Love <fx@gnu.org>
parents:
diff changeset
436 The control file can optionally set the following additional Forms mode
Dave Love <fx@gnu.org>
parents:
diff changeset
437 variables. Most of them have default values that are good for most
Dave Love <fx@gnu.org>
parents:
diff changeset
438 applications.
Dave Love <fx@gnu.org>
parents:
diff changeset
439
Dave Love <fx@gnu.org>
parents:
diff changeset
440 @table @code
Dave Love <fx@gnu.org>
parents:
diff changeset
441 @vindex forms-field-sep
Dave Love <fx@gnu.org>
parents:
diff changeset
442 @item forms-field-sep
Dave Love <fx@gnu.org>
parents:
diff changeset
443 This variable may be used to designate the string which separates the
Dave Love <fx@gnu.org>
parents:
diff changeset
444 fields in the records of the data file. If not set, it defaults to the
Dave Love <fx@gnu.org>
parents:
diff changeset
445 string @code{"\t"} (a Tab character). Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
446
Dave Love <fx@gnu.org>
parents:
diff changeset
447 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
448 (setq forms-field-sep "\t")
Dave Love <fx@gnu.org>
parents:
diff changeset
449 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
450
Dave Love <fx@gnu.org>
parents:
diff changeset
451 @vindex forms-read-only
Dave Love <fx@gnu.org>
parents:
diff changeset
452 @item forms-read-only
Dave Love <fx@gnu.org>
parents:
diff changeset
453 If the value is non-@code{nil}, the data file is treated read-only. (Forms
Dave Love <fx@gnu.org>
parents:
diff changeset
454 mode also treats the data file as read-only if you don't have access to
Dave Love <fx@gnu.org>
parents:
diff changeset
455 write it.) Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
456
Dave Love <fx@gnu.org>
parents:
diff changeset
457 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
458 (set forms-read-only t)
Dave Love <fx@gnu.org>
parents:
diff changeset
459 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
460
Dave Love <fx@gnu.org>
parents:
diff changeset
461 @vindex forms-multi-line
Dave Love <fx@gnu.org>
parents:
diff changeset
462 @item forms-multi-line
Dave Love <fx@gnu.org>
parents:
diff changeset
463 This variable specifies the @dfn{pseudo newline} separator that allows
Dave Love <fx@gnu.org>
parents:
diff changeset
464 multi-line fields. This separator goes between the ``lines'' within a
Dave Love <fx@gnu.org>
parents:
diff changeset
465 field---thus, the field doesn't really contain multiple lines, but it
Dave Love <fx@gnu.org>
parents:
diff changeset
466 appears that way when displayed in Forms mode. If the value is
Dave Love <fx@gnu.org>
parents:
diff changeset
467 @code{nil}, multi-line text fields are prohibited. The pseudo newline
Dave Love <fx@gnu.org>
parents:
diff changeset
468 must not be a character contained in @code{forms-field-sep}.
Dave Love <fx@gnu.org>
parents:
diff changeset
469
Dave Love <fx@gnu.org>
parents:
diff changeset
470 The default value is @code{"\^k"}, the character Control-K. Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
471
Dave Love <fx@gnu.org>
parents:
diff changeset
472 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
473 (setq forms-multi-line "\^k")
Dave Love <fx@gnu.org>
parents:
diff changeset
474 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
475
Dave Love <fx@gnu.org>
parents:
diff changeset
476 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
477 @vindex forms-forms-scroll
Dave Love <fx@gnu.org>
parents:
diff changeset
478 @item forms-forms-scroll
Dave Love <fx@gnu.org>
parents:
diff changeset
479 @xref{Forms Mode Commands}, for details.
Dave Love <fx@gnu.org>
parents:
diff changeset
480
Dave Love <fx@gnu.org>
parents:
diff changeset
481 @vindex forms-forms-jump
Dave Love <fx@gnu.org>
parents:
diff changeset
482 @item forms-forms-jump
Dave Love <fx@gnu.org>
parents:
diff changeset
483 @xref{Forms Mode Commands}, for details.
Dave Love <fx@gnu.org>
parents:
diff changeset
484 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
485
Dave Love <fx@gnu.org>
parents:
diff changeset
486 @findex forms-read-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
487 @item forms-read-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
488 This variable holds the name of a function to be called after the data
Dave Love <fx@gnu.org>
parents:
diff changeset
489 file has been read in. This can be used to transform the contents of the
Dave Love <fx@gnu.org>
parents:
diff changeset
490 data file into a format more suitable for forms processing.
Dave Love <fx@gnu.org>
parents:
diff changeset
491 If it is @code{nil}, no function is called. For example, to maintain a
Dave Love <fx@gnu.org>
parents:
diff changeset
492 gzipped database:
Dave Love <fx@gnu.org>
parents:
diff changeset
493
Dave Love <fx@gnu.org>
parents:
diff changeset
494 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
495 (defun gzip-read-file-filter ()
Dave Love <fx@gnu.org>
parents:
diff changeset
496 (shell-command-on-region (point-min) (point-max)
Dave Love <fx@gnu.org>
parents:
diff changeset
497 "gzip -d" t t))
Dave Love <fx@gnu.org>
parents:
diff changeset
498 (setq forms-read-file-filter 'gzip-read-file-filter)
Dave Love <fx@gnu.org>
parents:
diff changeset
499 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
500
Dave Love <fx@gnu.org>
parents:
diff changeset
501 @findex forms-write-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
502 @item forms-write-file-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
503 This variable holds the name of a function to be called before writing
Dave Love <fx@gnu.org>
parents:
diff changeset
504 out the contents of the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
505 This can be used to undo the effects of @code{forms-read-file-filter}.
Dave Love <fx@gnu.org>
parents:
diff changeset
506 If it is @code{nil}, no function is called. Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
507
Dave Love <fx@gnu.org>
parents:
diff changeset
508 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
509 (defun gzip-write-file-filter ()
Dave Love <fx@gnu.org>
parents:
diff changeset
510 (make-variable-buffer-local 'require-final-newline)
Dave Love <fx@gnu.org>
parents:
diff changeset
511 (setq require-final-newline nil)
Dave Love <fx@gnu.org>
parents:
diff changeset
512 (shell-command-on-region (point-min) (point-max)
Dave Love <fx@gnu.org>
parents:
diff changeset
513 "gzip" t t))
Dave Love <fx@gnu.org>
parents:
diff changeset
514 (setq forms-write-file-filter 'gzip-write-file-filter)
Dave Love <fx@gnu.org>
parents:
diff changeset
515 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
516
Dave Love <fx@gnu.org>
parents:
diff changeset
517 @findex forms-new-record-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
518 @item forms-new-record-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
519 This variable holds a function to be called whenever a new record is created
Dave Love <fx@gnu.org>
parents:
diff changeset
520 to supply default values for fields. If it is @code{nil}, no function is
Dave Love <fx@gnu.org>
parents:
diff changeset
521 called.
Dave Love <fx@gnu.org>
parents:
diff changeset
522 @xref{Modifying Forms Contents}, for details.
Dave Love <fx@gnu.org>
parents:
diff changeset
523
Dave Love <fx@gnu.org>
parents:
diff changeset
524 @findex forms-modified-record-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
525 @item forms-modified-record-filter
Dave Love <fx@gnu.org>
parents:
diff changeset
526 This variable holds a function to be called whenever a record is
Dave Love <fx@gnu.org>
parents:
diff changeset
527 modified, just before updating the Forms data file. If it is
Dave Love <fx@gnu.org>
parents:
diff changeset
528 @code{nil}, no function is called.
Dave Love <fx@gnu.org>
parents:
diff changeset
529 @xref{Modifying Forms Contents}, for details.
Dave Love <fx@gnu.org>
parents:
diff changeset
530
Dave Love <fx@gnu.org>
parents:
diff changeset
531 @findex forms-insert-after
Dave Love <fx@gnu.org>
parents:
diff changeset
532 @item forms-insert-after
Dave Love <fx@gnu.org>
parents:
diff changeset
533 If this variable is not @code{nil}, new records are created @emph{after} the
Dave Love <fx@gnu.org>
parents:
diff changeset
534 current record. Also, upon visiting a file, the initial position will be
Dave Love <fx@gnu.org>
parents:
diff changeset
535 at the last record instead of the first one.
Dave Love <fx@gnu.org>
parents:
diff changeset
536
Dave Love <fx@gnu.org>
parents:
diff changeset
537 @findex forms-check-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
538 @item forms-check-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
539 Normally each record is checked to contain the correct number of fields.
Dave Love <fx@gnu.org>
parents:
diff changeset
540 Under certain circumstances, this can be undesirable.
Dave Love <fx@gnu.org>
parents:
diff changeset
541 If this variable is set to @code{nil}, these checks will be bypassed.
Dave Love <fx@gnu.org>
parents:
diff changeset
542 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
543
Dave Love <fx@gnu.org>
parents:
diff changeset
544 @node Format Description
Dave Love <fx@gnu.org>
parents:
diff changeset
545 @chapter The Format Description
Dave Love <fx@gnu.org>
parents:
diff changeset
546
Dave Love <fx@gnu.org>
parents:
diff changeset
547 @vindex forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
548 The variable @code{forms-format-list} specifies the format of the data
Dave Love <fx@gnu.org>
parents:
diff changeset
549 in the data file, and how to convert the data for display in Forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
550 Its value must be a list of Forms mode @dfn{formatting elements}, each
Dave Love <fx@gnu.org>
parents:
diff changeset
551 of which can be a string, a number, a Lisp list, or a Lisp symbol that
Dave Love <fx@gnu.org>
parents:
diff changeset
552 evaluates to one of those. The formatting elements are processed in the
Dave Love <fx@gnu.org>
parents:
diff changeset
553 order they appear in the list.
Dave Love <fx@gnu.org>
parents:
diff changeset
554
Dave Love <fx@gnu.org>
parents:
diff changeset
555 @table @var
Dave Love <fx@gnu.org>
parents:
diff changeset
556 @item string
Dave Love <fx@gnu.org>
parents:
diff changeset
557 A string formatting element is inserted in the forms ``as is,'' as text
Dave Love <fx@gnu.org>
parents:
diff changeset
558 that the user cannot alter.
Dave Love <fx@gnu.org>
parents:
diff changeset
559
Dave Love <fx@gnu.org>
parents:
diff changeset
560 @item number
Dave Love <fx@gnu.org>
parents:
diff changeset
561 A number element selects a field of the record. The contents of this
Dave Love <fx@gnu.org>
parents:
diff changeset
562 field are inserted in the display at this point. Field numbers count
Dave Love <fx@gnu.org>
parents:
diff changeset
563 starting from 1 (one).
Dave Love <fx@gnu.org>
parents:
diff changeset
564
Dave Love <fx@gnu.org>
parents:
diff changeset
565 @item list
Dave Love <fx@gnu.org>
parents:
diff changeset
566 A formatting element that is a list specifies a function call. This
Dave Love <fx@gnu.org>
parents:
diff changeset
567 function is called every time a record is displayed, and its result,
Dave Love <fx@gnu.org>
parents:
diff changeset
568 which must be a string, is inserted in the display text. The function
Dave Love <fx@gnu.org>
parents:
diff changeset
569 should do nothing but returning a string.
Dave Love <fx@gnu.org>
parents:
diff changeset
570
Dave Love <fx@gnu.org>
parents:
diff changeset
571 @vindex forms-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
572 The function you call can access the fields of the record as a list in
Dave Love <fx@gnu.org>
parents:
diff changeset
573 the variable
Dave Love <fx@gnu.org>
parents:
diff changeset
574 @code{forms-fields}.
Dave Love <fx@gnu.org>
parents:
diff changeset
575
Dave Love <fx@gnu.org>
parents:
diff changeset
576 @item symbol
Dave Love <fx@gnu.org>
parents:
diff changeset
577 A symbol used as a formatting element should evaluate to a string, number,
Dave Love <fx@gnu.org>
parents:
diff changeset
578 or list; the value is interpreted as a formatting element, as described
Dave Love <fx@gnu.org>
parents:
diff changeset
579 above.
Dave Love <fx@gnu.org>
parents:
diff changeset
580 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
581
Dave Love <fx@gnu.org>
parents:
diff changeset
582 If a record does not contain the number of fields as specified in
Dave Love <fx@gnu.org>
parents:
diff changeset
583 @code{forms-number-of-fields}, a warning message will be printed. Excess
Dave Love <fx@gnu.org>
parents:
diff changeset
584 fields are ignored, missing fields are set to empty.
Dave Love <fx@gnu.org>
parents:
diff changeset
585
Dave Love <fx@gnu.org>
parents:
diff changeset
586 The control file which displays @file{/etc/passwd} file as demonstrated
Dave Love <fx@gnu.org>
parents:
diff changeset
587 in the beginning of this manual might look as follows:
Dave Love <fx@gnu.org>
parents:
diff changeset
588
Dave Love <fx@gnu.org>
parents:
diff changeset
589 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
590 ;; @r{This demo visits @file{/etc/passwd}.}
Dave Love <fx@gnu.org>
parents:
diff changeset
591
Dave Love <fx@gnu.org>
parents:
diff changeset
592 (setq forms-file "/etc/passwd")
Dave Love <fx@gnu.org>
parents:
diff changeset
593 (setq forms-number-of-fields 7)
Dave Love <fx@gnu.org>
parents:
diff changeset
594 (setq forms-read-only t) ; @r{to make sure}
Dave Love <fx@gnu.org>
parents:
diff changeset
595 (setq forms-field-sep ":")
Dave Love <fx@gnu.org>
parents:
diff changeset
596 ;; @r{Don't allow multi-line fields.}
Dave Love <fx@gnu.org>
parents:
diff changeset
597 (setq forms-multi-line nil)
Dave Love <fx@gnu.org>
parents:
diff changeset
598
Dave Love <fx@gnu.org>
parents:
diff changeset
599 (setq forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
600 (list
Dave Love <fx@gnu.org>
parents:
diff changeset
601 "====== /etc/passwd ======\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
602 "User : " 1
Dave Love <fx@gnu.org>
parents:
diff changeset
603 " Uid: " 3
Dave Love <fx@gnu.org>
parents:
diff changeset
604 " Gid: " 4
Dave Love <fx@gnu.org>
parents:
diff changeset
605 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
606 "Name : " 5
Dave Love <fx@gnu.org>
parents:
diff changeset
607 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
608 "Home : " 6
Dave Love <fx@gnu.org>
parents:
diff changeset
609 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
610 "Shell: " 7
Dave Love <fx@gnu.org>
parents:
diff changeset
611 "\n"))
Dave Love <fx@gnu.org>
parents:
diff changeset
612 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
613
Dave Love <fx@gnu.org>
parents:
diff changeset
614 When you construct the value of @code{forms-format-list}, you should
Dave Love <fx@gnu.org>
parents:
diff changeset
615 usually either quote the whole value, like this,
Dave Love <fx@gnu.org>
parents:
diff changeset
616
Dave Love <fx@gnu.org>
parents:
diff changeset
617 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
618 (setq forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
619 '(
Dave Love <fx@gnu.org>
parents:
diff changeset
620 "====== " forms-file " ======\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
621 "User : " 1
Dave Love <fx@gnu.org>
parents:
diff changeset
622 (make-string 20 ?-)
Dave Love <fx@gnu.org>
parents:
diff changeset
623 @dots{}
Dave Love <fx@gnu.org>
parents:
diff changeset
624 ))
Dave Love <fx@gnu.org>
parents:
diff changeset
625 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
626
Dave Love <fx@gnu.org>
parents:
diff changeset
627 @noindent
Dave Love <fx@gnu.org>
parents:
diff changeset
628 or quote the elements which are lists, like this:
Dave Love <fx@gnu.org>
parents:
diff changeset
629
Dave Love <fx@gnu.org>
parents:
diff changeset
630 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
631 (setq forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
632 (list
Dave Love <fx@gnu.org>
parents:
diff changeset
633 "====== " forms-file " ======\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
634 "User : " 1
Dave Love <fx@gnu.org>
parents:
diff changeset
635 '(make-string 20 ?-)
Dave Love <fx@gnu.org>
parents:
diff changeset
636 @dots{}
Dave Love <fx@gnu.org>
parents:
diff changeset
637 ))
Dave Love <fx@gnu.org>
parents:
diff changeset
638 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
639
Dave Love <fx@gnu.org>
parents:
diff changeset
640 Forms mode validates the contents of @code{forms-format-list} when you
Dave Love <fx@gnu.org>
parents:
diff changeset
641 visit a database. If there are errors, processing is aborted with an
Dave Love <fx@gnu.org>
parents:
diff changeset
642 error message which includes a descriptive text. @xref{Error Messages},
Dave Love <fx@gnu.org>
parents:
diff changeset
643 for a detailed list of error messages.
Dave Love <fx@gnu.org>
parents:
diff changeset
644
Dave Love <fx@gnu.org>
parents:
diff changeset
645 If no @code{forms-format-list} is specified, Forms mode will supply a
Dave Love <fx@gnu.org>
parents:
diff changeset
646 default format list. This list contains the name of the file being
Dave Love <fx@gnu.org>
parents:
diff changeset
647 visited, and a simple label for each field indicating the field number.
Dave Love <fx@gnu.org>
parents:
diff changeset
648
Dave Love <fx@gnu.org>
parents:
diff changeset
649 @node Modifying Forms Contents
Dave Love <fx@gnu.org>
parents:
diff changeset
650 @chapter Modifying The Forms Contents
Dave Love <fx@gnu.org>
parents:
diff changeset
651
Dave Love <fx@gnu.org>
parents:
diff changeset
652 If @code{forms-read-only} is @code{nil}, the user can modify the fields
Dave Love <fx@gnu.org>
parents:
diff changeset
653 and records of the database.
Dave Love <fx@gnu.org>
parents:
diff changeset
654
Dave Love <fx@gnu.org>
parents:
diff changeset
655 All normal editing commands are available for editing the contents of the
Dave Love <fx@gnu.org>
parents:
diff changeset
656 displayed record. You cannot delete or modify the fixed, explanatory
Dave Love <fx@gnu.org>
parents:
diff changeset
657 text that comes from string formatting elements, but you can modify the
Dave Love <fx@gnu.org>
parents:
diff changeset
658 actual field contents.
Dave Love <fx@gnu.org>
parents:
diff changeset
659
Dave Love <fx@gnu.org>
parents:
diff changeset
660 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
661 @c This is for the Emacs 18 version only.
Dave Love <fx@gnu.org>
parents:
diff changeset
662 If the contents of the forms cannot be recognized properly, this is
Dave Love <fx@gnu.org>
parents:
diff changeset
663 signaled using a descriptive text. @xref{Error Messages}, for more info.
Dave Love <fx@gnu.org>
parents:
diff changeset
664 The cursor will indicate the last part of the forms which was
Dave Love <fx@gnu.org>
parents:
diff changeset
665 successfully parsed. It's important to avoid entering field contents
Dave Love <fx@gnu.org>
parents:
diff changeset
666 that would cause confusion with the field-separating fixed text.
Dave Love <fx@gnu.org>
parents:
diff changeset
667 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
668
Dave Love <fx@gnu.org>
parents:
diff changeset
669 If the variable @code{forms-modified-record-filter} is non-@code{nil},
Dave Love <fx@gnu.org>
parents:
diff changeset
670 it is called as a function before the new data is written to the data
Dave Love <fx@gnu.org>
parents:
diff changeset
671 file. The function receives one argument, a vector that contains the
Dave Love <fx@gnu.org>
parents:
diff changeset
672 contents of the fields of the record.
Dave Love <fx@gnu.org>
parents:
diff changeset
673
Dave Love <fx@gnu.org>
parents:
diff changeset
674 The function can refer to fields with @code{aref} and modify them with
Dave Love <fx@gnu.org>
parents:
diff changeset
675 @code{aset}. The first field has number 1 (one); thus, element 0 of the
Dave Love <fx@gnu.org>
parents:
diff changeset
676 vector is not used. The function should return the same vector it was
Dave Love <fx@gnu.org>
parents:
diff changeset
677 passed; the (possibly modified) contents of the vector determine what is
Dave Love <fx@gnu.org>
parents:
diff changeset
678 actually written in the file. Here is an example:
Dave Love <fx@gnu.org>
parents:
diff changeset
679
Dave Love <fx@gnu.org>
parents:
diff changeset
680 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
681 (defun my-modified-record-filter (record)
Dave Love <fx@gnu.org>
parents:
diff changeset
682 ;; @r{Modify second field.}
Dave Love <fx@gnu.org>
parents:
diff changeset
683 (aset record 2 (current-time-string))
Dave Love <fx@gnu.org>
parents:
diff changeset
684 ;; @r{Return the field vector.}
Dave Love <fx@gnu.org>
parents:
diff changeset
685 record)
Dave Love <fx@gnu.org>
parents:
diff changeset
686
Dave Love <fx@gnu.org>
parents:
diff changeset
687 (setq forms-modified-record-filter 'my-modified-record-filter)
Dave Love <fx@gnu.org>
parents:
diff changeset
688 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
689
Dave Love <fx@gnu.org>
parents:
diff changeset
690 If the variable @code{forms-new-record-filter} is non-@code{nil}, its
Dave Love <fx@gnu.org>
parents:
diff changeset
691 value is a function to be called to fill in default values for the
Dave Love <fx@gnu.org>
parents:
diff changeset
692 fields of a new record. The function is passed a vector of empty
Dave Love <fx@gnu.org>
parents:
diff changeset
693 strings, one for each field; it should return the same vector, with
Dave Love <fx@gnu.org>
parents:
diff changeset
694 the desired field values stored in it. Fields are numbered starting
Dave Love <fx@gnu.org>
parents:
diff changeset
695 from 1 (one). Example:
Dave Love <fx@gnu.org>
parents:
diff changeset
696
Dave Love <fx@gnu.org>
parents:
diff changeset
697 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
698 (defun my-new-record-filter (fields)
Dave Love <fx@gnu.org>
parents:
diff changeset
699 (aset fields 5 (login-name))
Dave Love <fx@gnu.org>
parents:
diff changeset
700 (aset fields 1 (current-time-string))
Dave Love <fx@gnu.org>
parents:
diff changeset
701 fields)
Dave Love <fx@gnu.org>
parents:
diff changeset
702
Dave Love <fx@gnu.org>
parents:
diff changeset
703 (setq forms-new-record-filter 'my-new-record-filter)
Dave Love <fx@gnu.org>
parents:
diff changeset
704 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
705
Dave Love <fx@gnu.org>
parents:
diff changeset
706 @node Miscellaneous
Dave Love <fx@gnu.org>
parents:
diff changeset
707 @chapter Miscellaneous
Dave Love <fx@gnu.org>
parents:
diff changeset
708
Dave Love <fx@gnu.org>
parents:
diff changeset
709 @vindex forms-version
Dave Love <fx@gnu.org>
parents:
diff changeset
710 The global variable @code{forms-version} holds the version information
Dave Love <fx@gnu.org>
parents:
diff changeset
711 of the Forms mode software.
Dave Love <fx@gnu.org>
parents:
diff changeset
712
Dave Love <fx@gnu.org>
parents:
diff changeset
713 @findex forms-enumerate
Dave Love <fx@gnu.org>
parents:
diff changeset
714 It is very convenient to use symbolic names for the fields in a record.
Dave Love <fx@gnu.org>
parents:
diff changeset
715 The function @code{forms-enumerate} provides an elegant means to define
Dave Love <fx@gnu.org>
parents:
diff changeset
716 a series of variables whose values are consecutive integers. The
Dave Love <fx@gnu.org>
parents:
diff changeset
717 function returns the highest number used, so it can be used to set
Dave Love <fx@gnu.org>
parents:
diff changeset
718 @code{forms-number-of-fields} also. For example:
Dave Love <fx@gnu.org>
parents:
diff changeset
719
Dave Love <fx@gnu.org>
parents:
diff changeset
720 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
721 (setq forms-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
722 (forms-enumerate
Dave Love <fx@gnu.org>
parents:
diff changeset
723 '(field1 field2 field3 @dots{})))
Dave Love <fx@gnu.org>
parents:
diff changeset
724 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
725
Dave Love <fx@gnu.org>
parents:
diff changeset
726 This sets @code{field1} to 1, @code{field2} to 2, and so on.
Dave Love <fx@gnu.org>
parents:
diff changeset
727
Dave Love <fx@gnu.org>
parents:
diff changeset
728 Care has been taken to keep the Forms mode variables buffer-local, so it
Dave Love <fx@gnu.org>
parents:
diff changeset
729 is possible to visit multiple files in Forms mode simultaneously, even
Dave Love <fx@gnu.org>
parents:
diff changeset
730 if they have different properties.
Dave Love <fx@gnu.org>
parents:
diff changeset
731
Dave Love <fx@gnu.org>
parents:
diff changeset
732 @findex forms-mode
Dave Love <fx@gnu.org>
parents:
diff changeset
733 If you have visited the control file in normal fashion with
Dave Love <fx@gnu.org>
parents:
diff changeset
734 @code{find-file} or a like command, you can switch to Forms mode with
Dave Love <fx@gnu.org>
parents:
diff changeset
735 the command @code{M-x forms-mode}. If you put @samp{-*- forms -*-} in
Dave Love <fx@gnu.org>
parents:
diff changeset
736 the first line of the control file, then visiting it enables Forms mode
Dave Love <fx@gnu.org>
parents:
diff changeset
737 automatically. But this makes it hard to edit the control file itself,
Dave Love <fx@gnu.org>
parents:
diff changeset
738 so you'd better think twice before using this.
Dave Love <fx@gnu.org>
parents:
diff changeset
739
Dave Love <fx@gnu.org>
parents:
diff changeset
740 The default format for the data file, using @code{"\t"} to separate
Dave Love <fx@gnu.org>
parents:
diff changeset
741 fields and @code{"\^k"} to separate lines within a field, matches the
Dave Love <fx@gnu.org>
parents:
diff changeset
742 file format of some popular database programs, e.g. FileMaker. So
Dave Love <fx@gnu.org>
parents:
diff changeset
743 @code{forms-mode} can decrease the need to use proprietary software.
Dave Love <fx@gnu.org>
parents:
diff changeset
744
Dave Love <fx@gnu.org>
parents:
diff changeset
745 @node Error Messages
Dave Love <fx@gnu.org>
parents:
diff changeset
746 @chapter Error Messages
Dave Love <fx@gnu.org>
parents:
diff changeset
747
Dave Love <fx@gnu.org>
parents:
diff changeset
748 This section describes all error messages which can be generated by
Dave Love <fx@gnu.org>
parents:
diff changeset
749 forms mode. Error messages that result from parsing the control file
Dave Love <fx@gnu.org>
parents:
diff changeset
750 all start with the text @samp{Forms control file error}. Messages
Dave Love <fx@gnu.org>
parents:
diff changeset
751 generated while analyzing the definition of @code{forms-format-list}
Dave Love <fx@gnu.org>
parents:
diff changeset
752 start with @samp{Forms format error}.
Dave Love <fx@gnu.org>
parents:
diff changeset
753
Dave Love <fx@gnu.org>
parents:
diff changeset
754 @table @code
Dave Love <fx@gnu.org>
parents:
diff changeset
755 @item Forms control file error: `forms-file' has not been set
Dave Love <fx@gnu.org>
parents:
diff changeset
756 The variable @code{forms-file} was not set by the control file.
Dave Love <fx@gnu.org>
parents:
diff changeset
757
Dave Love <fx@gnu.org>
parents:
diff changeset
758 @item Forms control file error: `forms-number-of-fields' has not been set
Dave Love <fx@gnu.org>
parents:
diff changeset
759 The variable @code{forms-number-of-fields} was not set by the control
Dave Love <fx@gnu.org>
parents:
diff changeset
760 file.
Dave Love <fx@gnu.org>
parents:
diff changeset
761
Dave Love <fx@gnu.org>
parents:
diff changeset
762 @item Forms control file error: `forms-number-of-fields' must be a number > 0
Dave Love <fx@gnu.org>
parents:
diff changeset
763 The variable @code{forms-number-of-fields} did not contain a positive
Dave Love <fx@gnu.org>
parents:
diff changeset
764 number.
Dave Love <fx@gnu.org>
parents:
diff changeset
765
Dave Love <fx@gnu.org>
parents:
diff changeset
766 @item Forms control file error: `forms-field-sep' is not a string
Dave Love <fx@gnu.org>
parents:
diff changeset
767 @itemx Forms control file error: `forms-multi-line' must be nil or a one-character string
Dave Love <fx@gnu.org>
parents:
diff changeset
768 The variable @code{forms-multi-line} was set to something other than
Dave Love <fx@gnu.org>
parents:
diff changeset
769 @code{nil} or a single-character string.
Dave Love <fx@gnu.org>
parents:
diff changeset
770
Dave Love <fx@gnu.org>
parents:
diff changeset
771 @item Forms control file error: `forms-multi-line' is equal to 'forms-field-sep'
Dave Love <fx@gnu.org>
parents:
diff changeset
772 The variable @code{forms-multi-line} may not be equal to
Dave Love <fx@gnu.org>
parents:
diff changeset
773 @code{forms-field-sep} for this would make it impossible to distinguish
Dave Love <fx@gnu.org>
parents:
diff changeset
774 fields and the lines in the fields.
Dave Love <fx@gnu.org>
parents:
diff changeset
775
Dave Love <fx@gnu.org>
parents:
diff changeset
776 @item Forms control file error: `forms-new-record-filter' is not a function
Dave Love <fx@gnu.org>
parents:
diff changeset
777 @itemx Forms control file error: `forms-modified-record-filter' is not a function
Dave Love <fx@gnu.org>
parents:
diff changeset
778 The variable has been set to something else than a function.
Dave Love <fx@gnu.org>
parents:
diff changeset
779
Dave Love <fx@gnu.org>
parents:
diff changeset
780 @item Forms control file error: `forms-format-list' is not a list
Dave Love <fx@gnu.org>
parents:
diff changeset
781 The variable @code{forms-format-list} was not set to a Lisp list
Dave Love <fx@gnu.org>
parents:
diff changeset
782 by the control file.
Dave Love <fx@gnu.org>
parents:
diff changeset
783
Dave Love <fx@gnu.org>
parents:
diff changeset
784 @item Forms format error: field number @var{xx} out of range 1..@var{nn}
Dave Love <fx@gnu.org>
parents:
diff changeset
785 A field number was supplied in @code{forms-format-list} with a value of
Dave Love <fx@gnu.org>
parents:
diff changeset
786 @var{xx}, which was not greater than zero and smaller than or equal to
Dave Love <fx@gnu.org>
parents:
diff changeset
787 the number of fields in the forms, @var{nn}.
Dave Love <fx@gnu.org>
parents:
diff changeset
788
Dave Love <fx@gnu.org>
parents:
diff changeset
789 @item Forms format error: @var{fun} is not a function
Dave Love <fx@gnu.org>
parents:
diff changeset
790 The first element of a list which is an element of
Dave Love <fx@gnu.org>
parents:
diff changeset
791 @code{forms-format-list} was not a valid Lisp function.
Dave Love <fx@gnu.org>
parents:
diff changeset
792
Dave Love <fx@gnu.org>
parents:
diff changeset
793 @item Forms format error: invalid element @var{xx}
Dave Love <fx@gnu.org>
parents:
diff changeset
794 A list element was supplied in @code{forms-format-list} which was not a
Dave Love <fx@gnu.org>
parents:
diff changeset
795 string, number or list.
Dave Love <fx@gnu.org>
parents:
diff changeset
796
Dave Love <fx@gnu.org>
parents:
diff changeset
797 @ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
798 @c This applies to Emacs 18 only.
Dave Love <fx@gnu.org>
parents:
diff changeset
799 @c Error messages generated while a modified form is being analyzed.
Dave Love <fx@gnu.org>
parents:
diff changeset
800
Dave Love <fx@gnu.org>
parents:
diff changeset
801 @item Parse error: not looking at `...'
Dave Love <fx@gnu.org>
parents:
diff changeset
802 When re-parsing the contents of a forms, the text shown could not
Dave Love <fx@gnu.org>
parents:
diff changeset
803 be found.
Dave Love <fx@gnu.org>
parents:
diff changeset
804
Dave Love <fx@gnu.org>
parents:
diff changeset
805 @item Parse error: cannot find `...'
Dave Love <fx@gnu.org>
parents:
diff changeset
806 When re-parsing the contents of a forms, the text shown, which
Dave Love <fx@gnu.org>
parents:
diff changeset
807 separates two fields, could not be found.
Dave Love <fx@gnu.org>
parents:
diff changeset
808
Dave Love <fx@gnu.org>
parents:
diff changeset
809 @item Parse error: cannot parse adjacent fields @var{xx} and @var{yy}
Dave Love <fx@gnu.org>
parents:
diff changeset
810 Fields @var{xx} and @var{yy} were not separated by text, so could not be
Dave Love <fx@gnu.org>
parents:
diff changeset
811 parsed again.
Dave Love <fx@gnu.org>
parents:
diff changeset
812 @end ignore
Dave Love <fx@gnu.org>
parents:
diff changeset
813
Dave Love <fx@gnu.org>
parents:
diff changeset
814 @item Warning: this record has @var{xx} fields instead of @var{yy}
Dave Love <fx@gnu.org>
parents:
diff changeset
815 The number of fields in this record in the data file did not match
Dave Love <fx@gnu.org>
parents:
diff changeset
816 @code{forms-number-of-fields}. Missing fields will be made empty.
Dave Love <fx@gnu.org>
parents:
diff changeset
817
Dave Love <fx@gnu.org>
parents:
diff changeset
818 @item Multi-line fields in this record - update refused!
Dave Love <fx@gnu.org>
parents:
diff changeset
819 The current record contains newline characters, hence can not be written
Dave Love <fx@gnu.org>
parents:
diff changeset
820 back to the data file, for it would corrupt it. Probably you inserted a
Dave Love <fx@gnu.org>
parents:
diff changeset
821 newline in a field, while @code{forms-multi-line} was @code{nil}.
Dave Love <fx@gnu.org>
parents:
diff changeset
822
Dave Love <fx@gnu.org>
parents:
diff changeset
823 @item Field separator occurs in record - update refused!
Dave Love <fx@gnu.org>
parents:
diff changeset
824 The current record contains the field separator string inside one of the
Dave Love <fx@gnu.org>
parents:
diff changeset
825 fields. It can not be written back to the data file, for it would
Dave Love <fx@gnu.org>
parents:
diff changeset
826 corrupt it. Probably you inserted the field separator string in a field.
Dave Love <fx@gnu.org>
parents:
diff changeset
827
Dave Love <fx@gnu.org>
parents:
diff changeset
828 @item Record number @var{xx} out of range 1..@var{yy}
Dave Love <fx@gnu.org>
parents:
diff changeset
829 A jump was made to non-existing record @var{xx}. @var{yy} denotes the
Dave Love <fx@gnu.org>
parents:
diff changeset
830 number of records in the file.
Dave Love <fx@gnu.org>
parents:
diff changeset
831
Dave Love <fx@gnu.org>
parents:
diff changeset
832 @item Stuck at record @var{xx}
Dave Love <fx@gnu.org>
parents:
diff changeset
833 An internal error prevented a specific record from being retrieved.
Dave Love <fx@gnu.org>
parents:
diff changeset
834
Dave Love <fx@gnu.org>
parents:
diff changeset
835 @item No write access to @code{"}@var{file}@code{"}
Dave Love <fx@gnu.org>
parents:
diff changeset
836 An attempt was made to enable edit mode on a file that has been write
Dave Love <fx@gnu.org>
parents:
diff changeset
837 protected.
Dave Love <fx@gnu.org>
parents:
diff changeset
838
Dave Love <fx@gnu.org>
parents:
diff changeset
839 @item Search failed: @var{regexp}
Dave Love <fx@gnu.org>
parents:
diff changeset
840 The @var{regexp} could not be found in the data file. Forward searching
Dave Love <fx@gnu.org>
parents:
diff changeset
841 is done from the current location until the end of the file, then
Dave Love <fx@gnu.org>
parents:
diff changeset
842 retrying from the beginning of the file until the current location.
Dave Love <fx@gnu.org>
parents:
diff changeset
843 Backward searching is done from the current location until the beginning
Dave Love <fx@gnu.org>
parents:
diff changeset
844 of the file, then retrying from the end of the file until the current
Dave Love <fx@gnu.org>
parents:
diff changeset
845 location.
Dave Love <fx@gnu.org>
parents:
diff changeset
846
Dave Love <fx@gnu.org>
parents:
diff changeset
847 @item Wrapped
Dave Love <fx@gnu.org>
parents:
diff changeset
848 A search completed successfully after wrapping around.
Dave Love <fx@gnu.org>
parents:
diff changeset
849
Dave Love <fx@gnu.org>
parents:
diff changeset
850 @item Warning: number of records changed to @var{nn}
Dave Love <fx@gnu.org>
parents:
diff changeset
851 Forms mode's idea of the number of records has been adjusted to the
Dave Love <fx@gnu.org>
parents:
diff changeset
852 number of records actually present in the data file.
Dave Love <fx@gnu.org>
parents:
diff changeset
853
Dave Love <fx@gnu.org>
parents:
diff changeset
854 @item Problem saving buffers?
Dave Love <fx@gnu.org>
parents:
diff changeset
855 An error occurred while saving the data file buffer. Most likely, Emacs
Dave Love <fx@gnu.org>
parents:
diff changeset
856 did ask to confirm deleting the buffer because it had been modified, and
Dave Love <fx@gnu.org>
parents:
diff changeset
857 you said `no'.
Dave Love <fx@gnu.org>
parents:
diff changeset
858 @end table
Dave Love <fx@gnu.org>
parents:
diff changeset
859
Dave Love <fx@gnu.org>
parents:
diff changeset
860 @node Long Example
Dave Love <fx@gnu.org>
parents:
diff changeset
861 @chapter Long Example
Dave Love <fx@gnu.org>
parents:
diff changeset
862
Dave Love <fx@gnu.org>
parents:
diff changeset
863 The following example exploits most of the features of Forms mode.
Dave Love <fx@gnu.org>
parents:
diff changeset
864 This example is included in the distribution as file @file{forms-d2.el}.
Dave Love <fx@gnu.org>
parents:
diff changeset
865
Dave Love <fx@gnu.org>
parents:
diff changeset
866 @example
Dave Love <fx@gnu.org>
parents:
diff changeset
867 ;; demo2 -- demo forms-mode -*- emacs-lisp -*-
Dave Love <fx@gnu.org>
parents:
diff changeset
868
Dave Love <fx@gnu.org>
parents:
diff changeset
869 ;; @r{This sample forms exploit most of the features of forms mode.}
Dave Love <fx@gnu.org>
parents:
diff changeset
870
Dave Love <fx@gnu.org>
parents:
diff changeset
871 ;; @r{Set the name of the data file.}
Dave Love <fx@gnu.org>
parents:
diff changeset
872 (setq forms-file "forms-d2.dat")
Dave Love <fx@gnu.org>
parents:
diff changeset
873
Dave Love <fx@gnu.org>
parents:
diff changeset
874 ;; @r{Use @code{forms-enumerate} to set field names and number thereof.}
Dave Love <fx@gnu.org>
parents:
diff changeset
875 (setq forms-number-of-fields
Dave Love <fx@gnu.org>
parents:
diff changeset
876 (forms-enumerate
Dave Love <fx@gnu.org>
parents:
diff changeset
877 '(arch-newsgroup ; 1
Dave Love <fx@gnu.org>
parents:
diff changeset
878 arch-volume ; 2
Dave Love <fx@gnu.org>
parents:
diff changeset
879 arch-issue ; and ...
Dave Love <fx@gnu.org>
parents:
diff changeset
880 arch-article ; ... so
Dave Love <fx@gnu.org>
parents:
diff changeset
881 arch-shortname ; ... ... on
Dave Love <fx@gnu.org>
parents:
diff changeset
882 arch-parts
Dave Love <fx@gnu.org>
parents:
diff changeset
883 arch-from
Dave Love <fx@gnu.org>
parents:
diff changeset
884 arch-longname
Dave Love <fx@gnu.org>
parents:
diff changeset
885 arch-keywords
Dave Love <fx@gnu.org>
parents:
diff changeset
886 arch-date
Dave Love <fx@gnu.org>
parents:
diff changeset
887 arch-remarks)))
Dave Love <fx@gnu.org>
parents:
diff changeset
888
Dave Love <fx@gnu.org>
parents:
diff changeset
889 ;; @r{The following functions are used by this form for layout purposes.}
Dave Love <fx@gnu.org>
parents:
diff changeset
890 ;;
Dave Love <fx@gnu.org>
parents:
diff changeset
891 (defun arch-tocol (target &optional fill)
Dave Love <fx@gnu.org>
parents:
diff changeset
892 "Produces a string to skip to column TARGET.
Dave Love <fx@gnu.org>
parents:
diff changeset
893 Prepends newline if needed.
Dave Love <fx@gnu.org>
parents:
diff changeset
894 The optional FILL should be a character, used to fill to the column."
Dave Love <fx@gnu.org>
parents:
diff changeset
895 (if (null fill)
Dave Love <fx@gnu.org>
parents:
diff changeset
896 (setq fill ? ))
Dave Love <fx@gnu.org>
parents:
diff changeset
897 (if (< target (current-column))
Dave Love <fx@gnu.org>
parents:
diff changeset
898 (concat "\n" (make-string target fill))
Dave Love <fx@gnu.org>
parents:
diff changeset
899 (make-string (- target (current-column)) fill)))
Dave Love <fx@gnu.org>
parents:
diff changeset
900 ;;
Dave Love <fx@gnu.org>
parents:
diff changeset
901 (defun arch-rj (target field &optional fill)
Dave Love <fx@gnu.org>
parents:
diff changeset
902 "Produces a string to skip to column TARGET\
Dave Love <fx@gnu.org>
parents:
diff changeset
903 minus the width of field FIELD.
Dave Love <fx@gnu.org>
parents:
diff changeset
904 Prepends newline if needed.
Dave Love <fx@gnu.org>
parents:
diff changeset
905 The optional FILL should be a character,
Dave Love <fx@gnu.org>
parents:
diff changeset
906 used to fill to the column."
Dave Love <fx@gnu.org>
parents:
diff changeset
907 (arch-tocol (- target (length (nth field forms-fields))) fill))
Dave Love <fx@gnu.org>
parents:
diff changeset
908
Dave Love <fx@gnu.org>
parents:
diff changeset
909 ;; @r{Record filters.}
Dave Love <fx@gnu.org>
parents:
diff changeset
910 ;;
Dave Love <fx@gnu.org>
parents:
diff changeset
911 (defun new-record-filter (the-record)
Dave Love <fx@gnu.org>
parents:
diff changeset
912 "Form a new record with some defaults."
Dave Love <fx@gnu.org>
parents:
diff changeset
913 (aset the-record arch-from (user-full-name))
Dave Love <fx@gnu.org>
parents:
diff changeset
914 (aset the-record arch-date (current-time-string))
Dave Love <fx@gnu.org>
parents:
diff changeset
915 the-record) ; return it
Dave Love <fx@gnu.org>
parents:
diff changeset
916 (setq forms-new-record-filter 'new-record-filter)
Dave Love <fx@gnu.org>
parents:
diff changeset
917
Dave Love <fx@gnu.org>
parents:
diff changeset
918 ;; @r{The format list.}
Dave Love <fx@gnu.org>
parents:
diff changeset
919 (setq forms-format-list
Dave Love <fx@gnu.org>
parents:
diff changeset
920 (list
Dave Love <fx@gnu.org>
parents:
diff changeset
921 "====== Public Domain Software Archive ======\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
922 arch-shortname
Dave Love <fx@gnu.org>
parents:
diff changeset
923 " - " arch-longname
Dave Love <fx@gnu.org>
parents:
diff changeset
924 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
925 "Article: " arch-newsgroup
Dave Love <fx@gnu.org>
parents:
diff changeset
926 "/" arch-article
Dave Love <fx@gnu.org>
parents:
diff changeset
927 " "
Dave Love <fx@gnu.org>
parents:
diff changeset
928 '(arch-tocol 40)
Dave Love <fx@gnu.org>
parents:
diff changeset
929 "Issue: " arch-issue
Dave Love <fx@gnu.org>
parents:
diff changeset
930 " "
Dave Love <fx@gnu.org>
parents:
diff changeset
931 '(arch-rj 73 10)
Dave Love <fx@gnu.org>
parents:
diff changeset
932 "Date: " arch-date
Dave Love <fx@gnu.org>
parents:
diff changeset
933 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
934 "Submitted by: " arch-from
Dave Love <fx@gnu.org>
parents:
diff changeset
935 "\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
936 '(arch-tocol 79 ?-)
Dave Love <fx@gnu.org>
parents:
diff changeset
937 "\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
938 "Keywords: " arch-keywords
Dave Love <fx@gnu.org>
parents:
diff changeset
939 "\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
940 "Parts: " arch-parts
Dave Love <fx@gnu.org>
parents:
diff changeset
941 "\n\n====== Remarks ======\n\n"
Dave Love <fx@gnu.org>
parents:
diff changeset
942 arch-remarks
Dave Love <fx@gnu.org>
parents:
diff changeset
943 ))
Dave Love <fx@gnu.org>
parents:
diff changeset
944
Dave Love <fx@gnu.org>
parents:
diff changeset
945 ;; @r{That's all, folks!}
Dave Love <fx@gnu.org>
parents:
diff changeset
946 @end example
Dave Love <fx@gnu.org>
parents:
diff changeset
947
Dave Love <fx@gnu.org>
parents:
diff changeset
948 @node Credits
Dave Love <fx@gnu.org>
parents:
diff changeset
949 @chapter Credits
Dave Love <fx@gnu.org>
parents:
diff changeset
950
Dave Love <fx@gnu.org>
parents:
diff changeset
951 Bug fixes and other useful suggestions were supplied by
Dave Love <fx@gnu.org>
parents:
diff changeset
952 Harald Hanche-Olsen (@code{hanche@@imf.unit.no}),
Dave Love <fx@gnu.org>
parents:
diff changeset
953 @code{cwitty@@portia.stanford.edu},
Dave Love <fx@gnu.org>
parents:
diff changeset
954 Jonathan I. Kamens,
Dave Love <fx@gnu.org>
parents:
diff changeset
955 Per Cederqvist (@code{ceder@@signum.se}),
Dave Love <fx@gnu.org>
parents:
diff changeset
956 Michael Lipka (@code{lipka@@lip.hanse.de}),
Dave Love <fx@gnu.org>
parents:
diff changeset
957 Andy Piper (@code{ajp@@eng.cam.ac.uk}),
Dave Love <fx@gnu.org>
parents:
diff changeset
958 Frederic Pierresteguy (@code{F.Pierresteguy@@frcl.bull.fr}),
Dave Love <fx@gnu.org>
parents:
diff changeset
959 Ignatios Souvatzis
Dave Love <fx@gnu.org>
parents:
diff changeset
960 and Richard Stallman (@code{rms@@gnu.org}).
Dave Love <fx@gnu.org>
parents:
diff changeset
961
Dave Love <fx@gnu.org>
parents:
diff changeset
962 This documentation was slightly inspired by the documentation of ``rolo
Dave Love <fx@gnu.org>
parents:
diff changeset
963 mode'' by Paul Davis at Schlumberger Cambridge Research
Dave Love <fx@gnu.org>
parents:
diff changeset
964 (@code{davis%scrsu1%sdr.slb.com@@relay.cs.net}).
Dave Love <fx@gnu.org>
parents:
diff changeset
965
Dave Love <fx@gnu.org>
parents:
diff changeset
966 None of this would have been possible without GNU Emacs of the Free
Dave Love <fx@gnu.org>
parents:
diff changeset
967 Software Foundation. Thanks, Richard!
Dave Love <fx@gnu.org>
parents:
diff changeset
968
Dave Love <fx@gnu.org>
parents:
diff changeset
969 @node Index
Dave Love <fx@gnu.org>
parents:
diff changeset
970 @unnumbered Index
Dave Love <fx@gnu.org>
parents:
diff changeset
971 @printindex cp
Dave Love <fx@gnu.org>
parents:
diff changeset
972
Dave Love <fx@gnu.org>
parents:
diff changeset
973 @contents
Dave Love <fx@gnu.org>
parents:
diff changeset
974 @bye