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::some words             @r{text 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}
 news:comp.emacs                           @r{Usenet 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.
 
+2009-11-28  Jan Böcker  <jan.boecker@jboecker.de>
+
+	* org-docview.el: New file.
+
 2009-11-27  Carsten Dominik  <carsten.dominik@gmail.com>
 
 	* 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)))
     (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.
 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
@@ -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 "   bibtex:            Links to BibTeX entries" org-bibtex)
 	(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 "   id:                Global IDs for identifying entries" org-id)
 	(const :tag "   info:              Links to Info nodes" org-info)