(rmail-retry-failure): Bind inhibit-read-only.
[bpt/emacs.git] / lisp / forms.el
index 15e0303..9466077 100644 (file)
@@ -1,7 +1,8 @@
-;;; forms.el -- Forms mode: edit a file as a form to fill in.
-;;; Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc.
+;;; forms.el --- Forms mode: edit a file as a form to fill in
 
-;; Author: Johan Vromans <jv@nl.net>
+;; Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc.
+
+;; Author: Johan Vromans <jvromans@squirrel.nl>
 
 ;; This file is part of GNU Emacs.
 
@@ -39,7 +40,7 @@
 ;;; Forms mode means visiting a data file which is supposed to consist
 ;;; of records each containing a number of fields.  The records are
 ;;; separated by a newline, the fields are separated by a user-defined
-;;; field separater (default: TAB).
+;;; field separator (default: TAB).
 ;;; When shown, a record is transferred to an Emacs buffer and
 ;;; presented using a user-defined form.  One record is shown at a
 ;;; time.
@@ -53,7 +54,7 @@
 ;;; will be buried, for it is never accessed directly.
 ;;;
 ;;; Forms mode is invoked using M-x forms-find-file control-file .
-;;; Alternativily `forms-find-file-other-window' can be used.
+;;; Alternatively `forms-find-file-other-window' can be used.
 ;;;
 ;;; You may also visit the control file, and switch to forms mode by hand
 ;;; with M-x forms-mode .
 ;;;                    If no write access to the data file is
 ;;;                    possible, view mode is enforced. 
 ;;;
+;;;     forms-check-number-of-fields            [bool, default t]
+;;;                   If non-nil, a warning will be issued whenever
+;;;                   a record is found that does not have the number
+;;;                   of fields specified by `forms-number-of-fields'.
+;;;
 ;;;    forms-multi-line                        [string, default "^K"]
 ;;;                    If non-null the records of the data file may
 ;;;                    contain fields that can span multiple lines in
 ;;;                    the form.
 ;;;                    This variable denotes the separator character
 ;;;                    to be used for this purpose.  Upon display, all
-;;;                    occurrencies of this character are translated
+;;;                    occurrences of this character are translated
 ;;;                    to newlines.  Upon storage they are translated
 ;;;                    back to the separator character.
 ;;;
 ;;; is left.  The contents of the form are parsed using information
 ;;; obtained from `forms-format-list', and the fields which are
 ;;; deduced from the form are modified.  Fields not shown on the forms
