1 ;;; generic-x.el --- Extra Modes for generic-mode
3 ;; Copyright (C) 1997, 1998 Free Software Foundation, Inc.
5 ;; Author: Peter Breton <pbreton@cs.umb.edu>
6 ;; Created: Tue Oct 08 1996
7 ;; Keywords: generic, comment, font-lock
9 ;; This file is part of GNU Emacs.
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
28 ;; This file contains some pre-defined generic-modes.
32 ;; Add this line to your .emacs file:
34 ;; (require 'generic-x)
36 ;; You can decide which modes to load by setting the variable
37 ;; `generic-extras-enable-list'. Some platform-specific modes are
38 ;; affected by the variables `generic-define-mswindows-modes' and
39 ;; `generic-define-unix-modes' (which see).
41 ;; You can also send in new modes; if the file types a reasonably common,
42 ;; we would like to install them.
44 ;; PROBLEMS WHEN USED WITH FOLDING MODE:
46 ;; From Anders Lindgren <andersl@csd.uu.se>
48 ;; Problem summary: Wayne Adams has found a problem when using folding
49 ;; mode in conjuction with font-lock for a mode defined in
52 ;; The problem, as Wayne described it, was that error messages of the
53 ;; following form appeared when both font-lock and folding are used:
55 ;; > - various msgs including "Fontifying region...(error Stack
56 ;; > overflow in regexp matcher)" appear
58 ;; I have just tracked down the cause of the problem. The regexp:s in
59 ;; `generic-x.el' does not take into account the way that folding
60 ;; hides sections of the buffer. The technique is known as
61 ;; `selective-display' and has been available for a very long time (I
62 ;; started using it back in the good old' Emacs 18 days). Basically, a
63 ;; section is hidden by creating one very long line were the newline
64 ;; character (C-j) is replaced by a linefeed (C-m) character.
66 ;; Many other hiding packages, besides folding, use the same technique,
67 ;; the problem should occur when using them as well.
69 ;; The erroronous lines in `generic-extras' look like the following (this
70 ;; example is from the `ini' section):
72 ;; '(("^\\(\\[.*\\]\\)" 1 'font-lock-reference-face)
73 ;; ("^\\(.*\\)=" 1 'font-lock-variable-name-face)
75 ;; The intention of these lines is to highlight lines of the following
81 ;; However, since the `.' regexp symbol match the linefeed character the
82 ;; entire folded section is searched, resulting in a regexp stack
85 ;; Solution suggestion 2: Instead of using ".", use the sequence
86 ;; "[^\n\r]". This will make the rules behave just as before, but they
87 ;; will work together with selective-display.
94 (defcustom generic-extras-enable-list nil
95 "*List of generic modes to enable by default.
96 Each entry in the list should be a symbol.
97 The variables `generic-define-mswindows-modes' and `generic-define-unix-modes'
98 also affect which generic modes are defined.
99 Please note that if you set this variable after generic-x is loaded,
100 you must reload generic-x to enable the specified modes."
105 (defcustom generic-define-mswindows-modes
106 (memq system-type
(list 'windows-nt
'ms-dos
))
107 "*If non-nil, some MS-Windows specific generic modes will be defined."
112 (defcustom generic-define-unix-modes
113 (not (memq system-type
(list 'windows-nt
'ms-dos
)))
114 "*If non-nil, some Unix specific generic modes will be defined."
119 (and generic-define-mswindows-modes
120 (setq generic-extras-enable-list
121 (append (list 'bat-generic-mode
'ini-generic-mode
122 'inf-generic-mode
'rc-generic-mode
123 'reg-generic-mode
'rul-generic-mode
)
124 generic-extras-enable-list
)))
126 (and generic-define-unix-modes
127 (setq generic-extras-enable-list
128 (append (list 'apache-generic-mode
'samba-generic-mode
129 'hosts-generic-mode
'fvwm-generic-mode
130 'x-resource-generic-mode
132 generic-extras-enable-list
)))
134 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140 (memq 'apache-generic-mode generic-extras-enable-list
)
142 (define-generic-mode 'apache-generic-mode
145 '(("^\\(<.*>\\)" 1 'font-lock-reference-face
)
146 ("^\\(\\sw+\\)\\s-" 1 'font-lock-variable-name-face
))
147 (list "srm\\.conf\\'" "httpd\\.conf\\'" "access\\.conf\\'")
149 "Generic mode for Apache or HTTPD configuration files."))
153 (memq 'samba-generic-mode generic-extras-enable-list
)
155 (define-generic-mode 'samba-generic-mode
158 '(("^\\(\\[.*\\]\\)" 1 'font-lock-reference-face
))
159 (list "smb\\.conf\\'")
160 (list 'generic-bracket-support
)
161 "Generic mode for Samba configuration files."))
164 ;; This is pretty basic. Also, modes for other window managers could
165 ;; be defined as well.
167 (memq 'fvwm-generic-mode generic-extras-enable-list
)
169 (define-generic-mode 'fvwm-generic-mode
187 (list "\\.fvwmrc\\'" "\\.fvwm2rc\\'")
189 "Generic mode for FVWM configuration files."))
192 ;; I'm pretty sure I've seen an actual mode to do this, but I don't
193 ;; think it's standard with Emacs
195 (memq 'x-resource-generic-mode generic-extras-enable-list
)
197 (define-generic-mode 'x-resource-generic-mode
200 '(("^\\([^:\n]+:\\)" 1 'font-lock-variable-name-face
))
201 (list "\\.Xdefaults\\'" "\\.Xresources\\'")
203 "Generic mode for X Resource configuration files."))
207 (memq 'hosts-generic-mode generic-extras-enable-list
)
209 (define-generic-mode 'hosts-generic-mode
212 '(("\\([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\\)" 1 'font-lock-reference-face
))
213 (list "[hH][oO][sS][tT][sS]\\'")
215 "Generic mode for HOSTS files."))
217 ;;; Windows INF files
219 (memq 'inf-generic-mode generic-extras-enable-list
)
221 (define-generic-mode 'inf-generic-mode
224 '(("^\\(\\[.*\\]\\)" 1 'font-lock-reference-face
))
225 (list "\\.[iI][nN][fF]\\'")
226 (list 'generic-bracket-support
)
227 "Generic mode for MS-Windows INF files."))
229 ;;; Windows INI files
230 ;; Should define escape character as well!
232 (memq 'ini-generic-mode generic-extras-enable-list
)
234 (define-generic-mode 'ini-generic-mode
237 '(("^\\(\\[.*\\]\\)" 1 'font-lock-reference-face
)
238 ("^\\([^=\n\r]*\\)=\\([^\n\r]*\\)$"
239 (1 font-lock-function-name-face
)
240 (2 font-lock-variable-name-face
)))
241 (list "\\.[iI][nN][iI]\\'")
245 (setq imenu-generic-expression
246 '((nil "^\\[\\(.*\\)\\]" 1)
247 ("*Variables*" "^\\s-*\\([^=]+\\)\\s-*=" 1)))
249 "Generic mode for MS-Windows INI files."))
251 ;;; Windows REG files
252 ;;; Unfortunately, Windows 95 and Windows NT have different REG file syntax!
254 (memq 'reg-generic-mode generic-extras-enable-list
)
256 (define-generic-mode 'reg-generic-mode
258 '("key" "classes_root" "REGEDIT" "REGEDIT4")
259 '(("\\(\\[.*]\\)" 1 'font-lock-reference-face
)
260 ("^\\([^\n\r]*\\)\\s-*=" 1 'font-lock-variable-name-face
))
261 '("\\.[rR][eE][gG]\\'")
265 (setq imenu-generic-expression
266 '((nil "^\\s-*\\(.*\\)\\s-*=" 1))))))
267 "Generic mode for MS-Windows Registry files."))
269 ;;; Windows BAT files
270 (if (not (memq 'bat-generic-mode generic-extras-enable-list
))
272 (define-generic-mode 'bat-generic-mode
276 ;; Make this one first in the list, otherwise comments will
277 ;; be over-written by other variables
278 (list "^[@ \t]*\\([rR][eE][mM][^\n\r]*\\)" 1 'font-lock-comment-face t
)
279 (list "^[ \t]*\\(::-.*\\)" 1 'font-lock-comment-face t
)
280 ;; These keywords appear as the first word on a line
281 (generic-make-keywords-list
288 "[pP][aA][uU][sS][eE]"
289 "[pP][rR][oO][mM][pP][tT]"
291 "[sS][tT][aA][rR][tT]"
293 'font-lock-keyword-face
"^[@ \t]*")
294 ;; These keywords can be anywhere on a line
295 (generic-make-keywords-list
297 "[eE][xX][iI][sS][tT]"
298 "[eE][rR][rR][oO][rR][lL][eE][vV][eE][lL]"
301 ) 'font-lock-keyword-face
)
302 (list "^[ \t]*\\(:\\sw+\\)" 1 'font-lock-function-name-face t
)
303 (list "\\(%\\sw+%\\)" 1 'font-lock-reference-face
)
304 (list "\\(%[0-9]\\)" 1 'font-lock-reference-face
)
305 (list "\\(/[^/ \"\t\n]+\\)" 1 'font-lock-type-face
)
306 (list "[\t ]+\\([+-][^\t\n\" ]+\\)" 1 'font-lock-type-face
)
307 (list "\\<\\([gG][oO][tT][oO]\\)\\>[ \t]*\\(\\sw+\\)?"
308 '(1 font-lock-keyword-face
)
309 '(2 font-lock-function-name-face nil t
))
312 (list "\\.[bB][aA][tT]\\'" "CONFIG\\." "AUTOEXEC\\." )
313 (list 'generic-bat-mode-setup-function
)
314 "Generic mode for MS-Windows BAT files.")
316 (defvar bat-generic-mode-syntax-table nil
317 "Syntax table in use in bat-generic-mode buffers.")
319 ;; Make underscores count as words
320 (if bat-generic-mode-syntax-table
322 (setq bat-generic-mode-syntax-table
(make-syntax-table))
323 (modify-syntax-entry ?_
"w" bat-generic-mode-syntax-table
))
325 ;; bat-generic-mode doesn't use the comment functionality of generic-mode
326 ;; because it has a three-letter comment-string, so we do it
327 ;; here manually instead
328 (defun generic-bat-mode-setup-function ()
329 (make-local-variable 'parse-sexp-ignore-comments
)
330 (make-local-variable 'comment-start
)
331 (make-local-variable 'comment-start-skip
)
332 (make-local-variable 'comment-end
)
333 (setq imenu-generic-expression
'((nil "^:\\(\\sw+\\)" 1))
334 parse-sexp-ignore-comments t
336 comment-start
"[Rr][Ee][Mm] "
337 comment-start-skip
"[Rr][Ee][Mm] *"
339 (set-syntax-table bat-generic-mode-syntax-table
)
344 ;; Mailagent is a Unix mail filtering program. Anyone wanna do a generic mode
347 (memq 'mailagent-rules-generic-mode generic-extras-enable-list
)
349 (define-generic-mode 'mailagent-rules-generic-mode
351 (list "SAVE" "DELETE" "PIPE" "ANNOTATE" "REJECT")
352 '(("^\\(\\sw+\\)\\s-*=" 1 'font-lock-variable-name-face
)
353 ("\\s-/\\([^/]+\\)/[i, \t\n]" 1 'font-lock-reference-face
))
355 (list 'mailagent-rules-setup-function
)
356 "Mode for Mailagent rules files.")
358 (defun mailagent-rules-setup-function ()
359 (make-local-variable 'imenu-generic-expression
)
360 (setq imenu-generic-expression
361 '((nil "\\s-/\\([^/]+\\)/[i, \t\n]" 1))))
364 ;; Solaris/Sys V prototype files
366 (memq 'prototype-generic-mode generic-extras-enable-list
)
368 (define-generic-mode 'prototype-generic-mode
372 ("^\\([0-9]\\)?\\s-*\\([a-z]\\)\\s-+\\([A-Za-z_]+\\)\\s-+\\([^\n\r]*\\)$"
373 (2 font-lock-reference-face
)
374 (3 font-lock-keyword-face
))
375 ("^\\([a-z]\\) \\([A-Za-z_]+\\)=\\([^\n\r]*\\)$"
376 (1 font-lock-reference-face
)
377 (2 font-lock-keyword-face
)
378 (3 font-lock-variable-name-face
))
379 ("^\\(!\\s-*\\(search\\|include\\|default\\)\\)\\s-*\\([^\n\r]*\\)$"
380 (1 font-lock-keyword-face
)
381 (3 font-lock-variable-name-face
))
382 ("^\\(!\\s-*\\sw+\\)=\\([^\n\r]*\\)$"
383 (1 font-lock-keyword-face
)
384 (2 font-lock-variable-name-face
))
386 (list "prototype\\'")
388 "Mode for Sys V prototype files."))
390 ;; Solaris/Sys V pkginfo files
392 (memq 'pkginfo-generic-mode generic-extras-enable-list
)
394 (define-generic-mode 'pkginfo-generic-mode
398 ("^\\([A-Za-z_]+\\)=\\([^\n\r]*\\)$"
399 (1 font-lock-keyword-face
)
400 (2 font-lock-variable-name-face
))
404 "Mode for Sys V pkginfo files."))
407 (define-generic-mode 'javascript-generic-mode
419 (list "^\\s-*function\\s-+\\([A-Za-z0-9]+\\)"
420 '(1 font-lock-function-name-face
))
421 (list "^\\s-*var\\s-+\\([A-Za-z0-9]+\\)"
422 '(1 font-lock-variable-name-face
))
428 (setq imenu-generic-expression
429 '((nil "^function\\s-+\\([A-Za-z0-9_]+\\)" 1)))
431 "Mode for JavaScript files.")
434 (define-generic-mode 'vrml-generic-mode
467 (list "USE\\s-+\\([-A-Za-z0-9_]+\\)"
468 '(1 font-lock-reference-face
))
469 (list "DEF\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([A-Za-z0-9]+\\)\\s-*{"
470 '(1 font-lock-type-face
)
471 '(2 font-lock-reference-face
))
472 (list "^\\s-*\\([-A-Za-z0-9_]+\\)\\s-*{"
473 '(1 font-lock-function-name-face
))
475 "^\\s-*\\(geometry\\|appearance\\|material\\)\\s-+\\([-A-Za-z0-9_]+\\)"
476 '(2 font-lock-variable-name-face
))
482 (setq imenu-generic-expression
483 '((nil "^\\([A-Za-z0-9_]+\\)\\s-*{" 1)
485 "DEF\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([A-Za-z0-9]+\\)\\s-*{"
488 "Generic Mode for VRML files.")
491 (define-generic-mode 'java-manifest-generic-mode
503 '(("^Name:\\s-+\\([^\n\r]*\\)$"
504 (1 font-lock-variable-name-face
))
505 ("^\\(Manifest\\|Required\\|Signature\\)-Version:\\s-+\\([^\n\r]*\\)$"
506 (2 font-lock-reference-face
))
508 (list "manifest\\.mf\\'")
510 "Mode for Java Manifest files")
512 ;; Java properties files
513 (define-generic-mode 'java-properties-generic-mode
516 ;; Property and value can be separated with whitespace or an equal sign
517 '(("^\\([A-Za-z0-9_]+\\)\\(\\s-+\\|\\s-*=\\s-*\\)\\([^\r\n]*\\)\\'"
518 (1 font-lock-reference-face
) (3 font-lock-variable-name-face
)))
521 "Mode for Java properties files.")
523 ;; C shell alias definitions
524 (define-generic-mode 'alias-generic-mode
526 (list "alias" "unalias")
527 '(("^alias\\s-+\\([-A-Za-z0-9_]+\\)\\s-+"
528 (1 font-lock-variable-name-face
))
529 ("^unalias\\s-+\\([-A-Za-z0-9_]+\\)\\s-*$"
530 (1 font-lock-variable-name-face
))
536 (setq imenu-generic-expression
537 '((nil "^\\(alias\\|unalias\\)\\s-+\\([-a-zA-Z0-9_]+\\)" 2)))
539 "Mode for C Shell alias files.")
542 ;; Contributed by ACorreir@pervasive-sw.com (Alfred Correira)
544 (memq 'rc-generic-mode generic-extras-enable-list
)
546 (define-generic-mode 'rc-generic-mode
602 ;; the choice of what tokens go where is somewhat arbitrary,
603 ;; as is the choice of which value tokens are included, as
604 ;; the choice of face for each token group
606 (generic-make-keywords-list
615 ) 'font-lock-type-face
)
616 (generic-make-keywords-list
622 ) 'font-lock-function-name-face
)
623 '("^#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)" 1 font-lock-string-face
)
624 '("^#[ \t]*define[ \t]+\\(\\sw+\\)(" 1 font-lock-function-name-face
)
625 '("^#[ \t]*\\(elif\\|if\\)\\>"
626 ("\\<\\(defined\\)\\>[ \t]*(?\\(\\sw+\\)?" nil nil
627 (1 font-lock-reference-face
) (2 font-lock-variable-name-face nil t
)))
628 '("^#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
629 (1 font-lock-reference-face
) (2 font-lock-variable-name-face nil t
)))
630 (list "\\.[rR][cC]$")
632 "Generic mode for MS-Windows Resource files."))
634 ;;; InstallShield RUL files
635 ;; Contributed by Alfred.Correira@Pervasive.Com
637 (memq 'rul-generic-mode generic-extras-enable-list
)
639 (define-generic-mode 'rul-generic-mode
640 ;; Using "/*" and "*/" doesn't seem to be working right
660 ;; "goto" -- handled elsewhere
675 ;; preprocessor constructs
676 '("#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)"
677 1 font-lock-string-face
)
678 '("#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
679 (1 font-lock-reference-face
)
680 (2 font-lock-variable-name-face nil t
))
681 ;; indirect string constants
682 '("\\(@[A-Za-z][A-Za-z0-9_]+\\)" 1 font-lock-builtin-face
)
684 '("[ \t]*\\(\\sw+:\\)" 1 font-lock-reference-face
)
685 '("\\<\\(goto\\)\\>[ \t]*\\(\\sw+\\)?"
686 (1 font-lock-keyword-face
)
687 (2 font-lock-reference-face nil t
))
689 (generic-make-keywords-list
708 'font-lock-variable-name-face
)
710 (generic-make-keywords-list
730 "ComponentAddItem" ; differs between IS3 and IS5
731 "ComponentCompareSizeRequired" ; IS5 only
733 "ComponentError" ; IS5 only
734 "ComponentFileEnum" ; IS5 only
735 "ComponentFileInfo" ; IS5 only
736 "ComponentFilterLanguage" ; IS5 only
737 "ComponentFilterOS" ; IS5 only
738 "ComponentGetData" ; IS5 only
739 "ComponentGetItemInfo" ; IS3 only
740 "ComponentGetItemSize" ; differs between IS3 and IS5
741 "ComponentIsItemSelected" ; differs between IS3 and IS5
743 "ComponentMoveData" ; IS5 only
744 "ComponentSelectItem" ; differs between IS3 and IS5
745 "ComponentSetData" ; IS5 only
746 "ComponentSetItemInfo" ; IS3 only
747 "ComponentSetTarget" ; IS5 only
748 "ComponentSetupTypeEnum" ; IS5 only
749 "ComponentSetupTypeGetData" ; IS5 only
750 "ComponentSetupTypeSet" ; IS5 only
752 "ComponentValidate" ; IS5 only
753 "CompressAdd" ; IS3 only
754 "CompressDel" ; IS3 only
755 "CompressEnum" ; IS3 only
756 "CompressGet" ; IS3 only
757 "CompressInfo" ; IS3 only
761 "CreateProgramFolder"
762 "DeinstallSetReference" ; IS5 only
788 "FileSetBeginDefine" ; IS3 only
789 "FileSetEndDefine" ; IS3 only
790 "FileSetPerformEz" ; IS3 only
791 "FileSetPerform" ; IS3 only
792 "FileSetReset" ; IS3 only
793 "FileSetRoot" ; IS3 only
818 "LongPathToShortPath"
833 "PlayMMedia" ; IS5 only
841 "RegDBSetDefaultRoot"
850 "SdComponentAdvCheckSpace"
852 "SdComponentAdvUpdateSpace"
855 "SdComponentDialogAdv"
856 "SdComponentDialogEx"
857 "SdComponentDlgCheckSpace"
860 "SdConfirmRegistration"
872 "SdGetUserCompanyInfo"
881 "SdOptionsButtonsInit"
882 "SdPlugInProductName"
885 "SdRegExEnableButton"
890 "SdSetSequentialItems"
892 "SdSetupTypeEx" ; IS5 only
903 "SdUpdateComponentSelection"
909 "SetDisplayEffect" ; IS5 only
911 "SetForegroundWindow"
938 'font-lock-function-name-face
)
940 (generic-make-keywords-list
959 'font-lock-type-face
)
961 (generic-make-keywords-list
964 "CORECOMPONENTHANDLING"
981 ;; pre-defined constants (not exhaustive -- just my favorites)
982 'font-lock-variable-name-face
)
984 (generic-make-keywords-list
1015 "COMP_UPDATE_VERSION"
1033 "DLG_INFO_CHECKSELECTION"
1035 "DLG_INFO_USEDECIMAL"
1036 "DLG_MSG_INFORMATION"
1057 "FILE_ATTR_ARCHIVED"
1058 "FILE_ATTR_DIRECTORY"
1061 "FILE_ATTR_READONLY"
1067 "FILE_MODE_BINARYREADONLY"
1129 "REGDB_APPPATH_DEFAULT"
1132 "REGDB_ERR_CONNECTIONEXISTS"
1133 "REGDB_ERR_CORRUPTEDREGSITRY"
1134 "REGDB_ERR_INITIALIZATION"
1135 "REGDB_ERR_INVALIDHANDLE"
1136 "REGDB_ERR_INVALIDNAME"
1138 "REGDB_STRING_EXPAND"
1139 "REGDB_STRING_MULTI"
1141 "REGDB_UNINSTALL_NAME"
1185 'font-lock-variable-name-face
) ; is this face the best choice?
1187 (list "\\.[rR][uU][lL]$")
1191 (setq imenu-generic-expression
1192 '((nil "^function\\s-+\\([A-Za-z0-9_]+\\)" 1)))
1194 "Generic mode for InstallShield RUL files.")
1196 (define-skeleton rul-if
1197 "Insert an if statement."
1199 "if(" str
") then" \n
1201 ( "other condition, %s: "
1202 > "elseif(" str
") then" \n
1210 (define-skeleton rul-function
1211 "Insert a function statement."
1213 "function " str
" ()" \n
1214 ( "local variables, %s: "
1223 ;; Additions by ACorreir@pervasive-sw.com (Alfred Correira)
1224 (define-generic-mode 'mailrc-generic-mode
1236 '(("^\\s-*\\(alias\\|group\\)\\s-+\\([-A-Za-z0-9_]+\\)\\s-+\\([^\n\r#]*\\)\\(#.*\\)?$"
1237 (2 font-lock-reference-face
) (3 font-lock-variable-name-face
))
1238 ("^\\s-*\\(unset\\|set\\|ignore\\)\\s-+\\([-A-Za-z0-9_]+\\)=?\\([^\n\r#]*\\)\\(#.*\\)?$"
1239 (2 font-lock-reference-face
) (3 font-lock-variable-name-face
)))
1240 (list "\\.mailrc\\'")
1242 "Mode for mailrc files.")
1244 (provide 'generic-x
)
1246 ;;; generic-x.el ends here