changeset 61520:edf4e619593c

Move to the emacs-lisp subdir.
author Lute Kamstra <lute@gnu.org>
date Wed, 13 Apr 2005 08:53:41 +0000
parents 6cf26dc690b2
children 2f8b7bd746aa
files lisp/generic.el
diffstat 1 files changed, 0 insertions(+), 345 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/generic.el	Wed Apr 13 04:58:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,345 +0,0 @@
-;;; generic.el --- defining simple major modes with comment and font-lock
-;;
-;; Copyright (C) 1997, 1999, 2004, 2005 Free Software Foundation, Inc.
-;;
-;; Author:  Peter Breton <pbreton@cs.umb.edu>
-;; Created: Fri Sep 27 1996
-;; Keywords: generic, comment, font-lock
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; INTRODUCTION:
-;;
-;; The macro `define-generic-mode' can be used to define small modes
-;; which provide basic comment and font-lock support.  These modes are
-;; intended for the many configuration files and such which are too
-;; small for a "real" mode, but still have a regular syntax, comment
-;; characters and the like.
-;;
-;; Each generic mode can define the following:
-;;
-;; * List of comment-characters.  The entries in this list should be
-;;   either a character, a one or two character string or a cons pair.
-;;   If the entry is a character or a string, it is added to the
-;;   mode's syntax table with `comment-start' syntax.  If the entry is
-;;   a cons pair, the elements of the pair are considered to be
-;;   `comment-start' and `comment-end' respectively.  (The latter
-;;   should be nil if you want comments to end at end of line.)
-;;   LIMITATIONS: Emacs does not support comment strings of more than
-;;   two characters in length.
-;;
-;; * List of keywords to font-lock.  Each keyword should be a string.
-;;   If you have additional keywords which should be highlighted in a
-;;   face different from `font-lock-keyword-face', you can use the
-;;   convenience function `generic-make-keywords-list' (which see),
-;;   and add the result to the following list:
-;;
-;; * Additional expressions to font-lock.  This should be a list of
-;;   expressions, each of which should be of the same form as those in
-;;   `font-lock-keywords'.
-;;
-;; * List of regular expressions to be placed in auto-mode-alist.
-;;
-;; * List of functions to call to do some additional setup
-;;
-;; This should pretty much cover basic functionality; if you need much
-;; more than this, or you find yourself writing extensive customizations,
-;; perhaps you should be writing a major mode instead!
-;;
-;; EXAMPLE:
-;;
-;; You can use `define-generic-mode' like this:
-;;
-;;   (define-generic-mode 'foo-generic-mode
-;;     (list ?%)
-;;     (list "keyword")
-;;     nil
-;;     (list "\\.FOO\\'")
-;;     (list 'foo-setup-function))
-;;
-;; to define a new generic-mode `foo-generic-mode', which has '%' as a
-;; comment character, and "keyword" as a keyword.  When files which
-;; end in '.FOO' are loaded, Emacs will go into foo-generic-mode and
-;; call foo-setup-function.  You can also use the function
-;; `foo-generic-mode' (which is interactive) to put a buffer into
-;; foo-generic-mode.
-;;
-;; GOTCHAS:
-;;
-;; Be careful that your font-lock definitions are correct.  Getting
-;; them wrong can cause Emacs to continually attempt to fontify! This
-;; problem is not specific to generic-mode.
-
-;; Credit for suggestions, brainstorming, help with debugging:
-;;   ACorreir@pervasive-sw.com (Alfred Correira)
-;; Extensive cleanup by:
-;;   Stefan Monnier (monnier+gnu/emacs@flint.cs.yale.edu)
-
-;;; Code:
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Internal Variables
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar generic-font-lock-keywords nil
-  "Keywords for `font-lock-defaults' in a generic mode.")
-(make-variable-buffer-local 'generic-font-lock-keywords)
-(defvaralias 'generic-font-lock-defaults 'generic-font-lock-keywords)
-(make-obsolete-variable 'generic-font-lock-defaults 'generic-font-lock-keywords "22.1")
-
-;;;###autoload
-(defvar generic-mode-list nil
-  "A list of mode names for `generic-mode'.
-Do not add entries to this list directly; use `define-generic-mode'
-instead (which see).")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;###autoload
-(defmacro define-generic-mode (mode comment-list keyword-list
-				    font-lock-list auto-mode-list
-				    function-list &optional docstring
-				    &rest custom-keyword-args)
-  "Create a new generic mode MODE.
-
-MODE is the name of the command for the generic mode; it need not
-be quoted.  The optional DOCSTRING is the documentation for the
-mode command.  If you do not supply it, a default documentation
-string will be used instead.
-
-COMMENT-LIST is a list, whose entries are either a single
-character, a one or two character string or a cons pair.  If the
-entry is a character or a string, it is added to the mode's
-syntax table with `comment-start' syntax.  If the entry is a cons
-pair, the elements of the pair are considered to be
-`comment-start' and `comment-end' respectively.  (The latter
-should be nil if you want comments to end at end of line.)  Note
-that Emacs has limitations regarding comment characters.
-
-KEYWORD-LIST is a list of keywords to highlight with
-`font-lock-keyword-face'.  Each keyword should be a string.
-
-FONT-LOCK-LIST is a list of additional expressions to highlight.
-Each entry in the list should have the same form as an entry in
-`font-lock-keywords'.
-
-AUTO-MODE-LIST is a list of regular expressions to add to
-`auto-mode-alist'.  These regexps are added to `auto-mode-alist'
-as soon as `define-generic-mode' is called.
-
-FUNCTION-LIST is a list of functions to call to do some
-additional setup.
-
-The optional CUSTOM-KEYWORD-ARGS are pairs of keywords and
-values.  They will be passed to the generated `defcustom' form of
-the mode hook variable MODE-hook.  Defaults to MODE without the
-possible trailing \"-mode\".  (This default may not be a valid
-customization group defined with `defgroup'.  Make sure it is.)
-You can specify keyword arguments without specifying a docstring.
-
-See the file generic-x.el for some examples of `define-generic-mode'."
-  (declare (debug (sexp def-form def-form def-form form def-form
-			[&optional stringp] &rest [keywordp form]))
-	   (indent 1))
-
-  ;; Backward compatibility.
-  (when (eq (car-safe mode) 'quote)
-    (setq mode (eval mode)))
-
-  (when (and docstring (not (stringp docstring)))
-    ;; DOCSTRING is not a string so we assume that it's actually the
-    ;; first keyword of CUSTOM-KEYWORD-ARGS.
-    (push docstring custom-keyword-args)
-    (setq docstring nil))
-
-  (let* ((name (symbol-name mode))
-	 (pretty-name (capitalize (replace-regexp-in-string
-				   "-mode\\'" "" name)))
-	 (mode-hook (intern (concat name "-hook"))))
-
-    (unless (plist-get custom-keyword-args :group)
-      (setq custom-keyword-args
-	    (plist-put custom-keyword-args 
-		       :group `',(intern (replace-regexp-in-string
-					  "-mode\\'" "" name)))))
-
-    `(progn
-       ;; Add a new entry.
-       (add-to-list 'generic-mode-list ,name)
-
-       ;; Add it to auto-mode-alist
-       (dolist (re ,auto-mode-list)
-	 (add-to-list 'auto-mode-alist (cons re ',mode)))
-
-       (defcustom ,mode-hook nil
-	 ,(concat "Hook run when entering " pretty-name " mode.")
-	 :type 'hook
-	 ,@custom-keyword-args)
-
-       (defun ,mode ()
-	 ,(or docstring
-	      (concat pretty-name " mode.\n"
-		      "This a generic mode defined with `define-generic-mode'."))
-	 (interactive)
-	 (generic-mode-internal ',mode ,comment-list ,keyword-list
-				,font-lock-list ,function-list)))))
-
-;;;###autoload
-(defun generic-mode-internal (mode comment-list keyword-list
-				   font-lock-list function-list)
-  "Go into the generic mode MODE."
-  (let* ((name (symbol-name mode))
-	 (pretty-name (capitalize (replace-regexp-in-string
-				   "-mode\\'" "" name)))
-	 (mode-hook (intern (concat name "-hook"))))
-
-    (kill-all-local-variables)
-
-    (setq major-mode mode
-	  mode-name pretty-name)
-
-    (generic-mode-set-comments comment-list)
-
-    ;; Font-lock functionality.
-    ;; Font-lock-defaults is always set even if there are no keywords
-    ;; or font-lock expressions, so comments can be highlighted.
-    (setq generic-font-lock-keywords font-lock-list)
-    (when keyword-list
-      (push (concat "\\_<" (regexp-opt keyword-list t) "\\_>")
-	    generic-font-lock-keywords))
-    (setq font-lock-defaults '(generic-font-lock-keywords nil))
-
-    ;; Call a list of functions
-    (mapcar 'funcall function-list)
-
-    (run-mode-hooks mode-hook)))
-
-;;;###autoload
-(defun generic-mode (mode)
-  "Enter generic mode MODE.
-
-Generic modes provide basic comment and font-lock functionality
-for \"generic\" files.  (Files which are too small to warrant their
-own mode, but have comment characters, keywords, and the like.)
-
-To define a generic-mode, use the function `define-generic-mode'.
-Some generic modes are defined in `generic-x.el'."
-  (interactive
-   (list (completing-read "Generic mode: " generic-mode-list nil t)))
-  (funcall (intern mode)))
-
-;;; Comment Functionality
-(defun generic-mode-set-comments (comment-list)
-  "Set up comment functionality for generic mode."
-  (let ((st (make-syntax-table))
-	(chars nil)
-	(comstyles))
-    (make-local-variable 'comment-start)
-    (make-local-variable 'comment-start-skip)
-    (make-local-variable 'comment-end)
-
-    ;; Go through all the comments
-    (dolist (start comment-list)
-      (let (end (comstyle ""))
-	;; Normalize
-	(when (consp start)
-	  (setq end (cdr start))
-	  (setq start (car start)))
-	(when (char-valid-p start) (setq start (char-to-string start)))
-	(cond
-	 ((char-valid-p end)   (setq end (char-to-string end)))
-	 ((zerop (length end)) (setq end "\n")))
-
-	;; Setup the vars for `comment-region'
-	(if comment-start
-	    ;; We have already setup a comment-style, so use style b
-	    (progn
-	      (setq comstyle "b")
-	      (setq comment-start-skip
-		    (concat comment-start-skip "\\|" (regexp-quote start) "+\\s-*")))
-	  ;; First comment-style
-	  (setq comment-start start)
-	  (setq comment-end (if (string-equal end "\n") "" end))
-	  (setq comment-start-skip (concat (regexp-quote start) "+\\s-*")))
-
-       ;; Reuse comstyles if necessary
-       (setq comstyle
-             (or (cdr (assoc start comstyles))
-                 (cdr (assoc end comstyles))
-                 comstyle))
-       (push (cons start comstyle) comstyles)
-       (push (cons end comstyle) comstyles)
-
-	;; Setup the syntax table
-	(if (= (length start) 1)
-	    (modify-syntax-entry (string-to-char start)
-				 (concat "< " comstyle) st)
-	  (let ((c0 (elt start 0)) (c1 (elt start 1)))
-	    ;; Store the relevant info but don't update yet
-	    (push (cons c0 (concat (cdr (assoc c0 chars)) "1")) chars)
-	    (push (cons c1 (concat (cdr (assoc c1 chars))
-				   (concat "2" comstyle))) chars)))
-	(if (= (length end) 1)
-	    (modify-syntax-entry (string-to-char end)
-				 (concat ">" comstyle) st)
-	  (let ((c0 (elt end 0)) (c1 (elt end 1)))
-	    ;; Store the relevant info but don't update yet
-	    (push (cons c0 (concat (cdr (assoc c0 chars))
-				   (concat "3" comstyle))) chars)
-	    (push (cons c1 (concat (cdr (assoc c1 chars)) "4")) chars)))))
-
-    ;; Process the chars that were part of a 2-char comment marker
-    (dolist (cs (nreverse chars))
-      (modify-syntax-entry (car cs)
-			   (concat (char-to-string (char-syntax (car cs)))
-				   " " (cdr cs))
-			   st))
-    (set-syntax-table st)))
-
-(defun generic-bracket-support ()
-  "Imenu support for [KEYWORD] constructs found in INF, INI and Samba files."
-  (setq imenu-generic-expression
-	'((nil "^\\[\\(.*\\)\\]" 1))
-        imenu-case-fold-search t))
-
-;;;###autoload
-(defun generic-make-keywords-list (keyword-list face &optional prefix suffix)
-  "Return a `font-lock-keywords' construct that highlights KEYWORD-LIST.
-KEYWORD-LIST is a list of keyword strings that should be
-highlighted with face FACE.  This function calculates a regular
-expression that matches these keywords and concatenates it with
-PREFIX and SUFFIX.  Then it returns a construct based on this
-regular expression that can be used as an element of
-`font-lock-keywords'."
-  (unless (listp keyword-list)
-    (error "Keywords argument must be a list of strings"))
-  (list (concat prefix "\\_<"
-		;; Use an optimized regexp.
-		(regexp-opt keyword-list t)
-		"\\_>" suffix)
-	1
-	face))
-
-(provide 'generic)
-
-;; arch-tag: 239c1fc4-1303-48d9-9ac0-657d655669ea
-;;; generic.el ends here