]> code.delx.au - gnu-emacs/blobdiff - lisp/forms.el
Include versioned preloaded libraries in `package--builtin-versions'
[gnu-emacs] / lisp / forms.el
index 4626b28f46435a3090c0391a28c408b3e5881eff..b068352e6ebb23baac04548617a78fcdcfd9b516 100644 (file)
@@ -1,6 +1,7 @@
 ;;; forms.el --- Forms mode: edit a file as a form to fill in
 
-;; Copyright (C) 1991, 1994-1997, 2001-2012 Free Software Foundation, Inc.
+;; Copyright (C) 1991, 1994-1997, 2001-2016 Free Software Foundation,
+;; Inc.
 
 ;; Author: Johan Vromans <jvromans@squirrel.nl>
 
 
 ;;; Global variables and constants:
 
-(provide 'forms)                       ;;; official
-(provide 'forms-mode)                  ;;; for compatibility
-
 (defcustom forms-mode-hook nil
   "Hook run upon entering Forms mode."
   :group 'forms
@@ -438,8 +436,11 @@ Also, initial position is at last record."
 (defvar forms--rw-face nil
   "Face used to represent read-write data on the screen.")
 \f
+(defvar read-file-filter) ; bound in forms--intuit-from-file
+
 ;;;###autoload
 (defun forms-mode (&optional primary)
+  ;; FIXME: use define-derived-mode
   "Major mode to visit files in a field-structured manner using a form.
 
 Commands:                        Equivalent keys in read-only mode:
@@ -588,7 +589,14 @@ Commands:                        Equivalent keys in read-only mode:
        (make-local-variable 'forms--dynamic-text)
 
        ;; Prevent accidental overwrite of the control file and auto-save.
-       (set-visited-file-name nil)
+        ;; We bind change-major-mode-with-file-name to nil to prevent
+        ;; set-visited-file-name from calling set-auto-mode, which
+        ;; might kill all local variables and set forms-file nil,
+        ;; which will then barf in find-file-noselect below.  This can
+        ;; happen when the user sets the default major mode that is
+        ;; different from the Fundamental mode.
+        (let (change-major-mode-with-file-name)
+          (set-visited-file-name nil))
 
        ;; Prepare this buffer for further processing.
        (setq buffer-read-only nil)
@@ -634,6 +642,8 @@ Commands:                        Equivalent keys in read-only mode:
   (setq major-mode 'forms-mode)
   (setq mode-name "Forms")
 
+  (cursor-intangible-mode 1)
+
   ;; find the data file
   (setq forms--file-buffer (find-file-noselect forms-file))
 
@@ -644,7 +654,7 @@ Commands:                        Equivalent keys in read-only mode:
        (with-current-buffer forms--file-buffer
          (let ((inhibit-read-only t)
                (file-modified (buffer-modified-p)))
-           (run-hooks 'read-file-filter)
+           (mapc #'funcall read-file-filter)
            (if (not file-modified) (set-buffer-modified-p nil)))
          (if write-file-filter
              (add-hook 'write-file-functions write-file-filter nil t)))
@@ -689,10 +699,12 @@ Commands:                        Equivalent keys in read-only mode:
        (insert
         "GNU Emacs Forms Mode\n\n"
         (if (file-exists-p forms-file)
-            (concat "No records available in file `" forms-file "'\n\n")
-          (format "Creating new file `%s'\nwith %d field%s per record\n\n"
-                  forms-file forms-number-of-fields
-                  (if (= 1 forms-number-of-fields) "" "s")))
+            (format-message
+             "No records available in file `%s'\n\n" forms-file)
+          (format-message
+           "Creating new file `%s'\nwith %d field%s per record\n\n"
+           forms-file forms-number-of-fields
+           (if (= 1 forms-number-of-fields) "" "s")))
         "Use " (substitute-command-keys "\\[forms-insert-record]")
         " to create new records.\n")
        (setq forms--current-record 1)
