Sfoglia il codice sorgente

Fix `org-open-at-point' on "docview"-type links

* lisp/org.el (org-open-at-point): Open "docview"-type links
  correctly, i.e., without adding "file+" first.
(org-open-file-with-system, org-open-file-with-emacs): Change
signature.  Deprecate functions.

* lisp/org-docview.el (org-docview-open): Open file even when no file
  number is specified.

This change removes "file+emacs" and "file+sys" types from
`org-link-protocols', since they are not hard-coded in
`org-open-at-point'.
Nicolas Goaziou 11 anni fa
parent
commit
2891ef7f87
2 ha cambiato i file con 44 aggiunte e 32 eliminazioni
  1. 8 7
      lisp/org-docview.el
  2. 36 25
      lisp/org.el

+ 8 - 7
lisp/org-docview.el

@@ -66,13 +66,14 @@
        (t path)))))
 
 (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)
-      )))
+  (string-match "\\(.*?\\)\\(?:::\\([0-9]+\\)\\)?$" link)
+  (let ((path (match-string 1 link))
+	(page (and (match-beginning 2)
+		   (string-to-number (match-string 2 link)))))
+    ;; Let Org mode open the file (in-emacs = 1) to ensure
+    ;; org-link-frame-setup is respected.
+    (org-open-file path 1)
+    (when page (doc-view-goto-page page))))
 
 (defun org-docview-store-link ()
   "Store a link to a docview buffer."

+ 36 - 25
lisp/org.el

@@ -10526,17 +10526,34 @@ is used internally by `org-open-link-from-string'."
 	       ((equal type "file")
 		(if (string-match "[*?{]" (file-name-nondirectory path))
 		    (dired path)
-		  (apply
-		   (or (let ((app (org-element-property :application context)))
-			 (nth 1 (assoc (concat "file" (and app (concat "+" app)))
-				       org-link-protocols)))
-		       #'org-open-file)
-		   path arg
-		   (let ((option (org-element-property :search-option context)))
-		     (cond ((not option) nil)
-			   ((org-string-match-p "\\`[0-9]+\\'" option)
-			    (list (string-to-number option)))
-			   (t (list nil option)))))))
+		  ;; Look into `org-link-protocols' in order to find
+		  ;; a DEDICATED-FUNCTION to open file.  The function
+		  ;; will be applied on raw link instead of parsed
+		  ;; link due to the limitation in `org-add-link-type'
+		  ;; ("open" function called with a single argument).
+		  ;; If no such function is found, fallback to
+		  ;; `org-open-file'.
+		  ;;
+		  ;; Note : "file+emacs" and "file+sys" types are
+		  ;; hard-coded in order to escape the previous
+		  ;; limitation.
+		  (let* ((option (org-element-property :search-option context))
+			 (app (org-element-property :application context))
+			 (dedicated-function
+			  (nth 1 (assoc app org-link-protocols))))
+		    (if dedicated-function
+			(funcall dedicated-function
+				 (concat path
+					 (and option (concat "::" option))))
+		      (apply #'org-open-file
+			     path
+			     (cond (arg)
+				   ((equal app "emacs") 'emacs)
+				   ((equal app "sys") 'system))
+			     (cond ((not option) nil)
+				   ((org-string-match-p "\\`[0-9]+\\'" option)
+				    (list (string-to-number option)))
+				   (t (list nil option))))))))
 	       ((assoc type org-link-protocols)
 		(funcall (nth 1 (assoc type org-link-protocols)) path))
 	       ((equal type "help")
@@ -10700,20 +10717,14 @@ there is one, return it."
 	      (setq link (nth (1- nth) links)))))
 	  (cons link end))))))
 
-;; Add special file links that specify the way of opening
-
-(org-add-link-type "file+sys" 'org-open-file-with-system)
-(org-add-link-type "file+emacs" 'org-open-file-with-emacs)
-(defun org-open-file-with-system (path &optional arg line search)
-  "Open file at PATH using the system way of opening it.
-Optional argument ARG is ignored.  See `org-open-file' for LINE
-and SEARCH arguments."
-  (org-open-file path 'system line search))
-(defun org-open-file-with-emacs (path &optional arg line search)
-  "Open file at PATH in Emacs.
-Optional argument ARG is ignored.  See `org-open-file' for LINE
-and SEARCH arguments."
-  (org-open-file path 'emacs line search))
+;; TODO: These functions are deprecated since `org-open-at-point'
+;; hard-codes behaviour for "file+emacs" and "file+sys" types.
+(defun org-open-file-with-system (path)
+  "Open file at PATH using the system way of opening it."
+  (org-open-file path 'system))
+(defun org-open-file-with-emacs (path)
+  "Open file at PATH in Emacs."
+  (org-open-file path 'emacs))
 
 
 ;;; File search