summaryrefslogtreecommitdiff
path: root/lisp/generic.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/generic.el')
-rw-r--r--lisp/generic.el45
1 files changed, 32 insertions, 13 deletions
diff --git a/lisp/generic.el b/lisp/generic.el
index 78d329b358f..314a40ea80c 100644
--- a/lisp/generic.el
+++ b/lisp/generic.el
@@ -185,7 +185,8 @@ the regexp in `generic-find-file-regexp'. If the value is nil,
;;;###autoload
(defmacro define-generic-mode (mode comment-list keyword-list
font-lock-list auto-mode-list
- function-list &optional docstring)
+ 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
@@ -216,22 +217,42 @@ 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))
+ [&optional stringp] &rest [keywordp form]))
(indent 1))
;; Backward compatibility.
(when (eq (car-safe mode) 'quote)
(setq mode (eval mode)))
- (let* ((mode-name (symbol-name 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\\'" "" mode-name)))
- (mode-hook (intern (concat mode-name "-hook"))))
+ "-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 ,mode-name)
+ (add-to-list 'generic-mode-list ,name)
;; Add it to auto-mode-alist
(dolist (re ,auto-mode-list)
@@ -240,9 +261,7 @@ See the file generic-x.el for some examples of `define-generic-mode'."
(defcustom ,mode-hook nil
,(concat "Hook run when entering " pretty-name " mode.")
:type 'hook
- :group (or (custom-current-group)
- ',(intern (replace-regexp-in-string
- "-mode\\'" "" mode-name))))
+ ,@custom-keyword-args)
(defun ,mode ()
,(or docstring
@@ -256,10 +275,10 @@ See the file generic-x.el for some examples of `define-generic-mode'."
(defun generic-mode-internal (mode comment-list keyword-list
font-lock-list function-list)
"Go into the generic mode MODE."
- (let* ((mode-name (symbol-name mode))
+ (let* ((name (symbol-name mode))
(pretty-name (capitalize (replace-regexp-in-string
- "-mode\\'" "" mode-name)))
- (mode-hook (intern (concat mode-name "-hook"))))
+ "-mode\\'" "" name)))
+ (mode-hook (intern (concat name "-hook"))))
(kill-all-local-variables)
@@ -373,7 +392,7 @@ Some generic modes are defined in `generic-x.el'."
imenu-case-fold-search t))
;; This generic mode is always defined
-(define-generic-mode default-generic-mode (list ?#) nil nil nil nil)
+(define-generic-mode default-generic-mode (list ?#) nil nil nil nil :group 'generic)
;; A more general solution would allow us to enter generic-mode for
;; *any* comment character, but would require us to synthesize a new