emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Refreshing Info nodes


From: Wojciech Meyer
Subject: Re: Refreshing Info nodes
Date: Sat, 28 Aug 2010 21:38:29 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

Stefan Monnier <address@hidden> 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

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
#   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: address@hidden
# 
# 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-mode-map>\\[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-mode-map>\\[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].
 \\<occur-mode-map>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==

reply via email to

[Prev in Thread] Current Thread [Next in Thread]