From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Masatake YAMATO Newsgroups: gmane.emacs.devel Subject: |PATCH| describe-minor-mode and describe-minor-mode-from-indicator Date: Sat, 18 Jan 2003 16:35:43 +0900 (JST) Sender: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Message-ID: <20030118.163543.59461489.jet@gyve.org> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: main.gmane.org 1042879344 20717 80.91.224.249 (18 Jan 2003 08:42:24 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Sat, 18 Jan 2003 08:42:24 +0000 (UTC) Cc: emacs-devel@gnu.org Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by main.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 18ZoYY-0005Nz-00 for ; Sat, 18 Jan 2003 09:42:22 +0100 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.12 #1 (Debian)) id 18ZoiN-0008KZ-00 for ; Sat, 18 Jan 2003 09:52:31 +0100 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 18ZoZK-0005iL-08 for emacs-devel@quimby.gnus.org; Sat, 18 Jan 2003 03:43:10 -0500 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10.13) id 18ZoYU-0004cs-00 for emacs-devel@gnu.org; Sat, 18 Jan 2003 03:42:18 -0500 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10.13) id 18ZoXy-000338-00 for emacs-devel@gnu.org; Sat, 18 Jan 2003 03:41:52 -0500 Original-Received: from r-maa.spacetown.ne.jp ([210.130.136.40]) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 18ZoXo-0002Tj-00 for emacs-devel@gnu.org; Sat, 18 Jan 2003 03:41:36 -0500 Original-Received: from localhost (h219-110-075-143.catv01.itscom.jp [219.110.75.143]) by r-maa.spacetown.ne.jp (8.11.6) with ESMTP id h0I8fQY00810; Sat, 18 Jan 2003 17:41:26 +0900 (JST) Original-To: "Stefan Monnier" X-Mailer: Mew version 2.2 on Emacs 21.3 / Mule 5.0 (SAKAKI) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1b5 Precedence: list List-Id: Emacs development discussions. List-Help: List-Post: List-Subscribe: , List-Archive: List-Unsubscribe: , Errors-To: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Xref: main.gmane.org gmane.emacs.devel:10839 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:10839 Dear, Stefan Monnier (I found your name on the MAINTAINERS file as a developer who has interests on minor-mode/major-mode infrastructure. So I've put your name to To: field of this mail.) I've created a prototype of describe-minor-mode. Background: Few days ago, I found a strange string on mode-line: "doe". I wonder what is "doe". However, I cannot find a way to know what is doe. M-x describe-mode tells me nothing about doe. Finally I have to do "grep doe emacs/lisp/*.el". What I did: I think we need something help functions for minor mode. I wrote 3 things: 1. M-x describe-minor-mode The user of describe-minor-mode can give its argument with completion. The completion table is built from the name of minor modes activated on the current buffer. 2. M-x describe-minor-mode-from-indicator Almost the same as describe-minor-mode but the user can pass an indicator instead of minor mode name to get help. I could not implment completion. (You will be not satisfied with "without completion".) 3. I added "Describe `MinorMode'" menu item to "Minor Modes" popup menu. The user can get help about a minor mode with mouse-3. I believe these functions helps beginner of Emacs. In other word the user might be confused with strange minor mode strings. Regards, Masatake YAMATO Index: help.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/help.el,v retrieving revision 1.255 diff -u -r1.255 help.el --- help.el 13 Jan 2003 08:04:46 -0000 1.255 +++ help.el 18 Jan 2003 08:19:27 -0000 @@ -611,6 +611,20 @@ (setq minor-modes (cdr minor-modes)))) (print-help-return-message)))) +(defun describe-minor-mode (minor-mode) + "Display documentation of a minor mode given as MINOR-MODE." + (interactive (list (intern (completing-read + "Minor mode: " + (delete nil (mapcar + (function (lambda (x) + (if (eval (car x)) + (list (symbol-name (car x)))))) + minor-mode-alist)))))) + (if (fboundp minor-mode) + (describe-function minor-mode) + (describe-variable minor-mode))) + + ;;; Automatic resizing of temporary buffers. Index: bindings.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/bindings.el,v retrieving revision 1.112 diff -u -r1.112 bindings.el --- bindings.el 21 Dec 2002 20:19:37 -0000 1.112 +++ bindings.el 18 Jan 2003 08:19:28 -0000 @@ -376,6 +376,14 @@ "Return the value of symbol VAR if it is bound, else nil." `(and (boundp (quote ,var)) ,var)) + +(define-key mode-line-mode-menu [describe-minor-mode] + `(menu-item ,'(format "Describe `%s'" + (substring mode-line-mode-menu-grab-mode-indicator 1)) + (lambda () (interactive) (describe-minor-mode-from-indicator)) + :visible (and mode-line-mode-menu-grab-mode-indicator + (string= " " (substring mode-line-mode-menu-grab-mode-indicator 0 1))))) + (define-key mode-line-mode-menu [overwrite-mode] `(menu-item ,(purecopy "Overwrite (Ovwrt)") overwrite-mode :button (:toggle . overwrite-mode))) @@ -413,9 +421,49 @@ `(menu-item ,(purecopy "Abbrev (Abbrev)") abbrev-mode :button (:toggle . abbrev-mode))) +(defun get-mode-indicator-from-event (event) + (car (nth 4 (car (cdr event))))) +(defvar mode-line-mode-menu-grab-mode-indicator nil) + (defun mode-line-mode-menu (event) (interactive "@e") + (setq mode-line-mode-menu-grab-mode-indicator (get-mode-indicator-from-event event)) (x-popup-menu event mode-line-mode-menu)) + +(defun describe-minor-mode-from-indicator (&optional indicator) + "Display documentation of a minor mode specified by INDICATOR." + (interactive "sIndicator: ") + (unless indicator + (setq indicator mode-line-mode-menu-grab-mode-indicator)) + (let ((minor-mode (lookup-minor-mode-from-indicator indicator))) + (if minor-mode + (describe-minor-mode minor-mode) + (message "Cannot find minor mode for `%s'" indicator)))) + +(defun lookup-minor-mode-from-indicator (indicator) + "Return a minor mode symbol from its indicator on the modeline." + (if (and (< 0 (length indicator)) + (not (string= " " (substring indicator 0 1)))) + (setq indicator (concat " " indicator))) + (let ((minor-modes minor-mode-alist) + result) + (while minor-modes + (let* ((minor-mode (car (car minor-modes))) + (anindicator (car (cdr (car minor-modes))))) + (while (and anindicator (symbolp anindicator) + (boundp anindicator) + (not (eq anindicator (symbol-value anindicator)))) + (setq anindicator (symbol-value anindicator))) + (if (and (consp anindicator) + (keywordp (car anindicator)) + (eq :eval (car anindicator))) + (setq anindicator (eval (cadr anindicator)))) + (if (and (stringp anindicator) + (string= anindicator indicator)) + (setq result minor-mode + minor-modes nil) + (setq minor-modes (cdr minor-modes))))) + result)) ;; Add menu of buffer operations to the buffer identification part ;; of the mode line.or header line.