(easy-mmode-derive-name): New function.

(easy-mmode-define-toggle, define-minor-mode): Use it.
(easy-mmode-define-keymap): Docstring fix.
(define-derived-mode): Default PARENT to fundamental-mode.
Add the derived-mode-parent symbol-property.
(easy-mmode-derived-mode-p): New function.
This commit is contained in:
Stefan Monnier 2000-06-02 23:07:08 +00:00
parent f905e56a73
commit 3837de1250
2 changed files with 43 additions and 12 deletions

View file

@ -1,3 +1,14 @@
2000-06-02 Stefan Monnier <monnier@cs.yale.edu>
* log-edit.el (log-edit-done): Thinko in the "same comment" detection.
* emacs-lisp/easy-mmode.el (easy-mmode-derive-name): New function.
(easy-mmode-define-toggle, define-minor-mode): Use it.
(easy-mmode-define-keymap): Docstring fix.
(define-derived-mode): Default PARENT to fundamental-mode.
Add the derived-mode-parent symbol-property.
(easy-mmode-derived-mode-p): New function.
2000-06-02 Dave Love <fx@gnu.org>
* files.el (convert-standard-filename): Doc fix.
@ -11,8 +22,8 @@
(todo-cmd-raise): Fix typo.
(todo-top-priorities): Change temp buffer name.
(todo-category-alist): Avoid redundant lambda.
(todo-mode): Set paragraph-separate, outline-regexp from
todo-prefix. Use outline-next-heading.
(todo-mode): Set paragraph-separate, outline-regexp from todo-prefix.
Use outline-next-heading.
* autoarg.el: Rewritten to use define-minor-mode.
(autoarg-kp-digits, autoarg-kp-mode-map): New variable.
@ -24,6 +35,10 @@
2000-06-01 Stefan Monnier <monnier@cs.yale.edu>
* log-edit.el (log-edit-mode): Make vc-comment-ring-index local.
(log-edit-done): Only add the comment to the ring if it's different
from the last comment entered.
* isearch.el (isearch-highlight): Turn internal-find-face into facep.
2000-06-01 Dave Love <fx@gnu.org>

View file

@ -57,6 +57,7 @@ MODE is the so defined function that toggles the mode.
optional DOC is its associated documentation.
BODY is executed after the toggling and before running MODE-hook."
(let* ((mode-name (symbol-name mode))
(pretty-name (easy-mmode-derive-name mode-name))
(hook (intern (concat mode-name "-hook")))
(hook-on (intern (concat mode-name "-on-hook")))
(hook-off (intern (concat mode-name "-off-hook")))
@ -64,7 +65,7 @@ BODY is executed after the toggling and before running MODE-hook."
(format "With no argument, toggle %s.
With universal prefix ARG turn mode on.
With zero or negative ARG turn mode off.
\\{%s}" mode-name (concat mode-name "-map")))))
\\{%s}" pretty-name (concat mode-name "-map")))))
`(progn
(defcustom ,hook nil
,(format "Hook called at the end of function `%s'." mode-name)
@ -82,13 +83,14 @@ With zero or negative ARG turn mode off.
(run-hooks ',hook (if ,mode ',hook-on ',hook-off))
;; Return the new setting.
(if (interactive-p)
(message ,(format "%s %%sabled"
(replace-regexp-in-string
"-Mode" " mode"
(capitalize (symbol-name mode)) t))
(message ,(format "%s %%sabled" pretty-name)
(if ,mode "en" "dis")))
,mode))))
(defun easy-mmode-derive-name (mode)
(replace-regexp-in-string
"-Mode" " mode" (capitalize (symbol-name mode)) t))
;;;###autoload
(defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
;;;###autoload
@ -118,9 +120,11 @@ It will be executed after any toggling but before running the hooks."
`(progn
;; Define the variable to enable or disable the mode.
,(if globalp
`(defcustom ,mode ,init-value ,(format "Toggle %s.
`(defcustom ,mode ,init-value
,(format "Toggle %s.
Setting this variable directly does not take effect;
use either \\[customize] or the function `%s'." mode mode)
use either \\[customize] or the function `%s'."
(easy-mmode-derive-name mode) mode)
:set (lambda (symbol value) (funcall symbol (or value 0)))
:initialize 'custom-initialize-default
:type 'boolean)
@ -166,9 +170,9 @@ Use the function `%s' to change this variable." mode))
(defun easy-mmode-define-keymap (bs &optional name m args)
"Return a keymap built from bindings BS.
BS must be a list of (KEY . BINDING) where
KEY and BINDINGS are suited as for define-key.
optional NAME is passed to `make-sparse-keymap'.
optional map M can be used to modify an existing map.
KEY and BINDINGS are suitable for `define-key'.
Optional NAME is passed to `make-sparse-keymap'.
Optional map M can be used to modify an existing map.
ARGS is a list of additional arguments."
(let (inherit dense suppress)
(while args
@ -273,6 +277,8 @@ been generated automatically, with a reference to the keymap."
(abbrev (intern (concat child-name "-abbrev-table")))
(hook (intern (concat child-name "-hook"))))
(unless parent (setq parent 'fundamental-mode))
(when (and docstring (not (stringp docstring)))
;; DOCSTRING is really the first command and there's no docstring
(push docstring body)
@ -311,6 +317,7 @@ which more-or-less shadow %s's corresponding tables."
(defvar ,map (make-sparse-keymap))
(defvar ,syntax (make-char-table 'syntax-table nil))
(defvar ,abbrev (progn (define-abbrev-table ',abbrev nil) ,abbrev))
(put ',child 'derived-mode-parent ',parent)
(defun ,child ()
,docstring
@ -346,6 +353,15 @@ which more-or-less shadow %s's corresponding tables."
; Run the hooks, if any.
(run-hooks ',hook)))))
;; Inspired from derived-mode-class in derived.el
(defun easy-mmode-derived-mode-p (mode)
"Non-nil if the current major mode is derived from MODE.
Uses the `derived-mode-parent' property of the symbol to trace backwards."
(let ((parent major-mode))
(while (and (not (eq parent mode))
(setq parent (get parent 'derived-mode-parent))))
parent))
;;;
;;; easy-mmode-define-navigation