all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Tassilo Horn <tassilo@member.fsf.org>
To: rms@gnu.org
Cc: emacs-devel@gnu.org
Subject: Re: doc-view compilation warnings
Date: Tue, 23 Oct 2007 15:32:15 +0200	[thread overview]
Message-ID: <87prz6yn1c.fsf@baldur.tsdh.de> (raw)
In-Reply-To: <E1Ijt92-00007N-L3@fencepost.gnu.org> (Richard Stallman's message of "Mon, 22 Oct 2007 05:00:20 -0400")

[-- Attachment #1: Type: text/plain, Size: 648 bytes --]

Richard Stallman <rms@gnu.org> writes:

>     Yes, I know.  I'll fix those after my latest patch got applied.
>     So what is the convention?  Is calling a cl-function at runtime
>     strictly forbidden?
>
> Yes.

Ok, this patch fixes this issue plus the "open dvi/pdf files with
doc-view and ps-files with ps-mode by default" issue.  (See message
<877ilj45zn.fsf@baldur.tsdh.de> and its follow-ups.)

The only thing that remains is to find another keybinding for toggling
between editing and viewing with doc-view, because ps-mode already uses
`C-c C-c'.  Suggestions?

The patch is also at http://www.tsdh.de/stuff/doc-view.patch

Bye,
Tassilo

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: doc-view.patch --]
[-- Type: text/x-patch, Size: 15960 bytes --]

Index: lisp/files.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/files.el,v
retrieving revision 1.936
diff -u -r1.936 files.el
--- lisp/files.el	21 Oct 2007 10:48:28 -0000	1.936
+++ lisp/files.el	23 Oct 2007 12:53:00 -0000
@@ -2060,7 +2060,8 @@
      ("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)
      ("\\.\\(dif\\|pat\\)\\'" . diff-mode) ; for MSDOG
      ("\\.[eE]?[pP][sS]\\'" . ps-mode)
-     ("\\.\\(?:PDF\\|DVI\\|pdf\\|dvi\\)" . doc-view-mode)
+     ("\\.[Pp][Dd][Ff]\\'" . ps-mode)
+     ("\\.[Dd][Vv][Ii]\\'" . fundamental-mode)
      ("configure\\.\\(ac\\|in\\)\\'" . autoconf-mode)
      ("BROWSE\\'" . ebrowse-tree-mode)
      ("\\.ebrowse\\'" . ebrowse-tree-mode)
Index: lisp/doc-view.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/doc-view.el,v
retrieving revision 1.11
diff -u -r1.11 doc-view.el
--- lisp/doc-view.el	19 Oct 2007 16:03:09 -0000	1.11
+++ lisp/doc-view.el	23 Oct 2007 12:53:01 -0000
@@ -104,6 +104,10 @@
 (require 'image-mode)
 (eval-when-compile (require 'cl))
 
+;;;###autoload (push '("\\.[eE]?[pP][sS]\\'" . doc-view-mode-maybe) auto-mode-alist)
+;;;###autoload (push '("\\.[Dd][Vv][Ii]\\'"  . doc-view-mode-maybe) auto-mode-alist)
+;;;###autoload (push '("\\.[Pp][Dd][Ff]\\'"  . doc-view-mode-maybe) auto-mode-alist)
+
 ;;;; Customization Options
 
 (defgroup doc-view nil
@@ -202,9 +206,6 @@
 (defvar doc-view-current-info nil
   "Only used internally.")
 
-(defvar doc-view-current-display nil
-  "Only used internally.")
-
 ;;;; DocView Keymaps
 
 (defvar doc-view-mode-map
@@ -224,6 +225,7 @@
     ;; Killing/burying the buffer (and the process)
     (define-key map (kbd "q")         'bury-buffer)
     (define-key map (kbd "k")         'doc-view-kill-proc-and-buffer)
+    (define-key map (kbd "K")         'doc-view-kill-proc)
     ;; Slicing the image
     (define-key map (kbd "s s")       'doc-view-set-slice)
     (define-key map (kbd "s m")       'doc-view-set-slice-using-mouse)
@@ -242,24 +244,18 @@
     (define-key map (kbd "C-t")       'doc-view-show-tooltip)
     ;; Toggle between text and image display or editing
     (define-key map (kbd "C-c C-c")   'doc-view-toggle-display)
-    (define-key map (kbd "C-c C-e")   'doc-view-edit-doc)
     ;; Reconvert the current document
     (define-key map (kbd "g")         'doc-view-reconvert-doc)
     (suppress-keymap map)
     map)
   "Keymap used by `doc-view-mode' when displaying a doc as a set of images.")
 
-(defvar doc-view-mode-text-map
+(defvar doc-view-minor-mode-map
   (let ((map (make-sparse-keymap)))
     ;; Toggle between text and image display or editing
     (define-key map (kbd "C-c C-c") 'doc-view-toggle-display)
-    (define-key map (kbd "C-c C-e") 'doc-view-edit-doc)
-    ;; Killing/burying the buffer (and the process)
-    (define-key map (kbd "q")         'bury-buffer)
-    (define-key map (kbd "k")         'doc-view-kill-proc-and-buffer)
-    (define-key map (kbd "C-x k")     'doc-view-kill-proc-and-buffer)
     map)
-  "Keymap used by `doc-view-mode' when displaying a document as text.")
+  "Keymap used by `doc-minor-view-mode'.")
 
 ;;;; Navigation Commands
 
@@ -339,11 +335,14 @@
     (error (doc-view-previous-page)
 	   (goto-char (point-max)))))
 
+;;;; Utility Functions
+
 (defun doc-view-kill-proc ()
   "Kill the current converter process."
   (interactive)
   (when doc-view-current-converter-process
-    (kill-process doc-view-current-converter-process))
+    (kill-process doc-view-current-converter-process)
+    (setq doc-view-current-converter-process nil))
   (when doc-view-current-timer
     (cancel-timer doc-view-current-timer)
     (setq doc-view-current-timer nil))
@@ -356,6 +355,37 @@
   (when (eq major-mode 'doc-view-mode)
     (kill-buffer (current-buffer))))
 
+(defun doc-view-clean-auto-mode-alist ()
+  "Return `auto-mode-alist' with all occurences of `doc-view-mode-maybe' removed."
+  (delq nil (mapcar
+	     (lambda (elt)
+	       (unless (eq (or (car-safe (cdr elt)) (cdr elt))
+			   'doc-view-mode-maybe)
+		 elt))
+	     auto-mode-alist)))
+
+(defun doc-view-current-cache-dir ()
+  "Return the directory where the png files of the current doc should be saved.
+It's a subdirectory of `doc-view-cache-directory'."
+  (if doc-view-current-cache-dir
+      doc-view-current-cache-dir
+    (setq doc-view-current-cache-dir
+	  (file-name-as-directory
+	   (concat (file-name-as-directory doc-view-cache-directory)
+		   (let ((doc doc-view-current-doc))
+		     (concat (file-name-nondirectory doc)
+			     "-"
+			     (with-temp-buffer
+			       (insert-file-contents-literally doc)
+			       (md5 (current-buffer))))))))))
+
+(defun doc-view-remove-if (predicate list)
+  "Return LIST with all items removed that satisfy PREDICATE."
+  (let (new-list)
+    (dolist (item list (nreverse new-list))
+      (when (not (funcall predicate item))
+	(setq new-list (cons item new-list))))))
+
 ;;;; Conversion Functions
 
 (defun doc-view-reconvert-doc (&rest args)
@@ -368,21 +398,7 @@
     ;; Clear the old cached files
     (when (file-exists-p (doc-view-current-cache-dir))
       (dired-delete-file (doc-view-current-cache-dir) 'always))
-    (doc-view-kill-proc-and-buffer)
-    (find-file doc)))
-
-(defun doc-view-current-cache-dir ()
-  "Return the directory where the png files of the current doc should be saved.
-It's a subdirectory of `doc-view-cache-directory'."
-  (if doc-view-current-cache-dir
-      doc-view-current-cache-dir
-    (setq doc-view-current-cache-dir
-	  (file-name-as-directory
-	   (concat (file-name-as-directory doc-view-cache-directory)
-		   (let ((doc doc-view-current-doc))
-		     (with-temp-buffer
-		       (insert-file-contents-literally doc)
-		       (md5 (current-buffer)))))))))
+    (doc-view-mode)))
 
 (defun doc-view-dvi->pdf-sentinel (proc event)
   "If DVI->PDF conversion was successful, convert the PDF to PNG now."
@@ -439,7 +455,7 @@
   (when doc-view-conversion-refresh-interval
     (setq doc-view-current-timer
 	  (run-at-time "1 secs" doc-view-conversion-refresh-interval
-		       'doc-view-display-maybe
+		       'doc-view-display
 		       doc-view-current-doc))))
 
 (defun doc-view-pdf->txt-sentinel (proc event)
@@ -482,10 +498,11 @@
   (setq doc-view-current-converter-process
 	(start-process "ps->pdf" doc-view-conversion-buffer
 		       doc-view-ps2pdf-program
-		       ps pdf
 		       ;; Avoid security problems when rendering files from
 		       ;; untrusted sources.
-		       "-dSAFER")
+		       "-dSAFER"
+		       ;; in-file and out-file
+		       ps pdf)
 	mode-line-process (list (format ":%s" doc-view-current-converter-process)))
   (set-process-sentinel doc-view-current-converter-process
 			'doc-view-ps->pdf-sentinel)
@@ -499,7 +516,7 @@
   (clear-image-cache)
   (let ((png-file (concat (doc-view-current-cache-dir)
 			  "page-%d.png")))
-    (make-directory doc-view-current-cache-dir t)
+    (make-directory (doc-view-current-cache-dir) t)
     (if (not (string= (file-name-extension doc-view-current-doc) "dvi"))
 	;; Convert to PNG images.
 	(doc-view-pdf/ps->png doc-view-current-doc png-file)
@@ -576,11 +593,6 @@
 	nil
       (string< a b))))
 
-(defun doc-view-display-maybe (doc)
-  "Call `doc-view-display' iff we're in the image display."
-  (when (eq doc-view-current-display 'image)
-    (doc-view-display doc)))
-
 (defun doc-view-display (doc)
   "Start viewing the document DOC."
   (set-buffer (get-file-buffer doc))
@@ -603,58 +615,36 @@
 For now these keys are useful:
 
 `q' : Bury this buffer.  Conversion will go on in background.
-`k' : Kill the conversion process and this buffer.\n")
+`k' : Kill the conversion process and this buffer.
+`K' : Kill the conversion process.\n")
   (set-buffer-modified-p nil))
 
 (defun doc-view-show-tooltip ()
   (interactive)
   (tooltip-show doc-view-current-info))
 
-;;;;; Toggle between text and image display
+;;;;; Toggle between editing and viewing
 
 (defun doc-view-toggle-display ()
-  "Start or stop displaying a document file as a set of images.
-This command toggles between showing the text of the document
-file and showing the document as a set of images."
+  "Toggle between editing a document as text or viewing it."
   (interactive)
-  (if (get-text-property (point-min) 'display)
-      ;; Switch to text display
-      (let ((inhibit-read-only t))
+  (if (eq major-mode 'doc-view-mode)
+      ;; Switch to editing mode
+      (let ((auto-mode-alist (doc-view-clean-auto-mode-alist))
+            (doc doc-view-current-doc))
+	(doc-view-kill-proc)
+	(setq buffer-read-only nil)
 	(erase-buffer)
-	(insert-file-contents doc-view-current-doc)
-	(use-local-map doc-view-mode-text-map)
-	(setq mode-name "DocView[text]"
-	      doc-view-current-display 'text)
-	(if (called-interactively-p)
-	    (message "Repeat this command to go back to displaying the file as images")))
-    ;; Switch to image display
-    (let ((inhibit-read-only t))
-      (erase-buffer)
-      (doc-view-buffer-message)
-      (setq doc-view-current-page (or doc-view-current-page 1))
-      (if (file-exists-p (doc-view-current-cache-dir))
-	  (progn
-	    (message "DocView: using cached files!")
-	    (doc-view-display doc-view-current-doc))
-	(doc-view-convert-current-doc))
-      (use-local-map doc-view-mode-map)
-      (setq mode-name (format "DocView")
-	    doc-view-current-display 'image)
-      (if (called-interactively-p)
-	  (message "Repeat this command to go back to displaying the file as text"))))
-  (set-buffer-modified-p nil))
-
-;;;;; Leave doc-view-mode and open the file for edit
-
-(defun doc-view-edit-doc ()
-  "Leave `doc-view-mode' and open the current doc with an appropriate editing mode."
-  (interactive)
-  (let ((filename doc-view-current-doc)
-	(auto-mode-alist (append '(("\\.[eE]?[pP][sS]\\'" . ps-mode)
-				   ("\\.\\(pdf\\|PDF\\|dvi\\|DVI\\)$" . fundamental-mode))
-				 auto-mode-alist)))
-    (kill-buffer (current-buffer))
-    (find-file filename)))
+	(insert-file-contents buffer-file-name)
+	(set-auto-mode)
+	(doc-view-minor-mode 1)
+	(set-buffer-modified-p nil))
+    ;; Switch to doc-view-mode
+    (when (and (buffer-modified-p)
+	       (y-or-n-p "The buffer has been modified.  Save the changes? "))
+      (save-buffer))
+    (erase-buffer)
+    (doc-view-mode)))
 
 ;;;; Searching
 
@@ -742,8 +732,9 @@
 (defun doc-view-search-next-match (arg)
   "Go to the ARGth next matching page."
   (interactive "p")
-  (let* ((next-pages (remove-if (lambda (i) (<= (car i) doc-view-current-page))
-				doc-view-current-search-matches))
+  (let* ((next-pages (doc-view-remove-if
+		      (lambda (i) (<= (car i) doc-view-current-page))
+		      doc-view-current-search-matches))
 	 (page (car (nth (1- arg) next-pages))))
     (if page
 	(doc-view-goto-page page)
@@ -755,8 +746,9 @@
 (defun doc-view-search-previous-match (arg)
   "Go to the ARGth previous matching page."
   (interactive "p")
-  (let* ((prev-pages (remove-if (lambda (i) (>= (car i) doc-view-current-page))
-				doc-view-current-search-matches))
+  (let* ((prev-pages (doc-view-remove-if
+		      (lambda (i) (>= (car i) doc-view-current-page))
+		      doc-view-current-search-matches))
 	 (page (car (nth (1- arg) (nreverse prev-pages)))))
     (if page
 	(doc-view-goto-page page)
@@ -773,7 +765,7 @@
 (define-derived-mode doc-view-mode nil "DocView"
   "Major mode in DocView buffers.
 You can use \\<doc-view-mode-map>\\[doc-view-toggle-display] to
-toggle between display as a set of images and display as text."
+toggle between displaying the document or editing it as text."
   :group 'doc-view
   (make-local-variable 'doc-view-current-files)
   (make-local-variable 'doc-view-current-doc)
@@ -787,20 +779,65 @@
   (make-local-variable 'doc-view-current-search-matches)
   (setq doc-view-current-doc (buffer-file-name))
   (insert-file-contents doc-view-current-doc)
-  (use-local-map doc-view-mode-text-map)
-  (setq mode-name "DocView[text]"
-	doc-view-current-display 'text
+  (use-local-map doc-view-mode-map)
+  (setq mode-name "DocView"
 	buffer-read-only t
 	revert-buffer-function 'doc-view-reconvert-doc)
   ;; Switch to image display if possible
   (if (and (display-images-p)
-	   (image-type-available-p 'png)
-	   (not (get-text-property (point-min) 'display)))
-      (doc-view-toggle-display))
-  (message
-   "%s"
-   (substitute-command-keys
-    "Type \\[doc-view-toggle-display] to toggle between image and text display.")))
+	   (image-type-available-p 'png))
+      (let ((inhibit-read-only t))
+	(erase-buffer)
+	(doc-view-buffer-message)
+	(setq doc-view-current-page (or doc-view-current-page 1))
+	(if (file-exists-p (doc-view-current-cache-dir))
+	    (progn
+	      (message "DocView: using cached files!")
+	      (doc-view-display doc-view-current-doc))
+	  (doc-view-convert-current-doc))
+	(use-local-map doc-view-mode-map)
+	(message
+	 "%s"
+	 (substitute-command-keys
+	  (concat "Type \\[doc-view-toggle-display] to toggle between "
+		  "editing or viewing the document."))))
+    (message
+	 "%s"
+	 (substitute-command-keys
+	  (concat "No image (png) support available.  Type \\[doc-view-toggle-display] "
+		  "to switch to an editing mode.")))))
+
+;;;###autoload
+(define-minor-mode doc-view-minor-mode
+  "Toggle Doc view minor mode.
+With arg, turn Doc view minor mode on if arg is positive, off otherwise.
+See the command `doc-view-mode' for more information on this mode."
+  nil " DocView" doc-view-minor-mode-map
+  :group 'doc-view
+  (when doc-view-minor-mode
+    (add-hook 'change-major-mode-hook (lambda () (doc-view-minor-mode -1)) nil t)
+    (message
+     "%s"
+     (substitute-command-keys
+      "Type \\[doc-view-toggle-display] to toggle between editing or viewing the document."))))
+
+;;;###autoload
+(defun doc-view-mode-maybe ()
+  "Set major or minor mode for document files.
+For PostScript files use the editing mode found in
+`auto-mode-alist' and enable `doc-view-minor-mode', else use
+`doc-view-mode'.
+
+See commands `doc-view-mode' and `doc-view-minor-mode' for more
+information on these modes."
+  (interactive)
+  (let ((mode-alist (doc-view-clean-auto-mode-alist)))
+    (if (string-match "^[eE]?[pP][sS]$" (file-name-extension buffer-file-name))
+	(let ((auto-mode-alist  mode-alist)
+	      (magic-mode-alist nil))
+	  (set-auto-mode)
+	  (doc-view-minor-mode 1))
+      (doc-view-mode))))
 
 (defun doc-view-clear-cache ()
   "Delete the whole cache (`doc-view-cache-directory')."
Index: lisp/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.12034
diff -u -r1.12034 ChangeLog
--- lisp/ChangeLog	23 Oct 2007 08:42:39 -0000	1.12034
+++ lisp/ChangeLog	23 Oct 2007 12:53:08 -0000
@@ -1,3 +1,27 @@
+2007-10-23  Tassilo Horn  <tassilo@member.fsf.org>
+
+	* doc-view.el (doc-view-mode): Remove text/image switching code.
+	(doc-view-minor-mode): New minor mode.
+	(doc-view-mode-maybe): New function.
+	(doc-view-minor-mode-map): New keymap.
+	(doc-view-mode-text-map): Remove keymap.
+	(doc-view-mode-map): New binding K to kill the converter process.
+	(doc-view-current-display): Remove variable.
+	(doc-vie w-buffer-message): Mention new binding K.
+	(doc-view-displa y-maybe): Remove function.
+	(doc-view-pdf/ps->png): Timer calls d-v-display instead
+	d-v-display-maybe.
+	(doc-view-mode-map): Use image-mode scrolling for mouse-wheel.
+	(doc-view-ps->pdf): Resort args to make ps2pdf happy.
+	(doc-view-clean-auto-mode-alist): New function.
+	(doc-view-current-cache-dir): Better cache dir naming.
+	(doc-view-remove-if): New function.
+	(doc-view-search-next-match, doc-view-search-previous-match): Use
+	it.
+
+	* files.el (auto-mode-alist): Change entries: pdf -> ps-mode, dvi
+	-> fundamental-mode.
+
 2007-10-23  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* emacs-lisp/advice.el (ad-make-advised-docstring):

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  reply	other threads:[~2007-10-23 13:32 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-21  2:38 doc-view compilation warnings Miles Bader
2007-10-21  8:55 ` Tassilo Horn
2007-10-22  9:00   ` Richard Stallman
2007-10-23 13:32     ` Tassilo Horn [this message]
2007-10-23 14:30       ` Dan Nicolaescu
2007-10-23 15:54         ` Tassilo Horn
2007-10-23 16:07           ` Dan Nicolaescu
2007-10-23 17:50             ` Tassilo Horn
2007-10-23 18:35               ` Dan Nicolaescu
2007-10-23 18:41                 ` Tassilo Horn
2007-10-23 19:00                   ` Stefan Monnier
2007-10-23 20:00                     ` Tassilo Horn
2007-10-23 21:53                       ` Stefan Monnier
2007-10-24  7:59                         ` Tassilo Horn
2007-10-24 11:40                           ` Tassilo Horn
2007-10-24 15:24                             ` Tassilo Horn
2007-10-26 10:52                               ` doc-view.patch waiting for installation (was: doc-view compilation warnings) Tassilo Horn
2007-10-29  1:52                                 ` doc-view.patch waiting for installation Glenn Morris
2007-10-29  9:36                                   ` Tassilo Horn
2007-10-30  6:33                                     ` Glenn Morris
2007-10-30 18:07                                       ` Case folding for auto-mode-alist (was: doc-view.patch waiting for installation) Reiner Steib
2007-10-30 19:00                                         ` Case folding for auto-mode-alist Stefan Monnier
2007-10-31  7:47                                           ` Richard Stallman
2007-10-31 15:19                                             ` Stefan Monnier
2007-10-31 15:30                                               ` David Kastrup
2007-10-31 16:17                                                 ` Stefan Monnier
2007-10-24 13:55                           ` doc-view compilation warnings Stefan Monnier
2007-10-24 14:32                             ` Tassilo Horn
2007-10-24  8:33                       ` Richard Stallman
2007-10-24  8:32                   ` Richard Stallman
2007-10-24  8:32             ` Richard Stallman
2007-10-24  8:32           ` Richard Stallman
2007-10-24  2:49         ` Richard Stallman
2007-10-24  2:49       ` Richard Stallman
2007-10-24  8:11         ` Tassilo Horn
2007-10-24  8:19           ` David Kastrup
2007-10-25  2:10           ` Richard Stallman
2007-10-25  8:09             ` Tassilo Horn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87prz6yn1c.fsf@baldur.tsdh.de \
    --to=tassilo@member.fsf.org \
    --cc=emacs-devel@gnu.org \
    --cc=rms@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.