From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Wojciech Meyer Newsgroups: gmane.emacs.devel Subject: Re: Refreshing Info nodes Date: Sat, 28 Aug 2010 21:38:29 +0100 Message-ID: <87vd6upj5m.fsf@gmail.com> References: <87631mkeic.fsf@gmail.com> <87hbl54oi0.fsf@mail.jurta.org> <87r5k9clxh.fsf@mail.jurta.org> <87hbl4kn77.fsf@mail.jurta.org> <87bpbbkgt1.fsf@gmail.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: dough.gmane.org 1283027978 29321 80.91.229.12 (28 Aug 2010 20:39:38 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 28 Aug 2010 20:39:38 +0000 (UTC) Cc: Juri Linkov , Deniz Dogan , Wojciech Meyer , joakim@verona.se, emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Aug 28 22:39:33 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OpSBV-0008Aa-SV for ged-emacs-devel@m.gmane.org; Sat, 28 Aug 2010 22:39:32 +0200 Original-Received: from localhost ([127.0.0.1]:39618 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OpSBV-00037I-2M for ged-emacs-devel@m.gmane.org; Sat, 28 Aug 2010 16:39:29 -0400 Original-Received: from [140.186.70.92] (port=41962 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OpSBN-00036m-CF for emacs-devel@gnu.org; Sat, 28 Aug 2010 16:39:23 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OpSBL-00076R-3B for emacs-devel@gnu.org; Sat, 28 Aug 2010 16:39:21 -0400 Original-Received: from mail-wy0-f169.google.com ([74.125.82.169]:38043) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OpSBK-000768-Oj for emacs-devel@gnu.org; Sat, 28 Aug 2010 16:39:19 -0400 Original-Received: by wyb36 with SMTP id 36so6105349wyb.0 for ; Sat, 28 Aug 2010 13:39:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:references :date:in-reply-to:message-id:user-agent:mime-version:content-type; bh=+kpVIlC3BjNteD6RFpwuXbOvLqaFUUxy5XEdCzQOOM4=; b=uBan6ohtE6JMcKiSsvJCWail8WLAx+/N6DJoOPuz+suL+Pv8DKySaDsOiq03Uva/39 v8xNJxqWy/5FZ8+d90GCx03Bm7+LMBb+RjfC+ItZyppNpE2Kj9/m+iPzb6ZEuyBV2syo n018NYHCwH/fKGabwm8COOmqf4QMBZ2MzMpf0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type; b=bC9tsYYgFkhVq33sSOLg6LJwZGv9fRdcmM7Q1uh/7wXNu1trCM/FKyRGNv11i5wu+t SLlBV91QDLhT2pmn3gAYQKcqgl4M5BSPYTn/s+gl0jRnLNTFsZFHoJ0EGd0bd3n9NXYL HKj388F+wajV7rAfCni+EJu3li1Ayc1x++DMM= Original-Received: by 10.216.236.149 with SMTP id w21mr2750370weq.65.1283027947613; Sat, 28 Aug 2010 13:39:07 -0700 (PDT) Original-Received: from spec-desktop.specuu.com (host86-134-71-68.range86-134.btcentralplus.com [86.134.71.68]) by mx.google.com with ESMTPS id v44sm3384984weq.28.2010.08.28.13.39.03 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 28 Aug 2010 13:39:05 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Wed, 16 Jun 2010 09:39:58 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:129364 Archived-At: --=-=-= Stefan Monnier writes: > Currently special-mode is under used, so patches to use it in more > places are very welcome. Here is a `bzr bundle' to make use of the `special-mode' in more places. Modes that were under special treatment: archive-mode bookmark-bmenu-mode doc-view-mode image-mode occur-mode tar-mode In `archive-mode' I needed to get rid of optional argument `force', which was used to avoid somebody switching manually the mode, and since the symbol's become interactive, there is a danger (accoring to the comments - corruption). So I just added a help notice, saying that the user should not call `archive-mode' on her own. For the similar reasons I've left alone `dired-mode' and friends, as this takes arguments. (which are used). I didn't touch `ibuffer-mode' as this assert explicitly that the mode should not be derived (not sure why!), due too: `ibuffer-assert-ibuffer-mode' called from several places, and breaks `ibuffer' badly. These are not all the places were we should consider inheriting from special mode, possibly many other places where we could replace `defun' with `define-derived-mode'. Also I've noticed some incosistency across key-bindings, or duplications. Cheers; Wojciech --=-=-= Content-Disposition: inline; filename=define-derived-mode-special.txt # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: wojciech.meyer@gmail.com-20100828202929-\ # roh7mjkfjei6fjc5 # target_branch: http://bzr.savannah.gnu.org/r/emacs/trunk # testament_sha1: d2ad07a420042e9eccdc83278214b3fd852d27ae # timestamp: 2010-08-28 21:36:02 +0100 # source_branch: ../define-derived-mode/ # base_revision_id: eliz@gnu.org-20100828081013-yktp2zr7iafsxjtk # # Begin patch === modified file 'lisp/arc-mode.el' --- lisp/arc-mode.el 2010-07-10 18:52:53 +0000 +++ lisp/arc-mode.el 2010-08-28 17:47:11 +0000 @@ -341,7 +341,6 @@ (defvar archive-mode-map (let ((map (make-keymap))) (suppress-keymap map) - (define-key map " " 'archive-next-line) (define-key map "a" 'archive-alternate-display) ;;(define-key map "c" 'archive-copy) (define-key map "d" 'archive-flag-deleted) @@ -349,15 +348,12 @@ (define-key map "e" 'archive-extract) (define-key map "f" 'archive-extract) (define-key map "\C-m" 'archive-extract) - (define-key map "g" 'revert-buffer) - (define-key map "h" 'describe-mode) (define-key map "m" 'archive-mark) (define-key map "n" 'archive-next-line) (define-key map "\C-n" 'archive-next-line) (define-key map [down] 'archive-next-line) (define-key map "o" 'archive-extract-other-window) (define-key map "p" 'archive-previous-line) - (define-key map "q" 'quit-window) (define-key map "\C-p" 'archive-previous-line) (define-key map [up] 'archive-previous-line) (define-key map "r" 'archive-rename-entry) @@ -636,7 +632,7 @@ ;;; Section: the mode definition ;;;###autoload -(defun archive-mode (&optional force) +(define-derived-mode archive-mode special-mode "Archive mode" "Major mode for viewing an archive file in a dired-like way. You can move around using the usual cursor motion commands. Letters no longer insert themselves. @@ -647,13 +643,17 @@ save it, the contents of that buffer will be saved back into the archive. +This mode should be used non-interactively only. + \\{archive-mode-map}" ;; This is not interactive because you shouldn't be turning this ;; mode on and off. You can corrupt things that way. + ;; + ;; Now it's derived mode, so therefore it is interactive. (if (zerop (buffer-size)) ;; At present we cannot create archives from scratch (funcall (or (default-value 'major-mode) 'fundamental-mode)) - (if (and (not force) archive-files) nil + (if archive-files nil (let* ((type (archive-find-type)) (typename (capitalize (symbol-name type)))) (kill-all-local-variables) @@ -698,7 +698,6 @@ (string-match file-name-invalid-regexp (buffer-file-name))))) - (setq major-mode 'archive-mode) (setq mode-name (concat typename "-Archive")) ;; Run archive-foo-mode-hook and archive-mode-hook (run-mode-hooks (archive-name "mode-hook") 'archive-mode-hook) @@ -714,8 +713,7 @@ locale-coding-system)) (if (default-value 'enable-multibyte-characters) (set-buffer-multibyte 'to)) - (archive-summarize nil) - (setq buffer-read-only t)))) + (archive-summarize nil)))) ;; Archive mode is suitable only for specially formatted data. (put 'archive-mode 'mode-class 'special) === modified file 'lisp/bookmark.el' --- lisp/bookmark.el 2010-07-14 19:09:28 +0000 +++ lisp/bookmark.el 2010-08-28 17:45:38 +0000 @@ -1499,7 +1499,6 @@ (defvar bookmark-bmenu-mode-map (let ((map (make-keymap))) (suppress-keymap map t) - (define-key map "q" 'quit-window) (define-key map "v" 'bookmark-bmenu-select) (define-key map "w" 'bookmark-bmenu-locate) (define-key map "2" 'bookmark-bmenu-2-window) @@ -1515,11 +1514,9 @@ (define-key map "\C-d" 'bookmark-bmenu-delete-backwards) (define-key map "x" 'bookmark-bmenu-execute-deletions) (define-key map "d" 'bookmark-bmenu-delete) - (define-key map " " 'next-line) (define-key map "n" 'next-line) (define-key map "p" 'previous-line) (define-key map "\177" 'bookmark-bmenu-backup-unmark) - (define-key map "?" 'describe-mode) (define-key map "u" 'bookmark-bmenu-unmark) (define-key map "m" 'bookmark-bmenu-mark) (define-key map "l" 'bookmark-bmenu-load) @@ -1609,7 +1606,7 @@ -(defun bookmark-bmenu-mode () +(define-derived-mode bookmark-bmenu-mode special-mode "Bookmark Menu" "Major mode for editing a list of bookmarks. Each line describes one of the bookmarks in Emacs. Letters do not insert themselves; instead, they are commands. @@ -1645,9 +1642,6 @@ (kill-all-local-variables) (use-local-map bookmark-bmenu-mode-map) (setq truncate-lines t) - (setq buffer-read-only t) - (setq major-mode 'bookmark-bmenu-mode) - (setq mode-name "Bookmark Menu") (run-mode-hooks 'bookmark-bmenu-mode-hook)) === modified file 'lisp/doc-view.el' --- lisp/doc-view.el 2010-07-14 15:57:54 +0000 +++ lisp/doc-view.el 2010-08-28 20:21:22 +0000 @@ -333,7 +333,6 @@ (define-key map (kbd "C-c C-t") 'doc-view-open-text) ;; Reconvert the current document. Don't just use revert-buffer ;; because that resets the scale factor, the page number, ... - (define-key map (kbd "g") 'doc-view-revert-buffer) (define-key map (kbd "r") 'doc-view-revert-buffer) map) "Keymap used by `doc-view-mode' when displaying a doc as a set of images.") @@ -1207,7 +1206,7 @@ l)) ;;;###autoload -(defun doc-view-mode () +(define-derived-mode doc-view-mode special-mode "Doc" "Major mode in DocView buffers. DocView Mode is an Emacs document viewer. It displays PDF, PS @@ -1216,7 +1215,6 @@ You can use \\\\[doc-view-toggle-display] to toggle between displaying the document or editing it as text. \\{doc-view-mode-map}" - (interactive) (if (= (point-min) (point-max)) ;; The doc is empty or doesn't exist at all, so fallback to @@ -1311,15 +1309,14 @@ (set (make-local-variable 'after-revert-hook) 'doc-view-reconvert-doc) (set (make-local-variable 'bookmark-make-record-function) 'doc-view-bookmark-make-record) - (setq mode-name "DocView" - buffer-read-only t - major-mode 'doc-view-mode) + (setq buffer-read-only t) (doc-view-initiate-display) ;; Switch off view-mode explicitly, because doc-view-mode is the ;; canonical view mode for PDF/PS/DVI files. This could be ;; switched on automatically depending on the value of ;; `view-read-only'. (set (make-local-variable 'view-read-only) nil) + (setq revert-buffer-function 'doc-view-revert-buffer) (run-mode-hooks 'doc-view-mode-hook))) ;;;###autoload === modified file 'lisp/image-mode.el' --- lisp/image-mode.el 2010-08-17 21:19:11 +0000 +++ lisp/image-mode.el 2010-08-28 20:21:22 +0000 @@ -314,9 +314,7 @@ (defvar image-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) - (define-key map "q" 'quit-window) (define-key map "\C-c\C-c" 'image-toggle-display) - (define-key map (kbd "SPC") 'image-scroll-up) (define-key map (kbd "DEL") 'image-scroll-down) (define-key map [remap forward-char] 'image-forward-hscroll) (define-key map [remap backward-char] 'image-backward-hscroll) @@ -346,18 +344,16 @@ (put 'image-mode 'mode-class 'special) ;;;###autoload -(defun image-mode () +(define-derived-mode image-mode special-mode "Image" "Major mode for image files. You can use \\\\[image-toggle-display] to toggle between display as an image and display as text." - (interactive) (condition-case err (progn (unless (display-images-p) (error "Display does not support images")) (kill-all-local-variables) - (setq major-mode 'image-mode) (if (not (image-get-display-property)) (progn === modified file 'lisp/replace.el' --- lisp/replace.el 2010-08-08 21:12:29 +0000 +++ lisp/replace.el 2010-08-28 20:21:22 +0000 @@ -766,8 +766,6 @@ (define-key map "\M-p" 'occur-prev) (define-key map "r" 'occur-rename-buffer) (define-key map "c" 'clone-buffer) - (define-key map "g" 'revert-buffer) - (define-key map "q" 'quit-window) (define-key map "z" 'kill-this-buffer) (define-key map "\C-c\C-f" 'next-error-follow-minor-mode) (define-key map [menu-bar] (make-sparse-keymap)) @@ -834,18 +832,15 @@ :group 'matching) (put 'occur-mode 'mode-class 'special) -(defun occur-mode () +(define-derived-mode occur-mode special-mode "Occur" "Major mode for output from \\[occur]. \\Move point to one of the items in this buffer, then use \\[occur-mode-goto-occurrence] to go to the occurrence that the item refers to. Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it. \\{occur-mode-map}" - (interactive) (kill-all-local-variables) (use-local-map occur-mode-map) - (setq major-mode 'occur-mode) - (setq mode-name "Occur") (set (make-local-variable 'revert-buffer-function) 'occur-revert-function) (make-local-variable 'occur-revert-arguments) (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) === modified file 'lisp/tar-mode.el' --- lisp/tar-mode.el 2010-05-03 02:29:46 +0000 +++ lisp/tar-mode.el 2010-08-28 17:55:47 +0000 @@ -524,7 +524,6 @@ (defvar tar-mode-map (let ((map (make-keymap))) (suppress-keymap map) - (define-key map " " 'tar-next-line) (define-key map "C" 'tar-copy) (define-key map "d" 'tar-flag-deleted) (define-key map "\^D" 'tar-flag-deleted) @@ -532,14 +531,12 @@ (define-key map "f" 'tar-extract) (define-key map "\C-m" 'tar-extract) (define-key map [mouse-2] 'tar-mouse-extract) - (define-key map "g" 'revert-buffer) (define-key map "h" 'describe-mode) (define-key map "n" 'tar-next-line) (define-key map "\^N" 'tar-next-line) (define-key map [down] 'tar-next-line) (define-key map "o" 'tar-extract-other-window) (define-key map "p" 'tar-previous-line) - (define-key map "q" 'quit-window) (define-key map "\^P" 'tar-previous-line) (define-key map [up] 'tar-previous-line) (define-key map "R" 'tar-rename-entry) @@ -615,7 +612,7 @@ (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer))) ;;;###autoload -(define-derived-mode tar-mode nil "Tar" +(define-derived-mode tar-mode special-mode "Tar" "Major mode for viewing a tar file as a dired-like listing of its contents. You can move around using the usual cursor motion commands. Letters no longer insert themselves. # Begin bundle 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 7kinChIUPk1wgA== --=-=-=--