Next: , Previous: Error Messages, Up: Top

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!