]> git.eshelyaron.com Git - emacs.git/commitdiff
Initial revision
authorRichard M. Stallman <rms@gnu.org>
Tue, 17 Mar 1998 23:49:33 +0000 (23:49 +0000)
committerRichard M. Stallman <rms@gnu.org>
Tue, 17 Mar 1998 23:49:33 +0000 (23:49 +0000)
lisp/generic-x.el [new file with mode: 0644]

diff --git a/lisp/generic-x.el b/lisp/generic-x.el
new file mode 100644 (file)
index 0000000..1f32147
--- /dev/null
@@ -0,0 +1,1246 @@
+;;; generic-x.el --- Extra Modes for generic-mode
+
+;; Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+
+;; Author:  Peter Breton <pbreton@cs.umb.edu>
+;; Created: Tue Oct 08 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:
+;;
+;; This file contains some pre-defined generic-modes.
+;; 
+;; INSTALLATION:
+;;
+;; Add this line to your .emacs file:
+;;
+;;   (require 'generic-x)
+;;
+;; You can decide which modes to load by setting the variable
+;; `generic-extras-enable-list'. Some platform-specific modes are
+;; affected by the variables `generic-define-mswindows-modes' and
+;; `generic-define-unix-modes' (which see).
+;; 
+;; You can also send in new modes; if the file types a reasonably common,
+;; we would like to install them.
+;;
+;; PROBLEMS WHEN USED WITH FOLDING MODE:
+;;
+;; From Anders Lindgren <andersl@csd.uu.se>
+;; 
+;; Problem summary: Wayne Adams has found a problem when using folding
+;; mode in conjuction with font-lock for a mode defined in
+;; `generic-x.el'.
+;;
+;; The problem, as Wayne described it, was that error messages of the
+;; following form appeared when both font-lock and folding are used:
+;; 
+;; >      - various msgs including "Fontifying region...(error Stack
+;; > overflow in regexp matcher)" appear
+;; 
+;; I have just tracked down the cause of the problem.  The regexp:s in
+;; `generic-x.el' does not take into account the way that folding
+;; hides sections of the buffer.  The technique is known as
+;; `selective-display' and has been available for a very long time (I
+;; started using it back in the good old' Emacs 18 days).  Basically, a
+;; section is hidden by creating one very long line were the newline
+;; character (C-j) is replaced by a linefeed (C-m) character.
+;; 
+;; Many other hiding packages, besides folding, use the same technique,
+;; the problem should occur when using them as well.
+;; 
+;; The erroronous lines in `generic-extras' look like the following (this
+;; example is from the `ini' section):
+;; 
+;;     '(("^\\(\\[.*\\]\\)"   1 'font-lock-reference-face)
+;;       ("^\\(.*\\)="        1 'font-lock-variable-name-face)
+;; 
+;; The intention of these lines is to highlight lines of the following
+;; form:
+;; 
+;; [foo]
+;; bar = xxx
+;; 
+;; However, since the `.' regexp symbol match the linefeed character the
+;; entire folded section is searched, resulting in a regexp stack
+;; overflow.
+;; 
+;; Solution suggestion 2: Instead of using ".", use the sequence
+;; "[^\n\r]".  This will make the rules behave just as before, but they
+;; will work together with selective-display.
+
+;;; Code:
+
+(require 'generic)
+(require 'font-lock)
+
+(defcustom generic-extras-enable-list nil
+  "*List of generic modes to enable by default.
+Each entry in the list should be a symbol.
+The variables `generic-define-mswindows-modes' and `generic-define-unix-modes'
+also affect which generic modes are defined.
+Please note that if you set this variable after generic-x is loaded, 
+you must reload generic-x to enable the specified modes."
+  :group 'generic-x
+  :type  '(repeat sexp) 
+  )
+
+(defcustom generic-define-mswindows-modes 
+  (memq system-type (list 'windows-nt 'ms-dos))
+  "*If non-nil, some MS-Windows specific generic modes will be defined."
+  :group 'generic-x
+  :type  'boolean
+  )
+
+(defcustom generic-define-unix-modes
+  (not (memq system-type (list 'windows-nt 'ms-dos)))
+  "*If non-nil, some Unix specific generic modes will be defined."
+  :group 'generic-x
+  :type  'boolean
+  )
+
+(and generic-define-mswindows-modes
+    (setq generic-extras-enable-list
+         (append (list 'bat-generic-mode 'ini-generic-mode 
+                       'inf-generic-mode 'rc-generic-mode 
+                       'reg-generic-mode 'rul-generic-mode)
+                 generic-extras-enable-list)))
+
+(and generic-define-unix-modes
+     (setq generic-extras-enable-list
+          (append (list 'apache-generic-mode 'samba-generic-mode 
+                        'hosts-generic-mode  'fvwm-generic-mode 
+                        'x-resource-generic-mode 
+                        )
+                  generic-extras-enable-list)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Generic-modes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Apache
+(and 
+ (memq 'apache-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'apache-generic-mode
+   (list ?#)  
+   nil 
+   '(("^\\(<.*>\\)"       1 'font-lock-reference-face)
+     ("^\\(\\sw+\\)\\s-"  1 'font-lock-variable-name-face))    
+   (list "srm\\.conf\\'" "httpd\\.conf\\'" "access\\.conf\\'")
+   nil 
+   "Generic mode for Apache or HTTPD configuration files."))
+;;; Samba
+(and 
+ (memq 'samba-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'samba-generic-mode
+   (list ?\;)
+   nil
+   '(("^\\(\\[.*\\]\\)"   1 'font-lock-reference-face))
+   (list "smb\\.conf\\'")
+   (list 'generic-bracket-support)
+   "Generic mode for Samba configuration files."))
+
+;;; Fvwm
+;; This is pretty basic. Also, modes for other window managers could
+;; be defined as well.
+(and 
+(memq 'fvwm-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'fvwm-generic-mode
+   (list ?#)
+   (list 
+    "AddToMenu"
+    "AddToFunc"
+    "ButtonStyle"
+    "EndFunction" 
+    "EndPopup"
+    "Function" 
+    "IconPath"
+    "Key"
+    "ModulePath"
+    "Mouse"
+    "PixmapPath"
+    "Popup" 
+    "Style" 
+    )
+   nil
+   (list "\\.fvwmrc\\'" "\\.fvwm2rc\\'")
+   nil
+   "Generic mode for FVWM configuration files."))
+
+;;; X Resource
+;; I'm pretty sure I've seen an actual mode to do this, but I don't
+;; think it's standard with Emacs
+(and 
+ (memq 'x-resource-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'x-resource-generic-mode
+   (list ?!)
+   nil
+   '(("^\\([^:\n]+:\\)" 1 'font-lock-variable-name-face))
+   (list "\\.Xdefaults\\'" "\\.Xresources\\'")
+   nil
+   "Generic mode for X Resource configuration files."))
+
+;;; Hosts
+(and 
+ (memq 'hosts-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'hosts-generic-mode
+   (list ?#)
+   (list "localhost")
+   '(("\\([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\\)" 1 'font-lock-reference-face))
+   (list "[hH][oO][sS][tT][sS]\\'")
+   nil
+   "Generic mode for HOSTS files."))
+
+;;; Windows INF files
+(and 
+ (memq 'inf-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'inf-generic-mode
+   (list ?\;)
+   nil 
+   '(("^\\(\\[.*\\]\\)"   1 'font-lock-reference-face))
+   (list "\\.[iI][nN][fF]\\'")
+   (list 'generic-bracket-support)
+   "Generic mode for MS-Windows INF files."))
+
+;;; Windows INI files
+;; Should define escape character as well!
+(and 
+ (memq 'ini-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'ini-generic-mode
+   (list ?\;)
+   nil
+   '(("^\\(\\[.*\\]\\)"   1 'font-lock-reference-face)
+     ("^\\([^=\n\r]*\\)=\\([^\n\r]*\\)$"
+      (1 font-lock-function-name-face)
+      (2 font-lock-variable-name-face)))
+   (list "\\.[iI][nN][iI]\\'")
+    (list 
+     (function
+      (lambda ()
+       (setq imenu-generic-expression 
+       '((nil "^\\[\\(.*\\)\\]" 1)
+         ("*Variables*" "^\\s-*\\([^=]+\\)\\s-*=" 1)))
+       )))
+    "Generic mode for MS-Windows INI files."))
+
+;;; Windows REG files
+;;; Unfortunately, Windows 95 and Windows NT have different REG file syntax!
+(and 
+ (memq 'reg-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'reg-generic-mode
+   '(?\;)
+   '("key" "classes_root" "REGEDIT" "REGEDIT4")
+   '(("\\(\\[.*]\\)"     1 'font-lock-reference-face)
+     ("^\\([^\n\r]*\\)\\s-*="  1 'font-lock-variable-name-face))
+   '("\\.[rR][eE][gG]\\'")
+    (list 
+     (function
+      (lambda ()
+       (setq imenu-generic-expression 
+       '((nil "^\\s-*\\(.*\\)\\s-*=" 1))))))
+    "Generic mode for MS-Windows Registry files."))
+
+;;; Windows BAT files
+(if (not (memq 'bat-generic-mode generic-extras-enable-list))
+    nil
+(define-generic-mode 'bat-generic-mode
+    nil
+    nil
+    (list
+     ;; Make this one first in the list, otherwise comments will
+     ;; be over-written by other variables
+     (list "^[@ \t]*\\([rR][eE][mM][^\n\r]*\\)" 1 'font-lock-comment-face t)
+     (list "^[ \t]*\\(::-.*\\)"                        1 'font-lock-comment-face t)
+     ;; These keywords appear as the first word on a line
+     (generic-make-keywords-list
+      (list
+       "[cC][aA][lL][lL]"
+       "[eE][cC][hH][oO]"
+       "[fF][oO][rR]"
+       "[iI][fF]"
+       "[pP][aA][tT][hH]"
+       "[pP][aA][uU][sS][eE]"
+       "[pP][rR][oO][mM][pP][tT]"
+       "[sS][eE][tT]"
+       "[sS][tT][aA][rR][tT]"
+       )
+      'font-lock-keyword-face "^[@ \t]*")
+     ;; These keywords can be anywhere on a line
+     (generic-make-keywords-list
+      (list
+       "[eE][xX][iI][sS][tT]"
+       "[eE][rR][rR][oO][rR][lL][eE][vV][eE][lL]"
+       "[gG][oO][tT][oO]"
+       "[nN][oO][tT]"
+       ) 'font-lock-keyword-face)
+     (list "^[ \t]*\\(:\\sw+\\)"         1 'font-lock-function-name-face t)
+     (list "\\(%\\sw+%\\)"              1 'font-lock-reference-face)
+     (list "\\(%[0-9]\\)"               1 'font-lock-reference-face)
+     (list "\\(/[^/ \"\t\n]+\\)"        1 'font-lock-type-face)
+     (list "[\t ]+\\([+-][^\t\n\" ]+\\)" 1 'font-lock-type-face)
+     (list "\\<\\([gG][oO][tT][oO]\\)\\>[ \t]*\\(\\sw+\\)?" 
+          '(1 font-lock-keyword-face)
+          '(2 font-lock-function-name-face nil t))
+     
+     )
+    (list "\\.[bB][aA][tT]\\'" "CONFIG\\." "AUTOEXEC\\." )
+    (list 'generic-bat-mode-setup-function)
+    "Generic mode for MS-Windows BAT files.")
+
+  (defvar bat-generic-mode-syntax-table nil
+    "Syntax table in use in bat-generic-mode buffers.")
+  
+  ;; Make underscores count as words
+  (if bat-generic-mode-syntax-table
+      nil
+    (setq bat-generic-mode-syntax-table (make-syntax-table))
+    (modify-syntax-entry ?_  "w"  bat-generic-mode-syntax-table))
+  
+  ;; bat-generic-mode doesn't use the comment functionality of generic-mode
+  ;; because it has a three-letter comment-string, so we do it
+  ;; here manually instead
+  (defun generic-bat-mode-setup-function ()
+    (make-local-variable            'parse-sexp-ignore-comments)
+    (make-local-variable            'comment-start)
+    (make-local-variable            'comment-start-skip)
+    (make-local-variable            'comment-end)
+    (setq imenu-generic-expression  '((nil "^:\\(\\sw+\\)" 1))
+         parse-sexp-ignore-comments t
+         comment-end                ""
+         comment-start              "[Rr][Ee][Mm] "
+         comment-start-skip         "[Rr][Ee][Mm] *"
+         )
+    (set-syntax-table        bat-generic-mode-syntax-table)
+    )
+  )
+
+;;; Mailagent
+;; Mailagent is a Unix mail filtering program. Anyone wanna do a generic mode
+;; for procmail?
+(and 
+ (memq 'mailagent-rules-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'mailagent-rules-generic-mode
+   (list ?#)  
+   (list "SAVE" "DELETE" "PIPE" "ANNOTATE" "REJECT")
+   '(("^\\(\\sw+\\)\\s-*="         1 'font-lock-variable-name-face)
+     ("\\s-/\\([^/]+\\)/[i, \t\n]" 1 'font-lock-reference-face))
+   (list "\\.rules\\'")
+   (list 'mailagent-rules-setup-function)
+   "Mode for Mailagent rules files.")
+(defun mailagent-rules-setup-function () 
+   (make-local-variable 'imenu-generic-expression)
+   (setq imenu-generic-expression 
+        '((nil "\\s-/\\([^/]+\\)/[i, \t\n]" 1))))
+ )
+
+;; Solaris/Sys V prototype files
+(and 
+ (memq 'prototype-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'prototype-generic-mode
+   (list ?#)
+   nil
+   '(
+     ("^\\([0-9]\\)?\\s-*\\([a-z]\\)\\s-+\\([A-Za-z_]+\\)\\s-+\\([^\n\r]*\\)$"
+      (2 font-lock-reference-face)
+      (3 font-lock-keyword-face))
+     ("^\\([a-z]\\) \\([A-Za-z_]+\\)=\\([^\n\r]*\\)$"
+      (1 font-lock-reference-face)
+         (2 font-lock-keyword-face)
+         (3 font-lock-variable-name-face))
+     ("^\\(!\\s-*\\(search\\|include\\|default\\)\\)\\s-*\\([^\n\r]*\\)$"
+      (1 font-lock-keyword-face)
+      (3 font-lock-variable-name-face))
+     ("^\\(!\\s-*\\sw+\\)=\\([^\n\r]*\\)$"
+      (1 font-lock-keyword-face)
+      (2 font-lock-variable-name-face))
+     )
+   (list "prototype\\'")
+   nil
+   "Mode for Sys V prototype files."))
+
+;; Solaris/Sys V pkginfo files
+(and 
+ (memq 'pkginfo-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'pkginfo-generic-mode
+   (list ?#)
+   nil
+   '(
+     ("^\\([A-Za-z_]+\\)=\\([^\n\r]*\\)$"
+      (1 font-lock-keyword-face)
+      (2 font-lock-variable-name-face))
+     )
+   (list "pkginfo\\'")
+   nil
+   "Mode for Sys V pkginfo files."))
+
+;; Javascript mode
+(define-generic-mode 'javascript-generic-mode
+  (list "//")
+  (list
+   "document"
+   "else"
+   "function"
+   "function"
+   "if"
+   "then"
+   "var"
+   )
+  (list
+   (list "^\\s-*function\\s-+\\([A-Za-z0-9]+\\)"
+        '(1 font-lock-function-name-face))
+     (list "^\\s-*var\\s-+\\([A-Za-z0-9]+\\)"
+          '(1 font-lock-variable-name-face))
+     )    
+  (list "\\.js\\'")
+  (list
+   (function 
+    (lambda ()
+      (setq imenu-generic-expression 
+           '((nil "^function\\s-+\\([A-Za-z0-9_]+\\)" 1)))
+      )))
+  "Mode for JavaScript files.")
+
+;; VRML files
+(define-generic-mode 'vrml-generic-mode
+  (list ?#)
+  (list
+   "DEF"
+   "NULL"
+   "USE"
+   "Viewpoint"
+   "ambientIntensity"
+   "appearance"
+   "children"
+   "color"
+   "coord"
+   "coordIndex"
+   "creaseAngle"
+   "diffuseColor"
+   "emissiveColor"
+   "fieldOfView"
+   "geometry"
+   "info"
+   "material"
+   "normal"
+   "orientation"
+   "position"
+   "shininess"
+   "specularColor"
+   "texCoord"
+   "texture"
+   "textureTransform"
+   "title"
+   "transparency"
+   "type"
+   )
+  (list
+   (list "USE\\s-+\\([-A-Za-z0-9_]+\\)"
+        '(1 font-lock-reference-face))
+   (list "DEF\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([A-Za-z0-9]+\\)\\s-*{"
+        '(1 font-lock-type-face)
+        '(2 font-lock-reference-face))
+   (list "^\\s-*\\([-A-Za-z0-9_]+\\)\\s-*{"
+        '(1 font-lock-function-name-face))
+   (list 
+    "^\\s-*\\(geometry\\|appearance\\|material\\)\\s-+\\([-A-Za-z0-9_]+\\)"
+    '(2 font-lock-variable-name-face))
+   )
+  (list "\\.wrl\\'")
+  (list
+   (function 
+    (lambda ()
+      (setq imenu-generic-expression 
+           '((nil "^\\([A-Za-z0-9_]+\\)\\s-*{" 1)
+             ("*Definitions*" 
+              "DEF\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([A-Za-z0-9]+\\)\\s-*{"
+              1)))
+      )))
+  "Generic Mode for VRML files.")
+
+;; Java Manifests
+(define-generic-mode 'java-manifest-generic-mode
+  (list ?#)
+  (list 
+   "Name" 
+   "Digest-Algorithms" 
+   "Manifest-Version" 
+   "Required-Version" 
+   "Signature-Version"
+   "Magic"
+   "Java-Bean"
+   "Depends-On"
+   )
+  '(("^Name:\\s-+\\([^\n\r]*\\)$"
+     (1 font-lock-variable-name-face))
+    ("^\\(Manifest\\|Required\\|Signature\\)-Version:\\s-+\\([^\n\r]*\\)$"
+     (2 font-lock-reference-face))
+    )
+  (list "manifest\\.mf\\'")
+  nil
+  "Mode for Java Manifest files")
+
+;; Java properties files
+(define-generic-mode 'java-properties-generic-mode
+  (list ?#)
+   nil
+   ;; Property and value can be separated with whitespace or an equal sign
+  '(("^\\([A-Za-z0-9_]+\\)\\(\\s-+\\|\\s-*=\\s-*\\)\\([^\r\n]*\\)\\'" 
+     (1 font-lock-reference-face) (3 font-lock-variable-name-face)))
+  nil
+  nil
+  "Mode for Java properties files.")
+
+;; C shell alias definitions
+(define-generic-mode 'alias-generic-mode
+  (list ?#)
+  (list "alias" "unalias")
+  '(("^alias\\s-+\\([-A-Za-z0-9_]+\\)\\s-+"
+     (1 font-lock-variable-name-face))
+    ("^unalias\\s-+\\([-A-Za-z0-9_]+\\)\\s-*$"
+     (1 font-lock-variable-name-face))
+    )
+  (list "alias\\'")
+  (list
+   (function
+    (lambda ()
+      (setq imenu-generic-expression 
+           '((nil "^\\(alias\\|unalias\\)\\s-+\\([-a-zA-Z0-9_]+\\)" 2)))
+      )))
+  "Mode for C Shell alias files.")
+
+;;; Windows RC files
+;; Contributed by ACorreir@pervasive-sw.com (Alfred Correira)
+(and 
+ (memq 'rc-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'rc-generic-mode
+;;   (list ?\/)
+   (list "//")
+   '("ACCELERATORS"
+     "AUTO3STATE"
+     "AUTOCHECKBOX"
+     "AUTORADIOBUTTON"
+     "BITMAP"
+     "BOTTOMMARGIN"
+     "BUTTON"
+     "CAPTION"
+     "CHARACTERISTICS"
+     "CHECKBOX"
+     "CLASS"
+     "COMBOBOX"
+     "CONTROL"
+     "CTEXT"
+     "CURSOR"
+     "DEFPUSHBUTTON"
+     "DESIGNINFO"
+     "DIALOG"
+     "DISCARDABLE"
+     "EDITTEXT"
+     "EXSTYLE"
+     "FONT"
+     "GROUPBOX"
+     "GUIDELINES"
+     "ICON"
+     "LANGUAGE"
+     "LEFTMARGIN"
+     "LISTBOX"
+     "LTEXT"
+     "MENUITEM SEPARATOR" 
+     "MENUITEM" 
+     "MENU"
+     "MOVEABLE"
+     "POPUP"
+     "PRELOAD"
+     "PURE"
+     "PUSHBOX"
+     "PUSHBUTTON"
+     "RADIOBUTTON"
+     "RCDATA"
+     "RIGHTMARGIN"
+     "RTEXT"
+     "SCROLLBAR"
+     "SEPARATOR"
+     "STATE3"
+     "STRINGTABLE"
+     "STYLE"
+     "TEXTINCLUDE"
+     "TOOLBAR"
+     "TOPMARGIN"
+     "VERSIONINFO"
+     "VERSION"
+     )
+   ;; the choice of what tokens go where is somewhat arbitrary,
+   ;; as is the choice of which value tokens are included, as
+   ;; the choice of face for each token group
+   (list
+   (generic-make-keywords-list
+    (list
+     "FILEFLAGSMASK"
+     "FILEFLAGS"
+     "FILEOS"
+     "FILESUBTYPE"
+     "FILETYPE"
+     "FILEVERSION"
+     "PRODUCTVERSION"
+     ) 'font-lock-type-face)
+   (generic-make-keywords-list
+    (list
+     "BEGIN"
+     "BLOCK"
+     "END"
+     "VALUE"
+     ) 'font-lock-function-name-face)
+   '("^#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)" 1 font-lock-string-face)
+   '("^#[ \t]*define[ \t]+\\(\\sw+\\)("       1 font-lock-function-name-face)
+   '("^#[ \t]*\\(elif\\|if\\)\\>"
+     ("\\<\\(defined\\)\\>[ \t]*(?\\(\\sw+\\)?" nil nil
+      (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t)))
+   '("^#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
+     (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t)))
+   (list "\\.[rR][cC]$")
+   nil
+   "Generic mode for MS-Windows Resource files."))
+
+;;; InstallShield RUL files
+;; Contributed by  Alfred.Correira@Pervasive.Com
+(and 
+(memq 'rul-generic-mode generic-extras-enable-list)
+
+(define-generic-mode 'rul-generic-mode 
+   ;; Using "/*" and "*/" doesn't seem to be working right
+   (list "//")
+   '("abort"
+     "begin"
+     "call"
+     "case"
+     "declare"
+     "default"
+     "downto"
+     "elseif"
+     "else"
+     "endfor"
+     "endif"
+     "endswitch"
+     "endwhile"
+     "end"
+     "exit"
+     "external"
+     "for"
+     "function"
+     ;; "goto" -- handled elsewhere
+     "if"
+     "program"
+     "prototype"
+     "repeat"
+     "return"
+     "step"
+     "switch"
+     "then"
+     "to"
+     "typedef"
+     "until"
+     "void"
+     "while")
+  (list
+   ;; preprocessor constructs
+   '("#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)"
+     1 font-lock-string-face)
+   '("#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
+     (1 font-lock-reference-face)
+     (2 font-lock-variable-name-face nil t))
+   ;; indirect string constants
+   '("\\(@[A-Za-z][A-Za-z0-9_]+\\)" 1 font-lock-emphasized-face)
+   ;; gotos
+   '("[ \t]*\\(\\sw+:\\)" 1 font-lock-reference-face)
+   '("\\<\\(goto\\)\\>[ \t]*\\(\\sw+\\)?" 
+     (1 font-lock-keyword-face)
+     (2 font-lock-reference-face nil t))
+   ;; system variables
+   (generic-make-keywords-list
+    (list
+     "CMDLINE"
+     "ERRORFILENAME"
+     "INFOFILENAME"
+     "ISRES"
+     "ISUSER"
+     "ISVERSION"
+     "SRCDIR"
+     "SRCDISK"
+     "SUPPORTDIR"
+     "TARGETDIR"
+     "TARGETDISK"
+     "WINDIR"
+     "WINDISK"
+     "WINMAJOR"
+     "WINSYSDIR"
+     "WINSYSDISK"
+     )
+    'font-lock-variable-name-face)
+   ;; system functions
+   (generic-make-keywords-list
+    (list
+      "AddFolderIcon"
+      "AddProfString"
+      "AddressString"
+      "AppCommand"
+      "AskDestPath"
+      "AskOptions"
+      "AskPath"
+      "AskText"
+      "AskYesNo"
+      "BatchDeleteEx"
+      "BatchFileLoad"
+      "BatchFileSave"
+      "BatchFind"
+      "BatchGetFileName"
+      "BatchMoveEx"
+      "BatchSetFileName"
+      "CloseFile"
+      "CmdGetHwndDlg"
+      "ComponentAddItem"                ; differs between IS3 and IS5
+      "ComponentCompareSizeRequired"    ; IS5 only
+      "ComponentDialog"
+      "ComponentError"                  ; IS5 only
+      "ComponentFileEnum"               ; IS5 only
+      "ComponentFileInfo"               ; IS5 only
+      "ComponentFilterLanguage"         ; IS5 only
+      "ComponentFilterOS"               ; IS5 only
+      "ComponentGetData"                ; IS5 only
+      "ComponentGetItemInfo"            ; IS3 only
+      "ComponentGetItemSize"            ; differs between IS3 and IS5
+      "ComponentIsItemSelected"         ; differs between IS3 and IS5
+      "ComponentListItems"
+      "ComponentMoveData"               ; IS5 only
+      "ComponentSelectItem"             ; differs between IS3 and IS5
+      "ComponentSetData"                ; IS5 only
+      "ComponentSetItemInfo"            ; IS3 only
+      "ComponentSetTarget"              ; IS5 only
+      "ComponentSetupTypeEnum"          ; IS5 only
+      "ComponentSetupTypeGetData"       ; IS5 only
+      "ComponentSetupTypeSet"           ; IS5 only
+      "ComponentTotalSize"
+      "ComponentValidate"               ; IS5 only
+      "CompressAdd"                     ; IS3 only
+      "CompressDel"                     ; IS3 only
+      "CompressEnum"                    ; IS3 only
+      "CompressGet"                     ; IS3 only
+      "CompressInfo"                    ; IS3 only
+      "CopyFile"
+      "CreateDir"
+      "CreateFile"
+      "CreateProgramFolder"
+      "DeinstallSetReference"           ; IS5 only
+      "DeinstallStart"
+      "Delay"
+      "DeleteDir"
+      "DeleteFile"
+      "DialogSetInfo"
+      "Disable"
+      "DoInstall"
+      "Do"
+      "Enable"
+      "EnterDisk"
+      "ExistsDir"
+      "ExistsDisk"
+      "ExitProgMan"
+      "EzBatchAddPath"
+      "EzBatchAddString"
+      "EzBatchReplace"
+      "EzConfigAddDriver"
+      "EzConfigAddString"
+      "EzConfigGetValue"
+      "EzConfigSetValue"
+      "EzDefineDialog"
+      "FileCompare"
+      "FileDeleteLine"
+      "FileGrep"
+      "FileInsertLine"
+      "FileSetBeginDefine"              ; IS3 only
+      "FileSetEndDefine"                ; IS3 only
+      "FileSetPerformEz"                ; IS3 only
+      "FileSetPerform"                  ; IS3 only
+      "FileSetReset"                    ; IS3 only
+      "FileSetRoot"                     ; IS3 only
+      "FindAllDirs"
+      "FindAllFiles"
+      "FindFile"
+      "FindWindow"
+      "GetDiskSpace"
+      "GetDisk"
+      "GetEnvVar"
+      "GetExtents"
+      "GetFileInfo"
+      "GetLine"
+      "GetProfString"
+      "GetSystemInfo"
+      "GetValidDrivesList"
+      "GetVersion"
+      "GetWindowHandle"
+      "InstallationInfo"
+      "Is"
+      "LaunchApp"
+      "ListCreate"
+      "ListDestroy"
+      "ListGetFirstString"
+      "ListGetNextString"
+      "ListSetIndex"
+      "LongPathToQuote"
+      "LongPathToShortPath"
+      "MessageBox"
+      "NumToStr"
+      "OpenFileMode"
+      "OpenFile"
+      "ParsePath"
+      "PathAdd"
+      "PathDelete"
+      "PathFind"
+      "PathGet"
+      "PathMove"
+      "PathSet"
+      "Path"
+      "PlaceBitmap"
+      "PlaceWindow"
+      "PlayMMedia"                      ; IS5 only
+      "ProgDefGroupType"
+      "RegDBCreateKeyEx"
+      "RegDBGetItem"
+      "RegDBKeyExist"
+      "RegDBSetItem"
+      "RegDBGetKeyValueEx"
+      "RegDBSetKeyValueEx"
+      "RegDBSetDefaultRoot"
+      "RenameFile"
+      "ReplaceFolderIcon"
+      "ReplaceProfString"
+      "SdAskDestPath"
+      "SdAskOptions"
+      "SdAskOptionsList"
+      "SdBitmap"
+      "SdCloseDlg"
+      "SdComponentAdvCheckSpace"
+      "SdComponentAdvInit"
+      "SdComponentAdvUpdateSpace"
+      "SdComponentDialog"
+      "SdComponentDialog2"
+      "SdComponentDialogAdv"
+      "SdComponentDialogEx"
+      "SdComponentDlgCheckSpace"
+      "SdComponentMult"
+      "SdConfirmNewDir"
+      "SdConfirmRegistration"
+      "SdDiskSpace"
+      "SdDisplayTopics"
+      "SdDoStdButton"
+      "SdEnablement"
+      "SdError"
+      "SdFinish"
+      "SdFinishInit32"
+      "SdFinishReboot"
+      "SdGeneralInit"
+      "SdGetItemName"
+      "SdGetTextExtent"
+      "SdGetUserCompanyInfo"
+      "SdInit"
+      "SdIsShellExplorer"
+      "SdIsStdButton"
+      "SdLicense"
+      "SdMakeName"
+      "SdOptionInit"
+      "SdOptionSetState"
+      "SdOptionsButtons"
+      "SdOptionsButtonsInit"
+      "SdPlugInProductName"
+      "SdProductName"
+      "SdRegEnableButton"
+      "SdRegExEnableButton"
+      "SdRegisterUser"
+      "SdRegisterUserEx"
+      "SdRemoveEndSpace"
+      "SdSelectFolder"
+      "SdSetSequentialItems"
+      "SdSetStatic"
+      "SdSetupTypeEx"                   ; IS5 only
+      "SdSetupType"
+      "SdShowAnyDialog"
+      "SdShowDlgEdit1"
+      "SdShowDlgEdit2"
+      "SdShowDlgEdit3"
+      "SdShowFileMods"
+      "SdShowInfoList"
+      "SdShowMsg"
+      "SdStartCopy"
+      "SdUnInit"
+      "SdUpdateComponentSelection"
+      "SdWelcome"
+      "SendMessage"
+      "SetColor"
+      "SetFont"
+      "SetDialogTitle"
+      "SetDisplayEffect"                ; IS5 only
+      "SetFileInfo"
+      "SetForegroundWindow"
+      "SetStatusWindow"
+      "SetTitle"
+      "SetupType"
+      "ShowProgramFolder"
+      "Split"                           ; IS3 only
+      "SprintfBox"
+      "Sprintf"
+      "StatusUpdate"
+      "StrCompare"
+      "StrFind"
+      "StrGetTokens"
+      "StrLength"
+      "StrRemoveLastSlash"
+      "StrToLower"
+      "StrToUpper"
+      "StrSub"
+      "VarRestore"
+      "VarSave"
+      "VerCompare"
+      "VerGetFileVersion"
+      "WaitOnDialog"
+      "Welcome"
+      "WriteLine"
+      "WriteProfString"
+      "XCopyFile"
+      )
+    'font-lock-function-name-face)
+   ;; type keywords
+   (generic-make-keywords-list
+    (list
+      "BOOL"
+      "BYREF"
+      "CHAR"
+      "HIWORD"
+      "HWND"
+      "INT"
+      "LIST"
+      "LONG"
+      "LOWORD"
+      "NUMBER"
+      "POINTER"
+      "QUAD"
+      "RGB"
+      "SHORT"
+      "STRINGLIST"
+      "STRING"
+      )
+    'font-lock-type-face)
+   ;;; system variables
+   (generic-make-keywords-list
+    (list
+     "CMDLINE"
+     "CORECOMPONENTHANDLING"
+     "ERRORFILENAME"
+     "INFOFILENAME"
+     "ISRES"
+     "ISUSER"
+     "ISVERSION"
+     "MODE"
+     "SRCDIR"
+     "SRCDISK"
+     "SUPPORTDIR"
+     "TARGETDIR"
+     "TARGETDISK"
+     "WINDIR"
+     "WINDISK"
+     "WINSYSDIR"
+     "WINSYSDISK"
+     )
+   ;; pre-defined constants (not exhaustive -- just my favorites)
+    'font-lock-variable-name-face)
+
+   (generic-make-keywords-list
+    (list
+      "AFTER"
+      "APPEND"
+      "ALLCONTENTS"
+      "BACKBUTTON"
+      "BACKGROUNDCAPTION"
+      "BACKGROUND"
+      "BACK"
+      "BASEMEMORY"
+      "BEFORE"
+      "BIOS"
+      "BITMAPICON"
+      "BK_BLUE"
+      "BK_GREEN"
+      "BK_RED"
+      "BLUE"
+      "BOOTUPDRIVE"
+      "CANCEL"
+      "CDROM_DRIVE"
+      "CDROM"
+      "CHECKBOX95"
+      "CHECKBOX"
+      "CHECKLINE"
+      "CHECKMARK"
+      "COLORS"
+      "COMMANDEX"
+      "COMMAND"
+      "COMP_NORMAL"
+      "COMP_UPDATE_DATE"
+      "COMP_UPDATE_SAME"
+      "COMP_UPDATE_VERSION"
+      "COMPACT"
+      "CONTINUE"
+      "CPU"
+      "CUSTOM"
+      "DATE"
+      "DEFWINDOWMODE"
+      "DIR_WRITEABLE"
+      "DISABLE"
+      "DISK_TOTALSPACE"
+      "DISK"
+      "DLG_OPTIONS"
+      "DLG_PATH"
+      "DLG_TEXT"
+      "DLG_ASK_YESNO"
+      "DLG_ENTER_DISK"
+      "DLG_ERR"
+      "DLG_INFO_ALTIMAGE"
+      "DLG_INFO_CHECKSELECTION"
+      "DLG_INFO_KUNITS"
+      "DLG_INFO_USEDECIMAL"
+      "DLG_MSG_INFORMATION"
+      "DLG_MSG_SEVERE"
+      "DLG_MSG_WARNING"
+      "DLG_STATUS"
+      "DLG_WARNING"
+      "DLG_USER_CAPTION"
+      "DRIVE"
+      "ENABLE"
+      "END_OF_FILE"
+      "END_OF_LIST"
+      "ENVSPACE"
+      "EQUALS"
+      "EXCLUDE_SUBDIR"
+      "EXCLUSIVE"
+      "EXISTS"
+      "EXIT"
+      "EXTENDED_MEMORY"
+      "EXTENSION_ONLY"
+      "FAILIFEXISTS"
+      "FALSE"
+      "FEEDBACK_FULL"
+      "FILE_ATTR_ARCHIVED"
+      "FILE_ATTR_DIRECTORY"
+      "FILE_ATTR_HIDDEN"
+      "FILE_ATTR_NORMAL"
+      "FILE_ATTR_READONLY"
+      "FILE_ATTR_SYSTEM"
+      "FILE_ATTRIBUTE"
+      "FILE_DATE"
+      "FILE_LINE_LENGTH"
+      "FILE_MODE_APPEND"
+      "FILE_MODE_BINARYREADONLY"
+      "FILE_MODE_BINARY"
+      "FILE_MODE_NORMAL"
+      "FILE_NO_VERSION"
+      "FILE_NOT_FOUND"
+      "FILE_SIZE"
+      "FILE_TIME"
+      "FILENAME_ONLY"
+      "FILENAME"
+      "FIXED_DRIVE"
+      "FOLDER_DESKTOP"
+      "FOLDER_STARTMENU"
+      "FOLDER_STARTUP"
+      "FREEENVSPACE"
+      "FULLWINDOWMODE"
+      "FULL"
+      "FONT_TITLE"
+      "GREATER_THAN"
+      "GREEN"
+      "HOURGLASS"
+      "INCLUDE_SUBDIR"
+      "INDVFILESTATUS"
+      "INFORMATION"
+      "IS_WINDOWSNT"
+      "IS_WINDOWS95"
+      "IS_WINDOWS"
+      "IS_WIN32S"
+      "ISTYPE"
+      "LANGUAGE_DRV"
+      "LANGUAGE"
+      "LESS_THAN"
+      "LIST_NULL"
+      "LISTFIRST"
+      "LISTNEXT"
+      "LOCKEDFILE"
+      "LOGGING"
+      "LOWER_LEFT"
+      "LOWER_RIGHT"
+      "MAGENTA"
+      "MOUSE_DRV"
+      "MOUSE"
+      "NETWORK_DRV"
+      "NETWORK"
+      "NEXT"
+      "NONEXCLUSIVE"
+      "NORMALMODE"
+      "NOSET"
+      "NOTEXISTS"
+      "NOWAIT"
+      "NO"
+      "OFF"
+      "ONLYDIR"
+      "ON"
+      "OSMAJOR"
+      "OSMINOR"
+      "OS"
+      "OTHER_FAILURE"
+      "PARALLEL"
+      "PARTIAL"
+      "PATH_EXISTS"
+      "PATH"
+      "RED"
+      "REGDB_APPPATH_DEFAULT"
+      "REGDB_APPPATH"
+      "REGDB_BINARY"
+      "REGDB_ERR_CONNECTIONEXISTS"
+      "REGDB_ERR_CORRUPTEDREGSITRY"
+      "REGDB_ERR_INITIALIZATION"
+      "REGDB_ERR_INVALIDHANDLE"
+      "REGDB_ERR_INVALIDNAME"
+      "REGDB_NUMBER"
+      "REGDB_STRING_EXPAND"
+      "REGDB_STRING_MULTI"
+      "REGDB_STRING"
+      "REGDB_UNINSTALL_NAME"
+      "REMOTE_DRIVE"
+      "REMOVALE_DRIVE"
+      "REPLACE_ITEM"
+      "REPLACE"
+      "RESET"
+      "RESTART"
+      "ROOT"
+      "SELFREGISTER"
+      "SERIAL"
+      "SET"
+      "SEVERE"
+      "SHAREDFILE"
+      "SHARE"
+      "SILENTMODE"
+      "SRCTARGETDIR"
+      "STATUSBAR"
+      "STATUSDLG"
+      "STATUSOLD"
+      "STATUS"
+      "STYLE_NORMAL"
+      "SW_MAXIMIZE"
+      "SW_MINIMIZE"
+      "SW_RESTORE"
+      "SW_SHOW"
+      "TIME"
+      "TRUE"
+      "TYPICAL"
+      "UPPER_LEFT"
+      "UPPER_RIGHT"
+      "VALID_PATH"
+      "VERSION"
+      "VIDEO"
+      "VOLUMELABEL"
+      "YELLOW"
+      "YES"
+      "WAIT"
+      "WARNING"
+      "WINMAJOR"
+      "WINMINOR"
+      "WIN32SINSTALLED"
+      "WIN32SMAJOR"
+      "WIN32SMINOR"
+      )
+    'font-lock-variable-name-face)     ; is this face the best choice?
+   )
+  (list "\\.[rR][uU][lL]$")
+  (list
+   (function 
+    (lambda ()
+      (setq imenu-generic-expression 
+    '((nil "^function\\s-+\\([A-Za-z0-9_]+\\)" 1)))
+      )))
+  "Generic mode for InstallShield RUL files.")
+
+(define-skeleton rul-if
+   "Insert an if statement."
+   "condition: "
+   "if(" str ") then" \n
+   > _ \n
+   ( "other condition, %s: "
+     > "elseif(" str ") then" \n
+     > \n)   
+   > "else" \n
+   > \n
+   resume:
+   > "endif;"
+   )
+
+(define-skeleton rul-function
+  "Insert a function statement."
+  "function: "
+  "function " str " ()" \n
+  ( "local variables, %s: "
+  > "  " str ";" \n)
+  > "begin" \n
+  > _ \n
+  resume:
+  > "end;")
+
+)
+
+;; Additions by ACorreir@pervasive-sw.com (Alfred Correira)
+(define-generic-mode 'mailrc-generic-mode
+  (list ?#)
+  (list 
+   "alias" 
+   "else" 
+   "endif" 
+   "group" 
+   "if" 
+   "ignore" 
+   "set" 
+   "unset"
+   )
+  '(("^\\s-*\\(alias\\|group\\)\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([^\n\r#]*\\)\\(#.*\\)?$"
+     (2 font-lock-reference-face) (3 font-lock-variable-name-face))
+    ("^\\s-*\\(unset\\|set\\|ignore\\)\\s-+\\([-A-Za-z0-9_]+\\)=?\\([^\n\r#]*\\)\\(#.*\\)?$"
+     (2 font-lock-reference-face) (3 font-lock-variable-name-face)))
+  (list "\\.mailrc\\'")
+  nil
+  "Mode for mailrc files.")
+
+(provide 'generic-x)
+
+;;; generic-x.el ends here