10 Long Example

The following example exploits most of the features of Forms mode. This example is included in the distribution as file etc/forms/forms-d2.el.

;; demo2 -- demo forms-mode     -*- emacs-lisp -*-

;; This sample forms exploit most of the features of forms mode.

;; Set the name of the data file.
(setq forms-file
       (expand-file-name "forms/forms-d2.dat" data-directory))

;; Use forms-enumerate to set field names and number thereof.
(setq forms-number-of-fields
      (forms-enumerate
       '(arch-newsgroup                 ; 1
         arch-volume                    ; 2
         arch-issue                     ; and ...
         arch-article                   ; ... so
         arch-shortname                 ; ... ... on
         arch-parts
         arch-from
         arch-longname
         arch-keywords
         arch-date
         arch-remarks)))

;; The following functions are used by this form for layout purposes.
;;
(defun arch-tocol (target &optional fill)
  "Produces a string to skip to column TARGET.
Prepends newline if needed.
The optional FILL should be a character, used to fill to the column."
  (if (null fill)
      (setq fill ? ))
  (if (< target (current-column))
      (concat "\n" (make-string target fill))
    (make-string (- target (current-column)) fill)))
;;
(defun arch-rj (target field &optional fill)
  "Produces a string to skip to column TARGET\
 minus the width of field FIELD.
Prepends newline if needed.
The optional FILL should be a character,
used to fill to the column."
  (arch-tocol (- target (length (nth field forms-fields))) fill))

;; Record filters.
;;
(defun new-record-filter (the-record)
  "Form a new record with some defaults."
  (aset the-record arch-from (user-full-name))
  (aset the-record arch-date (current-time-string))
  the-record)                           ; return it
(setq forms-new-record-filter 'new-record-filter)

;; The format list.
(setq forms-format-list
     (list
       "====== Public Domain Software Archive ======\n\n"
       arch-shortname
       " - "                    arch-longname
       "\n\n"
       "Article: "              arch-newsgroup
       "/"                      arch-article
       " "
       '(arch-tocol 40)
       "Issue: "                arch-issue
       " "
       '(arch-rj 73 10)
       "Date: "                 arch-date
       "\n\n"
       "Submitted by: "         arch-from
       "\n"
       '(arch-tocol 79 ?-)
       "\n"
       "Keywords: "             arch-keywords
       "\n\n"
       "Parts: "                arch-parts
       "\n\n====== Remarks ======\n\n"
       arch-remarks
     ))

;; That’s all, folks!