Browse Source

Add docview link type (open files in doc-view mode at a specific page)

Jan Böcker 15 years ago
parent
commit
9f1fd65a06
4 changed files with 90 additions and 1 deletions
  1. 1 0
      doc/org.texi
  2. 4 0
      lisp/ChangeLog
  3. 83 0
      lisp/org-docview.el
  4. 2 1
      lisp/org.el

+ 1 - 0
doc/org.texi

@@ -2760,6 +2760,7 @@ file:sometextfile::NNN                    @r{file with line number to jump to}
 file:projects.org                         @r{another Org file}
 file:projects.org                         @r{another Org file}
 file:projects.org::some words             @r{text search in Org file}
 file:projects.org::some words             @r{text search in Org file}
 file:projects.org::*task title            @r{heading search in Org file}
 file:projects.org::*task title            @r{heading search in Org file}
+docview:papers/last.pdf::NNN              @r{file with page number to open in doc-view mode}
 id:B7423F4D-2E8A-471B-8810-C40F074717E9   @r{Link to heading by ID}
 id:B7423F4D-2E8A-471B-8810-C40F074717E9   @r{Link to heading by ID}
 news:comp.emacs                           @r{Usenet link}
 news:comp.emacs                           @r{Usenet link}
 mailto:adent@@galaxy.net                   @r{Mail link}
 mailto:adent@@galaxy.net                   @r{Mail link}

+ 4 - 0
lisp/ChangeLog

@@ -5,6 +5,10 @@
 
 
 	* org.el (org-inside-latex-macro-p): Save match data.
 	* org.el (org-inside-latex-macro-p): Save match data.
 
 
+2009-11-28  Jan Böcker  <jan.boecker@jboecker.de>
+
+	* org-docview.el: New file.
+
 2009-11-27  Carsten Dominik  <carsten.dominik@gmail.com>
 2009-11-27  Carsten Dominik  <carsten.dominik@gmail.com>
 
 
 	* org-latex.el (org-export-latex-class-options): New variable.
 	* org-latex.el (org-export-latex-class-options): New variable.

+ 83 - 0
lisp/org-docview.el

@@ -0,0 +1,83 @@
+;;; org-docview.el --- support for links to doc-view-mode buffers
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
+;;   Free Software Foundation, Inc.
+
+;; Author: Jan Böcker <jan.boecker at jboecker dot de>
+;; Keywords: outlines, hypermedia, calendar, wp
+;; Homepage: http://orgmode.org
+;; Version: 6.33trans
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+
+;; This file implements links to open files in doc-view-mode.
+;; Org-mode loads this module by default - if this is not what you want,
+;; configure the variable `org-modules'.
+
+;; The links take the form
+;;
+;;    docview:<file path>::<page number>
+;;
+;; for example: [[docview:~/.elisp/org/doc/org.pdf::1][Org-Mode Manual]]
+;;
+;; Autocompletion for inserting links is supported; you will be
+;; prompted for a file and a page number.
+;;
+;; If you use org-store-link in a doc-view mode buffer, the stored
+;; link will point to the current page.
+
+;;; Code:
+
+
+(require 'org)
+
+(org-add-link-type "docview" 'org-docview-open)
+(add-hook 'org-store-link-functions 'org-docview-store-link)
+
+(defun org-docview-open (link)
+  (when (string-match "\\(.*\\)::\\([0-9]+\\)$"  link)
+    (let* ((path (match-string 1 link))
+	   (page (string-to-number (match-string 2 link))))
+      (org-open-file path 1) ;; let org-mode open the file (in-emacs = 1)
+      ;; to ensure org-link-frame-setup is respected
+      (doc-view-goto-page page)
+      )))
+
+(defun org-docview-store-link ()
+  "Store a link to a docview buffer"
+  (when (eq major-mode 'doc-view-mode)
+    ;; This buffer is in doc-view-mode
+    (let* ((path buffer-file-name)
+	   (page (doc-view-current-page))
+	   (link (concat "docview:" path "::" (number-to-string page)))
+	   (description ""))
+      (org-store-link-props
+       :type "docview"
+       :link link
+       :description path))))
+
+(defun org-docview-complete-link ()
+  "Use the existing file name completion for file: links to get the file name,
+   then ask the user for the page number and append it."
+  (concat (replace-regexp-in-string "^file:" "docview:" (org-file-complete-link))
+	  "::"
+	  (read-from-minibuffer "Page:" "1")))
+
+
+(provide 'org-docview)

+ 2 - 1
lisp/org.el

@@ -170,7 +170,7 @@ With prefix arg HERE, insert it at point."
   (let ((a (member 'org-infojs org-modules)))
   (let ((a (member 'org-infojs org-modules)))
     (and a (setcar a 'org-jsinfo))))
     (and a (setcar a 'org-jsinfo))))
 
 
-(defcustom org-modules '(org-bbdb org-bibtex org-gnus org-info org-jsinfo org-irc org-mew org-mhe org-rmail org-vm org-w3m org-wl)
+(defcustom org-modules '(org-bbdb org-bibtex org-docview org-gnus org-info org-jsinfo org-irc org-mew org-mhe org-rmail org-vm org-w3m org-wl)
   "Modules that should always be loaded together with org.el.
   "Modules that should always be loaded together with org.el.
 If a description starts with <C>, the file is not part of Emacs
 If a description starts with <C>, the file is not part of Emacs
 and loading it will require that you have downloaded and properly installed
 and loading it will require that you have downloaded and properly installed
@@ -189,6 +189,7 @@ to add the symbol `xyz', and the package must have a call to
 	(const :tag "   bbdb:              Links to BBDB entries" org-bbdb)
 	(const :tag "   bbdb:              Links to BBDB entries" org-bbdb)
 	(const :tag "   bibtex:            Links to BibTeX entries" org-bibtex)
 	(const :tag "   bibtex:            Links to BibTeX entries" org-bibtex)
 	(const :tag "   crypt:             Encryption of subtrees" org-crypt)
 	(const :tag "   crypt:             Encryption of subtrees" org-crypt)
+	(const :tag "   docview:           Links to doc-view buffers" org-docview)
 	(const :tag "   gnus:              Links to GNUS folders/messages" org-gnus)
 	(const :tag "   gnus:              Links to GNUS folders/messages" org-gnus)
 	(const :tag "   id:                Global IDs for identifying entries" org-id)
 	(const :tag "   id:                Global IDs for identifying entries" org-id)
 	(const :tag "   info:              Links to Info nodes" org-info)
 	(const :tag "   info:              Links to Info nodes" org-info)