From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#5062: 23.1.50; image-toggle-display overwrites nxml-mode local key map Date: Fri, 04 Dec 2009 02:05:02 +0200 Organization: JURTA Message-ID: <871vjbaagx.fsf@mail.jurta.org> References: <87einifskr.fsf@mail.jurta.org> <87bpim8d5b.fsf@mail.jurta.org> <87fx7x5np9.fsf@mail.jurta.org> <87hbs8zx0u.fsf@mail.jurta.org> <4B1745EE.5010401@f2s.com> Reply-To: Juri Linkov , 5062@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1259887667 31251 80.91.229.12 (4 Dec 2009 00:47:47 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 4 Dec 2009 00:47:47 +0000 (UTC) Cc: Tassilo Horn , Brent Goodrick , 5062@emacsbugs.donarmstrong.com To: Jason Rumney Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Dec 04 01:47:39 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NGMKg-0004G5-Om for geb-bug-gnu-emacs@m.gmane.org; Fri, 04 Dec 2009 01:47:39 +0100 Original-Received: from localhost ([127.0.0.1]:57245 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NGMKf-0008CE-Qo for geb-bug-gnu-emacs@m.gmane.org; Thu, 03 Dec 2009 19:47:37 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NGMKa-0008Bf-TW for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2009 19:47:32 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NGMKW-00089e-OK for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2009 19:47:32 -0500 Original-Received: from [199.232.76.173] (port=60588 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NGMKW-00089b-Gi for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2009 19:47:28 -0500 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:35217) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NGMKW-0006oD-1E for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2009 19:47:28 -0500 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id nB40lOmg010394; Thu, 3 Dec 2009 16:47:24 -0800 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.14.3/8.14.3/Submit) id nB40Z8qO009419; Thu, 3 Dec 2009 16:35:08 -0800 Resent-Date: Thu, 3 Dec 2009 16:35:08 -0800 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: Juri Linkov Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs 2Resent-Date: Fri, 04 Dec 2009 00:35:08 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: followup 5062 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 5062-submit@emacsbugs.donarmstrong.com id=B5062.12598864678889 (code B ref 5062); Fri, 04 Dec 2009 00:35:08 +0000 Original-Received: (at 5062) by emacsbugs.donarmstrong.com; 4 Dec 2009 00:27:47 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from mx2.starman.ee (smtp-out4.starman.ee [85.253.0.6]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id nB40RiBK008886 for <5062@emacsbugs.donarmstrong.com>; Thu, 3 Dec 2009 16:27:46 -0800 X-Virus-Scanned: by Amavisd-New at mx2.starman.ee Original-Received: from mail.starman.ee (82.131.30.124.cable.starman.ee [82.131.30.124]) by mx2.starman.ee (Postfix) with ESMTP id 5E4CD3F40D3; Fri, 4 Dec 2009 02:27:37 +0200 (EET) In-Reply-To: <4B1745EE.5010401@f2s.com> (Jason Rumney's message of "Thu, 03 Dec 2009 13:00:30 +0800") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (x86_64-pc-linux-gnu) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Resent-Date: Thu, 03 Dec 2009 19:47:32 -0500 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:33189 Archived-At: >> image-mode-maybe - finds a non-image mode in `auto-mode-alist' and >> activates it, also activates `image-minor-mode'. (`image-mode-maybe' >> is not a good name, but it's kept for backward compatibility). > > It seems like you are changing the behavior incompatibly, so why keep the > name? IIRC the original intention for image-mode-maybe was to use > a non-image mode from auto-mode-alist if it existed, otherwise use > image-mode. Right, so the patch below makes `image-mode-maybe' obsolete as an alias of `image-mode'. This makes it 99% backward-compatible except for rare cases when somehow `auto-mode-alist' doesn't contain a non-image mode - in this case Fundamental Mode is used. And a new name for the function that is a combination of `normal-mode' + `image-minor-mode' is now `image-mode-as-text'. This name avoids using the suffix `-mode' because it's not a real mode. A CVS patch with these changes and updated docstrings: Index: lisp/image-mode.el =================================================================== RCS file: /sources/emacs/emacs/lisp/image-mode.el,v retrieving revision 1.59 diff -c -r1.59 image-mode.el *** lisp/image-mode.el 28 Nov 2009 20:45:22 -0000 1.59 --- lisp/image-mode.el 4 Dec 2009 00:04:52 -0000 *************** *** 42,51 **** ;;;###autoload (push (cons (purecopy "\\.p[bpgn]m\\'") 'image-mode) auto-mode-alist) ;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'c-mode) auto-mode-alist) ! ;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'image-mode-maybe) auto-mode-alist) ;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'xml-mode) auto-mode-alist) ! ;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'image-mode-maybe) auto-mode-alist) ;;; Image mode window-info management. --- 42,51 ---- ;;;###autoload (push (cons (purecopy "\\.p[bpgn]m\\'") 'image-mode) auto-mode-alist) ;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'c-mode) auto-mode-alist) ! ;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'image-mode) auto-mode-alist) ;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'xml-mode) auto-mode-alist) ! ;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'image-mode) auto-mode-alist) ;;; Image mode window-info management. *************** *** 286,291 **** --- 286,294 ---- This variable is used to display the current image type in the mode line.") (make-variable-buffer-local 'image-type) + (defvar image-mode-previous-major-mode nil + "Internal variable to keep the previous non-image major mode.") + (defvar image-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) *************** *** 306,316 **** map) "Major mode keymap for viewing images in Image mode.") ! (defvar image-mode-text-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-c" 'image-toggle-display) map) ! "Major mode keymap for viewing images as text in Image mode.") (defvar bookmark-make-record-function) --- 309,319 ---- map) "Major mode keymap for viewing images in Image mode.") ! (defvar image-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-c" 'image-toggle-display) map) ! "Minor mode keymap for viewing images as text in Image mode.") (defvar bookmark-make-record-function) *************** *** 320,487 **** You can use \\\\[image-toggle-display] to toggle between display as an image and display as text." (interactive) ! (kill-all-local-variables) ! (setq major-mode 'image-mode) ! ;; Use our own bookmarking function for images. ! (set (make-local-variable 'bookmark-make-record-function) ! 'image-bookmark-make-record) ! ! ;; Keep track of [vh]scroll when switching buffers ! (image-mode-setup-winprops) ! ! (add-hook 'change-major-mode-hook 'image-toggle-display-text nil t) ! (if (display-images-p) ! (if (not (image-get-display-property)) ! (image-toggle-display) ! ;; Set next vars when image is already displayed but local ! ;; variables were cleared by kill-all-local-variables (use-local-map image-mode-map) ! (setq cursor-type nil truncate-lines t ! image-type (plist-get (cdr (image-get-display-property)) :type))) ! (setq image-type "text") ! (use-local-map image-mode-text-map)) ! (setq mode-name (format "Image[%s]" image-type)) ! (run-mode-hooks 'image-mode-hook) ! (if (display-images-p) ! (message "%s" (concat ! (substitute-command-keys ! "Type \\[image-toggle-display] to view as ") ! (if (image-get-display-property) ! "text" "an image") ".")))) ;;;###autoload (define-minor-mode image-minor-mode "Toggle Image minor mode. With arg, turn Image minor mode on if arg is positive, off otherwise. ! See the command `image-mode' for more information on this mode." ! nil (:eval (format " Image[%s]" image-type)) image-mode-text-map :group 'image :version "22.1" ! (if (not image-minor-mode) ! (image-toggle-display-text) ! (image-mode-setup-winprops) ! (add-hook 'change-major-mode-hook (lambda () (image-minor-mode -1)) nil t) ! (if (display-images-p) ! (condition-case err ! (progn ! (if (not (image-get-display-property)) ! (image-toggle-display) ! (setq cursor-type nil truncate-lines t ! image-type (plist-get (cdr (image-get-display-property)) ! :type))) ! (message "%s" ! (concat ! (substitute-command-keys ! "Type \\[image-toggle-display] to view the image as ") ! (if (image-get-display-property) ! "text" "an image") "."))) ! (error ! (image-toggle-display-text) ! (funcall ! (if (called-interactively-p 'any) 'error 'message) ! "Cannot display image: %s" (cdr err)))) ! (setq image-type "text") ! (use-local-map image-mode-text-map)))) ;;;###autoload ! (defun image-mode-maybe () ! "Set major or minor mode for image files. ! Set Image major mode only when there are no other major modes ! associated with a filename in `auto-mode-alist'. When an image ! filename matches another major mode in `auto-mode-alist' then ! set that major mode and Image minor mode. ! See commands `image-mode' and `image-minor-mode' for more ! information on these modes." (interactive) ! (let* ((mode-alist ! (delq nil (mapcar ! (lambda (elt) ! (unless (memq (or (car-safe (cdr elt)) (cdr elt)) ! '(image-mode image-mode-maybe)) ! elt)) ! auto-mode-alist)))) ! (if (assoc-default buffer-file-name mode-alist 'string-match) ! (let ((auto-mode-alist mode-alist) ! (magic-mode-alist nil)) ! (set-auto-mode) ! (image-minor-mode t)) ! (image-mode)))) (defun image-toggle-display-text () ! "Showing the text of the image file." ! (if (image-get-display-property) ! (image-toggle-display))) (defvar archive-superior-buffer) (defvar tar-superior-buffer) (declare-function image-refresh "image.c" (spec &optional frame)) (defun image-toggle-display () "Start or stop displaying an image file as the actual image. ! This command toggles between showing the text of the image file ! and showing the image as an image." (interactive) (if (image-get-display-property) ! (let ((inhibit-read-only t) ! (buffer-undo-list t) ! (modified (buffer-modified-p))) ! (remove-list-of-text-properties (point-min) (point-max) ! '(display intangible read-nonsticky ! read-only front-sticky)) ! (set-buffer-modified-p modified) ! (kill-local-variable 'cursor-type) ! (kill-local-variable 'truncate-lines) ! (kill-local-variable 'auto-hscroll-mode) ! (use-local-map image-mode-text-map) ! (setq image-type "text") ! (if (eq major-mode 'image-mode) ! (setq mode-name "Image[text]")) ! (if (called-interactively-p 'any) ! (message "Repeat this command to go back to displaying the image"))) ! ;; Turn the image data into a real image, but only if the whole file ! ;; was inserted ! (let* ((filename (buffer-file-name)) ! (data-p (not (and filename ! (file-readable-p filename) ! (not (file-remote-p filename)) ! (not (buffer-modified-p)) ! (not (and (boundp 'archive-superior-buffer) ! archive-superior-buffer)) ! (not (and (boundp 'tar-superior-buffer) ! tar-superior-buffer))))) ! (file-or-data (if data-p ! (string-make-unibyte ! (buffer-substring-no-properties (point-min) (point-max))) ! filename)) ! (type (image-type file-or-data nil data-p)) ! (image (create-image file-or-data type data-p)) ! (props ! `(display ,image ! intangible ,image ! rear-nonsticky (display intangible) ! read-only t front-sticky (read-only))) ! (inhibit-read-only t) ! (buffer-undo-list t) ! (modified (buffer-modified-p))) ! (image-refresh image) ! (let ((buffer-file-truename nil)) ; avoid changing dir mtime by lock_file ! (add-text-properties (point-min) (point-max) props) ! (restore-buffer-modified-p modified)) ! ;; Inhibit the cursor when the buffer contains only an image, ! ;; because cursors look very strange on top of images. ! (setq cursor-type nil) ! ;; This just makes the arrow displayed in the right fringe ! ;; area look correct when the image is wider than the window. ! (setq truncate-lines t) ! ;; Allow navigation of large images ! (set (make-local-variable 'auto-hscroll-mode) nil) ! (use-local-map image-mode-map) ! (setq image-type type) ! (if (eq major-mode 'image-mode) ! (setq mode-name (format "Image[%s]" type))) ! (if (called-interactively-p 'any) ! (message "Repeat this command to go back to displaying the file as text"))))) ;;; Support for bookmark.el (declare-function bookmark-make-record-default "bookmark" --- 323,504 ---- 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 ! (image-toggle-display-image) ! ;; If attempt to display the image fails. ! (if (not (image-get-display-property)) ! (error "Invalid image"))) ! ;; Set next vars when image is already displayed but local ! ;; variables were cleared by kill-all-local-variables ! (setq cursor-type nil truncate-lines t ! image-type (plist-get (cdr (image-get-display-property)) :type))) ! ! (setq mode-name (if image-type (format "Image[%s]" image-type) "Image")) (use-local-map image-mode-map) ! ! ;; Use our own bookmarking function for images. ! (set (make-local-variable 'bookmark-make-record-function) ! 'image-bookmark-make-record) ! ! ;; Keep track of [vh]scroll when switching buffers ! (image-mode-setup-winprops) ! ! (add-hook 'change-major-mode-hook 'image-toggle-display-text nil t) ! (run-mode-hooks 'image-mode-hook) ! (message "%s" (concat ! (substitute-command-keys ! "Type \\[image-toggle-display] to view the image as ") ! (if (image-get-display-property) ! "text" "an image") "."))) ! (error ! (image-mode-as-text) ! (funcall ! (if (called-interactively-p 'any) 'error 'message) ! "Cannot display image: %s" (cdr err))))) ;;;###autoload (define-minor-mode image-minor-mode "Toggle Image minor mode. With arg, turn Image minor mode on if arg is positive, off otherwise. ! It provides the key \\\\[image-toggle-display] \ ! to switch back to `image-mode' ! to display an image file as the actual image." ! nil (:eval (if image-type (format " Image[%s]" image-type) " Image")) ! image-minor-mode-map :group 'image :version "22.1" ! (if image-minor-mode ! (add-hook 'change-major-mode-hook (lambda () (image-minor-mode -1)) nil t))) ;;;###autoload ! (defun image-mode-as-text () ! "Set a non-image mode as major mode in combination with image minor mode. ! A non-image major mode found from `auto-mode-alist' or Fundamental mode ! displays an image file as text. `image-minor-mode' provides the key ! \\\\[image-toggle-display] to switch back to `image-mode' ! to display an image file as the actual image. ! ! You can use `image-mode-as-text' in `auto-mode-alist' when you want ! to display an image file as text inititally. ! See commands `image-mode' and `image-minor-mode' for more information ! on these modes." (interactive) ! ;; image-mode-as-text = normal-mode + image-minor-mode ! (let ((previous-image-type image-type)) ; preserve `image-type' ! (if image-mode-previous-major-mode ! ;; Restore previous major mode that was already found by this ! ;; function and cached in `image-mode-previous-major-mode' ! (funcall image-mode-previous-major-mode) ! (let ((auto-mode-alist ! (delq nil (mapcar ! (lambda (elt) ! (unless (memq (or (car-safe (cdr elt)) (cdr elt)) ! '(image-mode image-mode-maybe image-mode-as-text)) ! elt)) ! auto-mode-alist))) ! (magic-fallback-mode-alist ! (delq nil (mapcar ! (lambda (elt) ! (unless (memq (or (car-safe (cdr elt)) (cdr elt)) ! '(image-mode image-mode-maybe image-mode-as-text)) ! elt)) ! magic-fallback-mode-alist)))) ! (normal-mode) ! (set (make-local-variable 'image-mode-previous-major-mode) major-mode))) ! ;; Restore `image-type' after `kill-all-local-variables' in `normal-mode'. ! (setq image-type previous-image-type) ! ;; Enable image minor mode with `C-c C-c'. ! (image-minor-mode 1) ! ;; Show the image file as text. ! (image-toggle-display-text) ! (message "%s" (concat ! (substitute-command-keys ! "Type \\[image-toggle-display] to view the image as ") ! (if (image-get-display-property) ! "text" "an image") ".")))) ! ! (define-obsolete-function-alias 'image-mode-maybe 'image-mode "23.2") (defun image-toggle-display-text () ! "Show the image file as text. ! Remove text properties that display the image." ! (let ((inhibit-read-only t) ! (buffer-undo-list t) ! (modified (buffer-modified-p))) ! (remove-list-of-text-properties (point-min) (point-max) ! '(display intangible read-nonsticky ! read-only front-sticky)) ! (set-buffer-modified-p modified) ! (if (called-interactively-p 'any) ! (message "Repeat this command to go back to displaying the image")))) (defvar archive-superior-buffer) (defvar tar-superior-buffer) (declare-function image-refresh "image.c" (spec &optional frame)) + (defun image-toggle-display-image () + "Show the image of the image file. + Turn the image data into a real image, but only if the whole file + was inserted." + (let* ((filename (buffer-file-name)) + (data-p (not (and filename + (file-readable-p filename) + (not (file-remote-p filename)) + (not (buffer-modified-p)) + (not (and (boundp 'archive-superior-buffer) + archive-superior-buffer)) + (not (and (boundp 'tar-superior-buffer) + tar-superior-buffer))))) + (file-or-data (if data-p + (string-make-unibyte + (buffer-substring-no-properties (point-min) (point-max))) + filename)) + (type (image-type file-or-data nil data-p)) + (image (create-image file-or-data type data-p)) + (props + `(display ,image + intangible ,image + rear-nonsticky (display intangible) + read-only t front-sticky (read-only))) + (inhibit-read-only t) + (buffer-undo-list t) + (modified (buffer-modified-p))) + (image-refresh image) + (let ((buffer-file-truename nil)) ; avoid changing dir mtime by lock_file + (add-text-properties (point-min) (point-max) props) + (restore-buffer-modified-p modified)) + ;; Inhibit the cursor when the buffer contains only an image, + ;; because cursors look very strange on top of images. + (setq cursor-type nil) + ;; This just makes the arrow displayed in the right fringe + ;; area look correct when the image is wider than the window. + (setq truncate-lines t) + ;; Allow navigation of large images + (set (make-local-variable 'auto-hscroll-mode) nil) + (setq image-type type) + (if (eq major-mode 'image-mode) + (setq mode-name (format "Image[%s]" type))) + (if (called-interactively-p 'any) + (message "Repeat this command to go back to displaying the file as text")))) + (defun image-toggle-display () "Start or stop displaying an image file as the actual image. ! This command toggles between `image-mode-as-text' showing the text of ! the image file and `image-mode' showing the image as an image." (interactive) (if (image-get-display-property) ! (image-mode-as-text) ! (image-mode))) ;;; Support for bookmark.el (declare-function bookmark-make-record-default "bookmark" -- Juri Linkov http://www.jurta.org/emacs/