X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/4dc7c8d5795458e89d19b59f64760e155c2cd70b..c430f7e23fc2c22f251ace4254e37dea1452dfc3:/lisp/forms.el diff --git a/lisp/forms.el b/lisp/forms.el index 4626b28f46..b068352e6e 100644 --- a/lisp/forms.el +++ b/lisp/forms.el @@ -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 @@ -296,9 +297,6 @@ ;;; 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.") +(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))) )) -(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