-;;; retain their origional values.  The newly formed record then
+;;; retain their original values.  The newly formed record then
 ;;; replaces the contents of the old record in `forms--file-buffer'.
 ;;; A parse routine `forms--parser' is built upon startup to parse
 ;;; the records.
 (provide 'forms)                       ;;; official
 (provide 'forms-mode)                  ;;; for compatibility
 
-(defconst forms-version (substring "$Revision: 2.14 $" 11 -2)
+(defconst forms-version (substring "$Revision: 2.23 $" 11 -2)
   "The version number of forms-mode (as string).  The complete RCS id is:
 
-  $Id: forms.el,v 2.14 1995/04/25 17:44:28 rms Exp rms $")
+  $Id: forms.el,v 2.23 1995/11/16 20:04:57 jvromans Exp kwzh $")
 
 (defvar forms-mode-hooks nil
   "Hook functions to be run upon entering Forms mode.")
 \f
 ;;; Optional variables with default values.
 
+(defvar forms-check-number-of-fields t
+  "*If non-nil, warn about records with wrong number of fields.")
+
 (defvar forms-field-sep "\t"
   "Field separator character (default TAB).")
 
@@ -619,7 +628,7 @@ Commands:                        Equivalent keys in read-only mode:
          (save-excursion
            (set-buffer forms--file-buffer)
            (make-variable-buffer-local 'local-write-file-hooks)
-           (setq local-write-file-hooks write-file-filter)))))
+           (setq local-write-file-hooks (list write-file-filter))))))
 
   ;; count the number of records, and set see if it may be modified
   (let (ro)
@@ -692,7 +701,7 @@ Commands:                        Equivalent keys in read-only mode:
   ;; of the fields on the display. This array is used by 
   ;; `forms--parser-using-text-properties' to extract the fields data
   ;; from the form on the screen.
-  ;; Upon completion, `forms-format-list' is garanteed correct, so
+  ;; Upon completion, `forms-format-list' is guaranteed correct, so
   ;; `forms--make-format' and `forms--make-parser' do not need to perform
   ;; any checks.
 
@@ -1084,9 +1093,9 @@ Commands:                        Equivalent keys in read-only mode:
        (if (setq there 
                  (next-single-property-change here 'read-only))
            (aset forms--recordv (aref forms--elements i)
-                 (buffer-substring here there))
+                 (buffer-substring-no-properties here there))
          (aset forms--recordv (aref forms--elements i)
-               (buffer-substring here (point-max)))))
+               (buffer-substring-no-properties here (point-max)))))
       (setq i (1+ i)))))
 
 (defun forms--make-parser-elt (el)
@@ -1108,7 +1117,7 @@ Commands:                        Equivalent keys in read-only mode:
   ;;     (setq here (point))
   ;;     (if (not (search-forward "\nmore text: " nil t nil))
   ;;       (error "Parse error: cannot find \"\\nmore text: \""))
-  ;;     (aset forms--recordv 5 (buffer-substring here (- (point) 12)))
+  ;;     (aset forms--recordv 5 (buffer-substring-no-properties here (- (point) 12)))
   ;;
   ;;    ;;  (tocol 40)
   ;;   (let ((forms--dyntext (car-safe forms--dynamic-text)))
@@ -1118,7 +1127,7 @@ Commands:                        Equivalent keys in read-only mode:
   ;;     (setq forms--dynamic-text (cdr-safe forms--dynamic-text)))
   ;;     ... 
   ;;     ;; final flush (due to terminator sentinel, see below)
-  ;;   (aset forms--recordv 7 (buffer-substring (point) (point-max)))
+  ;;   (aset forms--recordv 7 (buffer-substring-no-properties (point) (point-max)))
 
   (cond
    ((stringp el)
@@ -1128,7 +1137,7 @@ Commands:                        Equivalent keys in read-only mode:
                (if (not (search-forward (, el) nil t nil))
                    (error "Parse error: cannot find \"%s\"" (, el)))
                (aset forms--recordv (, (1- forms--field))
-                     (buffer-substring here
+                     (buffer-substring-no-properties here
                                        (- (point) (, (length el)))))))
          (` ((if (not (looking-at (, (regexp-quote el))))
                  (error "Parse error: not looking at \"%s\"" (, el)))
@@ -1144,7 +1153,7 @@ Commands:                        Equivalent keys in read-only mode:
    ((null el)
     (if forms--field
        (` ((aset forms--recordv (, (1- forms--field))
-                 (buffer-substring (point) (point-max)))))))
+                 (buffer-substring-no-properties (point) (point-max)))))))
    ((listp el)
     (prog1
        (if forms--field
@@ -1153,7 +1162,7 @@ Commands:                        Equivalent keys in read-only mode:
                  (if (not (search-forward forms--dyntext nil t nil))
                      (error "Parse error: cannot find \"%s\"" forms--dyntext))
                  (aset forms--recordv (, (1- forms--field))
-                       (buffer-substring here
+                       (buffer-substring-no-properties here
                                          (- (point) (length forms--dyntext)))))))
          (` ((let ((forms--dyntext (aref forms--dyntexts (, forms--dyntext))))
                (if (not (looking-at (regexp-quote forms--dyntext)))
@@ -1273,19 +1282,19 @@ Commands:                        Equivalent keys in read-only mode:
   (define-key map [menu-bar forms menu-forms-sep1]
     '("----"))
   (define-key map [menu-bar forms menu-forms-save]
-    '("Save data" . forms-save-buffer))
+    '("Save Data" . forms-save-buffer))
   (define-key map [menu-bar forms menu-forms-print]
-    '("Print data" . forms-print))
+    '("Print Data" . forms-print))
   (define-key map [menu-bar forms menu-forms-describe]
-    '("Describe mode" . describe-mode))
+    '("Describe Mode" . describe-mode))
   (define-key map [menu-bar forms menu-forms-toggle-ro]
     '("Toggle View/Edit" . forms-toggle-read-only))
   (define-key map [menu-bar forms menu-forms-jump-record]
     '("Jump" . forms-jump-record))
   (define-key map [menu-bar forms menu-forms-search-backward]
-    '("Search backward" . forms-search-backward))
+    '("Search Backward" . forms-search-backward))
   (define-key map [menu-bar forms menu-forms-search-forward]
-    '("Search forward" . forms-search-forward))
+    '("Search Forward" . forms-search-forward))
   (define-key map [menu-bar forms menu-forms-delete-record]
     '("Delete" . forms-delete-record))
   (define-key map [menu-bar forms menu-forms-insert-record]
@@ -1293,19 +1302,19 @@ Commands:                        Equivalent keys in read-only mode:
   (define-key map [menu-bar forms menu-forms-sep2]
     '("----"))
   (define-key map [menu-bar forms menu-forms-last-record]
-    '("Last record" . forms-last-record))
+    '("Last Record" . forms-last-record))
   (define-key map [menu-bar forms menu-forms-first-record]
-    '("First record" . forms-first-record))
+    '("First Record" . forms-first-record))
   (define-key map [menu-bar forms menu-forms-prev-record]
-    '("Previous record" . forms-prev-record))
+    '("Previous Record" . forms-prev-record))
   (define-key map [menu-bar forms menu-forms-next-record]
-    '("Next record" . forms-next-record))
+    '("Next Record" . forms-next-record))
   (define-key map [menu-bar forms menu-forms-sep3]
     '("----"))
   (define-key map [menu-bar forms menu-forms-prev-field]
-    '("Previous field" . forms-prev-field))
+    '("Previous Field" . forms-prev-field))
   (define-key map [menu-bar forms menu-forms-next-field]
-    '("Next field" . forms-next-field))
+    '("Next Field" . forms-next-field))
   (put 'forms-insert-record 'menu-enable '(not forms-read-only))
   (put 'forms-delete-record 'menu-enable '(not forms-read-only))
 )
@@ -1319,19 +1328,19 @@ Commands:                        Equivalent keys in read-only mode:
   (define-key map [menu-bar forms menu-forms-edit-sep1]
     '("----"))
   (define-key map [menu-bar forms menu-forms-edit-save]
-    '("Save data" . forms-save-buffer))
+    '("Save Data" . forms-save-buffer))
   (define-key map [menu-bar forms menu-forms-edit-print]
-    '("Print data" . forms-print))
+    '("Print Data" . forms-print))
   (define-key map [menu-bar forms menu-forms-edit-describe]
-    '("Describe mode" . describe-mode))
+    '("Describe Mode" . describe-mode))
   (define-key map [menu-bar forms menu-forms-edit-toggle-ro]
     '("Toggle View/Edit" . forms-toggle-read-only))
   (define-key map [menu-bar forms menu-forms-edit-jump-record]
     '("Jump" . forms-jump-record))
   (define-key map [menu-bar forms menu-forms-edit-search-backward]
-    '("Search backward" . forms-search-backward))
+    '("Search Backward" . forms-search-backward))
   (define-key map [menu-bar forms menu-forms-edit-search-forward]
-    '("Search forward" . forms-search-forward))
+    '("Search Forward" . forms-search-forward))
   (define-key map [menu-bar forms menu-forms-edit-delete-record]
     '("Delete" . forms-delete-record))
   (define-key map [menu-bar forms menu-forms-edit-insert-record]
@@ -1339,19 +1348,19 @@ Commands:                        Equivalent keys in read-only mode:
   (define-key map [menu-bar forms menu-forms-edit-sep2]
     '("----"))
   (define-key map [menu-bar forms menu-forms-edit-last-record]
-    '("Last record" . forms-last-record))
+    '("Last Record" . forms-last-record))
   (define-key map [menu-bar forms menu-forms-edit-first-record]
-    '("First record" . forms-first-record))
+    '("First Record" . forms-first-record))
   (define-key map [menu-bar forms menu-forms-edit-prev-record]
-    '("Previous record" . forms-prev-record))
+    '("Previous Record" . forms-prev-record))
   (define-key map [menu-bar forms menu-forms-edit-next-record]
-    '("Next record" . forms-next-record))
+    '("Next Record" . forms-next-record))
   (define-key map [menu-bar forms menu-forms-edit-sep3]
     '("----"))
   (define-key map [menu-bar forms menu-forms-edit-prev-field]
-    '("Previous field" . forms-prev-field))
+    '("Previous Field" . forms-prev-field))
   (define-key map [menu-bar forms menu-forms-edit-next-field]
-    '("Next field" . forms-next-field))
+    '("Next Field" . forms-next-field))
   (put 'forms-insert-record 'menu-enable '(not forms-read-only))
   (put 'forms-delete-record 'menu-enable '(not forms-read-only))
 )
@@ -1453,7 +1462,7 @@ Commands:                        Equivalent keys in read-only mode:
   (let ((here (point)))
     (prog2
      (end-of-line)
-     (buffer-substring here (point))
+     (buffer-substring-no-properties here (point))
      (goto-char here))))
 
 (defun forms--show-record (the-record)
@@ -1484,9 +1493,11 @@ Commands:                        Equivalent keys in read-only mode:
   ;; Verify the number of fields, extend forms--the-record-list if needed.
   (if (= (length forms--the-record-list) forms-number-of-fields)
       nil
-    (beep)
-    (message "Warning: this record has %d fields instead of %d"
-            (length forms--the-record-list) forms-number-of-fields)
+    (if (null forms-check-number-of-fields)
+       nil
+      (beep)
+      (message "Warning: this record has %d fields instead of %d"
+              (length forms--the-record-list) forms-number-of-fields))
     (if (< (length forms--the-record-list) forms-number-of-fields)
        (setq forms--the-record-list 
              (append forms--the-record-list
@@ -1695,7 +1706,7 @@ As a side effect: re-calculates the number of records in the data file."
 (defun forms-toggle-read-only (arg)
   "Toggles read-only mode of a forms mode buffer.
 With an argument, enables read-only mode if the argument is positive.
-Otherwise enables edit mode if the visited file is writeable."
+Otherwise enables edit mode if the visited file is writable."
 
   (interactive "P")
 
@@ -1973,7 +1984,7 @@ Calls `forms-write-file-filter' before writing out the data."
 (defun forms-enumerate (the-fields)
   "Take a quoted list of symbols, and set their values to sequential numbers.
 The first symbol gets number 1, the second 2 and so on.
-It returns the higest number.
+It returns the highest number.
 
 Usage: (setq forms-number-of-fields
              (forms-enumerate