From 398a825b8d994882672906103f330ad8662d1ed6 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 12 Apr 2010 12:09:47 -0400 Subject: [PATCH] Clean up last bookmark changes for man/woman/gnus-summary. * gnus-sum.el: Add bookmark declarations to silence the compiler. (gnus-mark-xrefs-as-read, gnus-summary-limit-to-bodies): Use with-current-buffer to silence the byte-compiler. (gnus-summary-bookmark-make-record): Use derived-mode-p and don't bother to require `gnus'. (gnus-summary-bookmark-jump): Don't forget to autoload. Simplify. * woman.el: Add bookmark declarations to silence the compiler. (bookmark-prop-get): Use `man-args' rather than `filename' as a first step to compatibility between man and woman bookmarks. Adjust for Man-default-bookmark-title renaming. (woman-bookmark-jump): Adjust accordingly. Don't forget to autoload. * man.el: Add bookmark declarations to silence the compiler. (Man-name-local-regexp): Make it match NAME as well. (Man-getpage-in-background): Return the buffer. (Man-notify-when-ready): Use `case'. (man-set-default-bookmark-title): Rename to Man-default-bookmark-title. Don't hardcode "NAME". Simplify. (Man-bookmark-make-record): Use Man-arguments rather than buffer-name. Rename from Man-bookmark-make-record. (Man-bookmark-jump): Rename from man-bookmark-jump. Simplify now that we have the actual man-args. Use Man-getpage-in-background rather than `man' since the arg is already processed. Let bookmark.el do the window handling. Only wait for the relevant process. Don't forget to autoload. * bookmark.el (bookmark-default-file): Use locate-user-emacs-file. --- lisp/ChangeLog | 24 +++++++++++++ lisp/bookmark.el | 2 +- lisp/gnus/ChangeLog | 9 +++++ lisp/gnus/gnus-sum.el | 32 ++++++++--------- lisp/man.el | 84 ++++++++++++++++++++++--------------------- lisp/woman.el | 22 +++++++++--- 6 files changed, 110 insertions(+), 63 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 545ce63780f..c2464bfcaae 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,27 @@ +2010-04-12 Stefan Monnier + + * woman.el: Add bookmark declarations to silence the compiler. + (bookmark-prop-get): Use `man-args' rather than `filename' as a first + step to compatibility between man and woman bookmarks. + Adjust for Man-default-bookmark-title renaming. + (woman-bookmark-jump): Adjust accordingly. Don't forget to autoload. + + * man.el: Add bookmark declarations to silence the compiler. + (Man-name-local-regexp): Make it match NAME as well. + (Man-getpage-in-background): Return the buffer. + (Man-notify-when-ready): Use `case'. + (man-set-default-bookmark-title): Rename to Man-default-bookmark-title. + Don't hardcode "NAME". Simplify. + (Man-bookmark-make-record): Use Man-arguments rather than buffer-name. + Rename from Man-bookmark-make-record. + (Man-bookmark-jump): Rename from man-bookmark-jump. Simplify now that + we have the actual man-args. Use Man-getpage-in-background rather + than `man' since the arg is already processed. Let bookmark.el do the + window handling. Only wait for the relevant process. + Don't forget to autoload. + + * bookmark.el (bookmark-default-file): Use locate-user-emacs-file. + 2010-04-12 Thierry Volpiatto * woman.el (woman-bookmark-make-record, woman-bookmark-jump): diff --git a/lisp/bookmark.el b/lisp/bookmark.el index e69f87fd7a0..3d3d411391a 100644 --- a/lisp/bookmark.el +++ b/lisp/bookmark.el @@ -92,7 +92,7 @@ To specify the file in which to save them, modify the variable (if bookmark-file ;; In case user set `bookmark-file' in her .emacs: bookmark-file - (convert-standard-filename "~/.emacs.bmk")) + (locate-user-emacs-file "bookmarks" ".emacs.bmk")) "File in which to save bookmarks by default." :type 'file :group 'bookmark) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 47cf6997d60..52de639c813 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,12 @@ +2010-04-12 Stefan Monnier + + * gnus-sum.el: Add bookmark declarations to silence the compiler. + (gnus-mark-xrefs-as-read, gnus-summary-limit-to-bodies): + Use with-current-buffer to silence the byte-compiler. + (gnus-summary-bookmark-make-record): Use derived-mode-p and don't + bother to require `gnus'. + (gnus-summary-bookmark-jump): Don't forget to autoload. Simplify. + 2010-04-12 Thierry Volpiatto * gnus-sum.el (gnus-summary-bookmark-make-record) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index a8e612856a0..ba74e3baeb8 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -3017,7 +3017,7 @@ When FORCE, rebuild the tool bar." (declare-function turn-on-gnus-mailing-list-mode "gnus-ml" ()) - +(defvar bookmark-make-record-function) (defun gnus-summary-mode (&optional group) @@ -3072,7 +3072,6 @@ The following commands are available: (gnus-run-mode-hooks 'gnus-summary-mode-hook) (turn-on-gnus-mailing-list-mode) (mm-enable-multibyte) - ;; Bookmark support. (set (make-local-variable 'bookmark-make-record-function) 'gnus-summary-bookmark-make-record) (gnus-update-format-specifications nil 'summary 'summary-mode 'summary-dummy) @@ -6093,8 +6092,7 @@ The resulting hash table is returned, or nil if no Xrefs were found." "Look through all the headers and mark the Xrefs as read." (let ((virtual (gnus-virtual-group-p from-newsgroup)) name info xref-hashtb idlist method nth4) - (save-excursion - (set-buffer gnus-group-buffer) + (with-current-buffer gnus-group-buffer (when (setq xref-hashtb (gnus-create-xref-hashtb from-newsgroup headers unreads)) (mapatoms @@ -8344,8 +8342,7 @@ If REVERSE (the prefix), limit to articles that don't match." (dolist (data gnus-newsgroup-data) (let (gnus-mark-article-hook) (gnus-summary-select-article t t nil (gnus-data-number data))) - (save-excursion - (set-buffer gnus-article-buffer) + (with-current-buffer gnus-article-buffer (article-goto-body) (let* ((case-fold-search t) (found (if headersp @@ -9029,7 +9026,7 @@ Obeys the standard process/prefix convention." (setq group (format "%s-%d" gnus-newsgroup-name article)) (gnus-summary-remove-process-mark article) (when (gnus-summary-display-article article) - (save-excursion + (save-excursion ;;What for? (with-temp-buffer (insert-buffer-substring gnus-original-article-buffer) ;; Remove some headers that may lead nndoc to make @@ -12643,12 +12640,15 @@ If ALL is a number, fetch this number of articles." (gnus-summary-limit (gnus-sorted-nunion old new)))) (gnus-summary-position-point))) -;;; BOOKMARK support for GNUS. +;;; Bookmark support for Gnus. +(declare-function bookmark-make-record-default "bookmark" (&optional pos-only)) +(declare-function bookmark-prop-get "bookmark" (bookmark prop)) +(declare-function bookmark-default-handler "bookmark" (bmk)) +(declare-function bookmark-get-bookmark-record "bookmark" (bmk)) (defun gnus-summary-bookmark-make-record () - "Make a bookmark entry for a Gnus buffer." - (require 'gnus) - (unless (and (eq major-mode 'gnus-summary-mode) gnus-article-current) + "Make a bookmark entry for a Gnus summary buffer." + (unless (and (derived-mode-p 'gnus-summary-mode) gnus-article-current) (error "Please retry from the Gnus summary buffer")) ;[1] (let* ((subject (elt (gnus-summary-article-header) 1)) (grp (car gnus-article-current)) @@ -12660,20 +12660,20 @@ If ALL is a number, fetch this number of articles." (group . ,grp) (article . ,art) (message-id . ,id) (handler . gnus-summary-bookmark-jump)))) - +;;;###autoload (defun gnus-summary-bookmark-jump (bookmark) "Handler function for record returned by `gnus-summary-bookmark-make-record'. BOOKMARK is a bookmark name or a bookmark record." (let ((group (bookmark-prop-get bookmark 'group)) (article (bookmark-prop-get bookmark 'article)) - (id (bookmark-prop-get bookmark 'message-id)) - buf) + (id (bookmark-prop-get bookmark 'message-id))) (gnus-fetch-group group (list article)) (gnus-summary-insert-cached-articles) (gnus-summary-goto-article id nil 'force) - (setq buf (current-buffer)) (bookmark-default-handler - `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark))))) + `("" + (buffer . ,(current-buffer)) + . ,(bookmark-get-bookmark-record bookmark))))) (gnus-summary-make-all-marking-commands) diff --git a/lisp/man.el b/lisp/man.el index 0402c08522d..67bdcbea4e6 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -221,8 +221,8 @@ the associated section number." :type '(repeat string) :group 'man) -(defcustom Man-name-local-regexp "^NOM$" - "*The translation of the uppercase word NAME in your language. +(defcustom Man-name-local-regexp (concat "^" (regexp-opt '("NOM" "NAME")) "$") + "Regexp that matches the text that precedes the command's name. Used in `bookmark-set' to get the default bookmark name." :type 'string :group 'bookmark) @@ -888,7 +888,8 @@ names or descriptions. The pattern argument is usually an (man man-args))) (defun Man-getpage-in-background (topic) - "Use TOPIC to build and fire off the manpage and cleaning command." + "Use TOPIC to build and fire off the manpage and cleaning command. +Return the buffer in which the manpage will appear." (let* ((man-args topic) (bufname (concat "*Man " man-args "*")) (buffer (get-buffer bufname))) @@ -966,15 +967,16 @@ names or descriptions. The pattern argument is usually an (format "exited abnormally with code %d" exit-status))) (setq msg exit-status)) - (Man-bgproc-sentinel bufname msg))))))) + (Man-bgproc-sentinel bufname msg))))) + buffer)) (defun Man-notify-when-ready (man-buffer) "Notify the user when MAN-BUFFER is ready. See the variable `Man-notify-method' for the different notification behaviors." (let ((saved-frame (with-current-buffer man-buffer Man-original-frame))) - (cond - ((eq Man-notify-method 'newframe) + (case Man-notify-method + (newframe ;; Since we run asynchronously, perhaps while Emacs is waiting ;; for input, we must not leave a different buffer current. We ;; can't rely on the editor command loop to reselect the @@ -985,28 +987,27 @@ See the variable `Man-notify-method' for the different notification behaviors." (set-window-dedicated-p (frame-selected-window frame) t) (or (display-multi-frame-p frame) (select-frame frame))))) - ((eq Man-notify-method 'pushy) + (pushy (switch-to-buffer man-buffer)) - ((eq Man-notify-method 'bully) + (bully (and (frame-live-p saved-frame) (select-frame saved-frame)) (pop-to-buffer man-buffer) (delete-other-windows)) - ((eq Man-notify-method 'aggressive) + (aggressive (and (frame-live-p saved-frame) (select-frame saved-frame)) (pop-to-buffer man-buffer)) - ((eq Man-notify-method 'friendly) + (friendly (and (frame-live-p saved-frame) (select-frame saved-frame)) (display-buffer man-buffer 'not-this-window)) - ((eq Man-notify-method 'polite) + (polite (beep) (message "Manual buffer %s is ready" (buffer-name man-buffer))) - ((eq Man-notify-method 'quiet) + (quiet (message "Manual buffer %s is ready" (buffer-name man-buffer))) - ((or (eq Man-notify-method 'meek) - t) + (t ;; meek (message "")) ))) @@ -1274,6 +1275,8 @@ manpage command." ;; ====================================================================== ;; set up manual mode in buffer and build alists +(defvar bookmark-make-record-function) + (put 'Man-mode 'mode-class 'special) (defun Man-mode () @@ -1330,9 +1333,8 @@ The following key bindings are currently in effect in the buffer: (setq imenu-generic-expression (list (list nil Man-heading-regexp 0))) (set (make-local-variable 'outline-regexp) Man-heading-regexp) (set (make-local-variable 'outline-level) (lambda () 1)) - ;; Bookmark support. (set (make-local-variable 'bookmark-make-record-function) - 'man-bookmark-make-record) + 'Man-bookmark-make-record) (Man-build-page-list) (Man-strip-page-headers) (Man-unindent) @@ -1669,39 +1671,39 @@ Specify which REFERENCE to use; default is based on word at point." complete-path)) ;;; Bookmark Man Support - -(defun man-set-default-bookmark-title () - "Set default bookmark title for Man or woman page based \ -on NAME or `Man-name-local-regexp' entry." +(declare-function bookmark-make-record-default "bookmark" (&optional pos-only)) +(declare-function bookmark-prop-get "bookmark" (bookmark prop)) +(declare-function bookmark-default-handler "bookmark" (bmk)) +(declare-function bookmark-get-bookmark-record "bookmark" (bmk)) + +(defun Man-default-bookmark-title () + "Default bookmark name for Man or WoMan pages. +Uses `Man-name-local-regexp'." (save-excursion (goto-char (point-min)) - (when (or (re-search-forward Man-name-local-regexp nil t) - (re-search-forward "^NAME$" nil t)) - (forward-line 1) - (unless (> (skip-chars-forward " ") 0) - (skip-chars-forward "\t")) + (when (re-search-forward Man-name-local-regexp nil t) + (skip-chars-forward "\n\t ") (buffer-substring-no-properties (point) (line-end-position))))) -(defun man-bookmark-make-record () +(defun Man-bookmark-make-record () "Make a bookmark entry for a Man buffer." - `(,(man-set-default-bookmark-title) + `(,(Man-default-bookmark-title) ,@(bookmark-make-record-default 'point-only) - (buffer-name . ,(buffer-name (current-buffer))) - (handler . man-bookmark-jump))) + (man-args . ,Man-arguments) + (handler . Man-bookmark-jump))) -(defun man-bookmark-jump (bookmark) +;;;###autoload +(defun Man-bookmark-jump (bookmark) "Default bookmark handler for Man buffers." - (let* ((buf (bookmark-prop-get bookmark 'buffer-name)) - (buf-lst (split-string buf)) - (node (replace-regexp-in-string "\*" "" (car (last buf-lst)))) - (ind (when (> (length buf-lst) 2) (second buf-lst))) - (Man-notify-method (case bookmark-jump-display-function - ('switch-to-buffer 'pushy) - ('switch-to-buffer-other-window 'friendly) - ('display-buffer 'quiet) - (t 'friendly)))) - (man (if ind (format "%s(%s)" node ind) node)) - (while (get-process "man") (sit-for 1)) + (let* ((man-args (bookmark-prop-get bookmark 'man-args)) + ;; Let bookmark.el do the window handling. + ;; This let-binding needs to be active during the call to both + ;; Man-getpage-in-background and accept-process-output. + (Man-notify-method 'meek) + (buf (Man-getpage-in-background man-args)) + (proc (get-buffer-process buf))) + (while (and proc (eq (process-status proc) 'run)) + (accept-process-output proc)) (bookmark-default-handler `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark))))) diff --git a/lisp/woman.el b/lisp/woman.el index 97d65e422de..603b7917064 100644 --- a/lisp/woman.el +++ b/lisp/woman.el @@ -1897,6 +1897,7 @@ Argument EVENT is the invoking mouse event." (setq woman-emulation value) (woman-reformat-last-file)) +(defvar bookmark-make-record-function) (put 'woman-mode 'mode-class 'special) (defun woman-mode () @@ -4520,18 +4521,29 @@ logging the message." nil) ; for woman-file-readable-p etc. ;;; Bookmark Woman support. +(declare-function bookmark-make-record-default "bookmark" (&optional pos-only)) +(declare-function bookmark-prop-get "bookmark" (bookmark prop)) +(declare-function bookmark-default-handler "bookmark" (bmk)) +(declare-function bookmark-get-bookmark-record "bookmark" (bmk)) + +;; FIXME: woman.el and man.el should be better integrated so, for +;; example, bookmarks of one can be used with the other. (defun woman-bookmark-make-record () "Make a bookmark entry for a Woman buffer." - `(,(man-set-default-bookmark-title) + `(,(Man-default-bookmark-title) ,@(bookmark-make-record-default 'point-only) - (filename . ,woman-last-file-name) - (handler . woman-bookmark-jump))) - + ;; Use the same form as man's bookmarks, as much as possible. + (man-args . ,woman-last-file-name) + (handler . woman-bookmark-jump))) +;;;###autoload (defun woman-bookmark-jump (bookmark) "Default bookmark handler for Woman buffers." - (let* ((file (bookmark-prop-get bookmark 'filename)) + (let* ((file (bookmark-prop-get bookmark 'man-args)) + ;; FIXME: we need woman-find-file-noselect, since + ;; save-window-excursion can't protect us from the case where + ;; woman-find-file creates a new frame. (buf (save-window-excursion (woman-find-file file) (current-buffer)))) (bookmark-default-handler -- 2.39.2