From aefcadb650ddaa4d2ad1737baadf4400c99ba405 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Mon, 23 Nov 2009 20:34:53 +0000 Subject: [PATCH] Implement DocView Continuous mode. (Bug#4896) * doc-view.el (doc-view-continuous-mode): New defcustom. (doc-view-mode-map): Bind C-n/ to `doc-view-next-line-or-next-page', C-p/ to `doc-view-previous-line-or-previous-page'. (doc-view-next-line-or-next-page) (doc-view-previous-line-or-previous-page): New commands. --- etc/NEWS | 5 +++++ lisp/ChangeLog | 9 +++++++++ lisp/doc-view.el | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 27f3b9868d8..51c3ee62a60 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -192,6 +192,11 @@ effective for buffers that have no associated file. If you want to exempt buffers that do correspond to files, customize the value of `desktop-files-not-to-save' instead. +** DocView + +*** When `doc-view-continuous-mode' is non-nil, scrolling a line +on the page edge advances to the next/previous page. + ** FIXME mail-user-agent change This probably affects a lot of documentation. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 96573b7508e..1ab6ac35ebc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2009-11-23 Juri Linkov + + Implement DocView Continuous mode. (Bug#4896) + * doc-view.el (doc-view-continuous-mode): New defcustom. + (doc-view-mode-map): Bind C-n/ to `doc-view-next-line-or-next-page', + C-p/ to `doc-view-previous-line-or-previous-page'. + (doc-view-next-line-or-next-page) + (doc-view-previous-line-or-previous-page): New commands. + 2009-11-23 Juri Linkov Implement Isearch in comint input history. (Bug#3746) diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 3ea4fcecfde..afb2e48b145 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -222,6 +222,15 @@ has finished." :type 'integer :group 'doc-view) +(defcustom doc-view-continuous-mode nil + "In Continuous mode reaching the page edge advances to next/previous page. +When non-nil, scrolling a line upward at the bottom edge of the page +moves to the next page, and scrolling a line downward at the top edge +of the page moves to the previous page." + :type 'boolean + :group 'doc-view + :version "23.2") + ;;;; Internal Variables (defun doc-view-new-window-function (winprops) @@ -286,6 +295,10 @@ Can be `dvi', `pdf', or `ps'.") (define-key map [remap backward-page] 'doc-view-previous-page) (define-key map (kbd "SPC") 'doc-view-scroll-up-or-next-page) (define-key map (kbd "DEL") 'doc-view-scroll-down-or-previous-page) + (define-key map (kbd "C-n") 'doc-view-next-line-or-next-page) + (define-key map (kbd "") 'doc-view-next-line-or-next-page) + (define-key map (kbd "C-p") 'doc-view-previous-line-or-previous-page) + (define-key map (kbd "") 'doc-view-previous-line-or-previous-page) (define-key map (kbd "M-<") 'doc-view-first-page) (define-key map (kbd "M->") 'doc-view-last-page) (define-key map [remap goto-line] 'doc-view-goto-page) @@ -442,6 +455,38 @@ Can be `dvi', `pdf', or `ps'.") (image-bol 1)) (set-window-hscroll (selected-window) hscroll)))) +(defun doc-view-next-line-or-next-page (&optional n) + "Scroll upward by N lines if possible, else goto next page. +When `doc-view-continuous-mode' is non-nil, scrolling a line upward at +the bottom edge of the page moves to the next page." + (interactive "p") + (if doc-view-continuous-mode + (let ((hscroll (window-hscroll)) + (cur-page (doc-view-current-page))) + (when (= (window-vscroll) (image-next-line n)) + (doc-view-next-page) + (when (/= cur-page (doc-view-current-page)) + (image-bob) + (image-bol 1)) + (set-window-hscroll (selected-window) hscroll))) + (image-next-line 1))) + +(defun doc-view-previous-line-or-previous-page (&optional n) + "Scroll downward by N lines if possible, else goto previous page. +When `doc-view-continuous-mode' is non-nil, scrolling a line downward +at the top edge of the page moves to the previous page." + (interactive "p") + (if doc-view-continuous-mode + (let ((hscroll (window-hscroll)) + (cur-page (doc-view-current-page))) + (when (= (window-vscroll) (image-previous-line n)) + (doc-view-previous-page) + (when (/= cur-page (doc-view-current-page)) + (image-eob) + (image-bol 1)) + (set-window-hscroll (selected-window) hscroll))) + (image-previous-line n))) + ;;;; Utility Functions (defun doc-view-kill-proc () -- 2.39.2