@@ -912,20 +924,20 @@ Commands:                        Equivalent keys in read-only mode:
         `(lambda (arg)
            (let ((inhibit-read-only t))
              ,@(apply 'append
-                      (mapcar 'forms--make-format-elt-using-text-properties
+                      (mapcar #'forms--make-format-elt-using-text-properties
                               forms-format-list))
              ;; Prevent insertion before the first text.
              ,@(if (numberp (car forms-format-list))
                    nil
                  '((add-text-properties (point-min) (1+ (point-min))
-                                        '(front-sticky (read-only intangible)))))
+                                        '(front-sticky (read-only cursor-intangible)))))
              ;; Prevent insertion after the last text.
              (remove-text-properties (1- (point)) (point)
                                      '(rear-nonsticky)))
            (setq forms--iif-start nil))
        `(lambda (arg)
          ,@(apply 'append
-                  (mapcar 'forms--make-format-elt forms-format-list)))))
+                  (mapcar #'forms--make-format-elt forms-format-list)))))
 
     ;; We have tallied the number of markers and dynamic texts,
     ;; so we can allocate the arrays now.
@@ -1002,10 +1014,10 @@ Commands:                        Equivalent keys in read-only mode:
         (point))
        (list 'face forms--ro-face      ; read-only appearance
             'read-only ,@(list (1+ forms--marker))
-            'intangible ,@(list (1+ forms--marker))
+            'cursor-intangible ,@(list (1+ forms--marker))
             'insert-in-front-hooks '(forms--iif-hook)
             'rear-nonsticky '(face read-only insert-in-front-hooks
-                                   intangible)))))
+                                   cursor-intangible)))))
 
    ((numberp el)
     `((let ((here (point)))
@@ -1031,10 +1043,10 @@ Commands:                        Equivalent keys in read-only mode:
         (point))
        (list 'face forms--ro-face
             'read-only ,@(list (1+ forms--marker))
-            'intangible ,@(list (1+ forms--marker))
+            'cursor-intangible ,@(list (1+ forms--marker))
             'insert-in-front-hooks '(forms--iif-hook)
             'rear-nonsticky '(read-only face insert-in-front-hooks
-                                        intangible)))))
+                                        cursor-intangible)))))
 
    ;; end of cond
    ))
@@ -1097,7 +1109,7 @@ Commands:                        Equivalent keys in read-only mode:
            (goto-char (point-min))
            ,@(apply 'append
                     (mapcar
-                     'forms--make-parser-elt
+                     #'forms--make-parser-elt
                      (append forms-format-list (list nil)))))))))
 
   (forms--debug 'forms--parser))
@@ -1197,8 +1209,6 @@ Commands:                        Equivalent keys in read-only mode:
       (setq forms--field nil)))
    ))
 \f
-(defvar read-file-filter) ; bound in forms--intuit-from-file
-
 (defun forms--intuit-from-file ()
   "Get number of fields and a default form using the data file."
 
@@ -1568,10 +1578,10 @@ As a side effect: sets `forms--the-record-list'."
     ;; Build new record.
     (setq forms--the-record-list (forms--parse-form))
     (setq the-record
-         (mapconcat 'identity forms--the-record-list forms-field-sep))
+         (mapconcat #'identity forms--the-record-list forms-field-sep))
 
-    (if (string-match (regexp-quote forms-field-sep)
-                     (mapconcat 'identity forms--the-record-list ""))
+    (if (string-match-p (regexp-quote forms-field-sep)
+                       (mapconcat #'identity forms--the-record-list ""))
        (error "Field separator occurs in record - update refused"))
 
     ;; Handle multi-line fields, if allowed.
@@ -1579,7 +1589,7 @@ As a side effect: sets `forms--the-record-list'."
        (forms--trans the-record "\n" forms-multi-line))
 
     ;; A final sanity check before updating.
-    (if (string-match "\n" the-record)
+    (if (string-match-p "\n" the-record)
        (error "Multi-line fields in this record - update refused"))
 
     (with-current-buffer forms--file-buffer
@@ -1754,7 +1764,7 @@ Otherwise enables edit mode if the visited file is writable."
 With ARG: store the record after the current one.
 If `forms-new-record-filter' contains the name of a function,
 it is called to fill (some of) the fields with default values.
-If `forms-insert-after is non-nil, the default behavior is to insert
+If `forms-insert-after' is non-nil, the default behavior is to insert
 after the current record."
 
   (interactive "P")
@@ -1778,11 +1788,7 @@ after the current record."
          (setq the-list (cdr (append the-fields nil))))
       (setq the-list (make-list forms-number-of-fields "")))
 
-    (setq the-record
-         (mapconcat
-         'identity
-         the-list
-         forms-field-sep))
+    (setq the-record (mapconcat #'identity the-list forms-field-sep))
 
     (with-current-buffer forms--file-buffer
       (forms--goto-record ln)
@@ -2058,4 +2064,6 @@ Usage: (setq forms-number-of-fields
          (goto-char (point-max))
          (insert ret)))))
 
+(provide 'forms-mode)                  ; for compatibility
+(provide 'forms)
 ;;; forms.el ends here