@ -7,7 +7,7 @@
;; Copyright (C) 2018, Andy Stewart, all rights reserved.
;; Created: 2020-05-17 12:31:12
;; Version: 0.5
;; Last-Updated: Wed May 20 11:48:43 2020 (-0400)
;; Last-Updated: Sun Sep 27 23:44:55 2020 (-0400)
;; By: Mingde (Matthew) Zeng
;; URL: http://www.emacswiki.org/emacs/download/eaf.el
;; Keywords:
@ -37,9 +37,18 @@
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;; Code:
( require 'ol )
( defcustom eaf-org-override-pdf-links nil
" This options will override existing PDF file links's open function.
Check out variable ` eaf-org-override-pdf-links-list ' about link types. "
" When enabled, this will override existing PDF file links's open function.
So that every existing PDF org-link that 's supposed to be opened
by something in ` eaf-org-override-pdf-links-list ' will be opened using EAF.
Enable this when the you want to ensure the PDF link in the org file can be
opened without EAF enabled. "
:type 'boolean
:safe #' booleanp
:group 'org-link )
@ -48,16 +57,22 @@
' ( " docview " " pdfview " " pdftools " )
" A list of all PDF file link types which will be override by EAF open function. " )
( dolist ( type eaf-org-override-pdf-links-list )
( when ( and eaf-org-override-pdf-links
( org-link-get-parameter type :follow ) ) ; if `nil' means `ol-<link>' not loaded.
( org-link-set-parameters ; store original `:follow' function
type :orig-follow ( org-link-get-parameter type :follow ) )
( org-link-set-parameters type :follow #' eaf-org-open ) ) )
( defun eaf-org-store-link ( )
" Store the page of PDF as link support for `org-store-link' .
The raw link looks like this: [ [ eaf:<app>::<path>::<extra-args> ] ] "
The raw link looks like this: [ [ eaf:<app>::<path>::<extra-args> ] [ description ] ] "
( interactive )
( when ( eq major-mode 'eaf-mode )
( let* ( ( app eaf--buffer-app-name )
;; filter temp files which is converted to PDF
( url ( if ( string-prefix-p " /tmp/ " eaf--buffer-url )
( warn " [EAF] don't support this application link which is converted to temporary PDF file. " )
( warn " [EAF] does n't support this application link which is converted to temporary PDF file. " )
eaf--buffer-url ) )
( extra-args ( cl-case ( intern app )
( 'pdf-viewer
@ -68,25 +83,30 @@ The raw link looks like this: [[eaf:<app>::<path>::<extra-args>]]"
( concat " eaf: " app " :: " url " :: " extra-args )
( concat " eaf: " app " :: " url ) ) )
( description ( buffer-name ) ) )
( if ( and ( string-equal app " pdf-viewer " )
eaf-org-override-pdf-links
( or ( equal ( org-link-get-parameter " docview " :follow ) 'eaf-org-open )
( equal ( org-link-get-parameter " pdfview " :follow ) 'eaf-org-open )
( equal ( org-link-get-parameter " pdftools " :follow ) 'eaf-org-open ) ) )
( org-link-store-props
:type " eaf "
:link link
:description description )
( require 'ol-docview ) ; use `docview' for most wide compatible support.
( org-link-store-props
:type " docview "
:link url
:description description ) ) ) ) )
( defun eaf-org-open ( link _ )
" Open EAF link with EAF correspoinding application. "
( cl-case app
( 'pdf-viewer
( if ( and eaf-org-override-pdf-links
( or ( equal ( org-link-get-parameter " docview " :follow ) 'eaf-org-open )
( equal ( org-link-get-parameter " pdfview " :follow ) 'eaf-org-open )
( equal ( org-link-get-parameter " pdftools " :follow ) 'eaf-org-open ) ) )
( progn ( require 'ol-docview ) ; use `docview' for most wide compatible support.
( org-link-store-props
:type " docview "
:link ( concat " docview: " url )
:description description ) )
( org-link-store-props
:type " eaf "
:link link
:description description ) ) )
( t ( org-link-store-props
:type " eaf "
:link link
:description description ) ) ) ) ) )
( defun eaf-org-open ( link &optional _ )
" Open LINK using EAF on an EAF supported file. "
( if ( member ( car ( split-string link " :: " ) ) ( mapcar 'car eaf-app-extensions-alist ) )
;; for eaf-org link type spec: "eaf:<app>:URL:(parameters)"
;; for eaf-org link type spec: "eaf:<app>::<path>::<extra-args> "
( let* ( ( list ( split-string link " :: " ) )
( app ( car list ) )
( url ( cadr list ) )
@ -110,27 +130,24 @@ The raw link looks like this: [[eaf:<app>::<path>::<extra-args>]]"
( let* ( ( list ( split-string link " :: " ) )
( url ( car list ) )
( extra-args ( cadr list ) ) )
( if eaf-org-override-pdf-links
( cl-case ( intern ( file-name-extension url ) )
( 'pdf
( eaf-open ( expand-file-name url ) " pdf-viewer " )
( eaf-call " call_function_with_args " eaf--buffer-id
" jump_to_page_with_num " ( format " %s " extra-args ) ) ) )
;; restore to original :follow function
( org-link-set-parameters
type :follow ( org-link-get-parameter type :orig-follow ) )
;; re-open link with original :follow function
( apply ( org-link-get-parameter type :follow ) link ) ) ) ) )
( cl-case ( intern ( file-name-extension url ) )
( 'pdf
( if eaf-org-override-pdf-links
( progn ( eaf-open ( expand-file-name url ) " pdf-viewer " )
( when extra-args
( eaf-call " call_function_with_args " eaf--buffer-id
" jump_to_page_with_num " ( format " %s " extra-args ) ) ) )
( dolist ( type eaf-org-override-pdf-links-list )
;; restore to original :follow function, since eaf-org-override-pdf-links is nil
( org-link-set-parameters
type :follow ( org-link-get-parameter type :orig-follow ) )
;; re-open link with original :follow function
( apply ( org-link-get-parameter type :follow ) link ) ) ) ) ) ) ) )
( org-link-set-parameters " eaf "
:follow #' eaf-org-open
:store #' eaf-org-store-link )
:follow #' eaf-org-open
:store #' eaf-org-store-link )
( if eaf-org-override-pdf-links
( dolist ( type eaf-org-override-pdf-links-list )
( when ( org-link-get-parameter type :follow ) ; if `nil' means `ol-<link>' not loaded.
( org-link-set-parameters ; store original `:follow' function
type :orig-follow ( org-link-get-parameter type :follow ) )
( org-link-set-parameters type :follow #' eaf-org-open ) ) ) )
( provide 'eaf-org )
;;; eaf-org.el ends here