ソースを参照

Merge branch 'master' into next

Nicolas Goaziou 6 年 前
コミット
77b417f01a
2 ファイル変更29 行追加20 行削除
  1. 14 7
      lisp/org-src.el
  2. 15 13
      lisp/org.el

+ 14 - 7
lisp/org-src.el

@@ -300,12 +300,6 @@ Return nil if there is no such buffer."
 	     (eq (marker-buffer end) (marker-buffer org-src--end-marker))
 	     (throw 'exit b))))))
 
-(defun org-src--source-buffer ()
-  "Return source buffer edited by current buffer."
-  (unless (org-src-edit-buffer-p) (error "Not in a source buffer"))
-  (or (marker-buffer org-src--beg-marker)
-      (error "No source buffer available for current editing session")))
-
 (defun org-src--get-lang-mode (lang)
   "Return major mode that should be used for LANG.
 LANG is a string, and the returned major mode is a symbol."
@@ -774,6 +768,19 @@ If BUFFER is non-nil, test it instead."
 	 (local-variable-p 'org-src--beg-marker buffer)
 	 (local-variable-p 'org-src--end-marker buffer))))
 
+(defun org-src-source-buffer ()
+  "Return source buffer edited in current buffer.
+Raise an error when current buffer is not a source editing buffer."
+  (unless (org-src-edit-buffer-p) (error "Not in a source buffer"))
+  (or (marker-buffer org-src--beg-marker)
+      (error "No source buffer available for current editing session")))
+
+(defun org-src-source-type ()
+  "Return type of element edited in current buffer.
+Raise an error when current buffer is not a source editing buffer."
+  (unless (org-src-edit-buffer-p) (error "Not in a source buffer"))
+  org-src--source-type)
+
 (defun org-src-switch-to-buffer (buffer context)
   (pcase org-src-window-setup
     (`current-window (pop-to-buffer-same-window buffer))
@@ -1103,7 +1110,7 @@ Throw an error if there is no such buffer."
 	(beg org-src--beg-marker)
 	(end org-src--end-marker)
 	(overlay org-src--overlay))
-    (with-current-buffer (org-src--source-buffer)
+    (with-current-buffer (org-src-source-buffer)
       (undo-boundary)
       (goto-char beg)
       ;; Temporarily disable read-only features of OVERLAY in order to

+ 15 - 13
lisp/org.el

@@ -9094,7 +9094,13 @@ non-nil."
        ((org-src-edit-buffer-p)
 	(let ((coderef-format (org-src-coderef-format)))
 	  (cond
-	   ;; A code reference exists. Use it.
+	   ;; Code references do not exist in this type of buffer.
+	   ;; Pretend we're linking from the source buffer directly.
+	   ((not (memq (org-src-source-type) '(example-block src-block)))
+	    (with-current-buffer (org-src-source-buffer)
+	      (org-store-link arg interactive?))
+	    (setq link nil))
+	   ;; A code reference exists.  Use it.
 	   ((save-excursion
 	      (beginning-of-line)
 	      (re-search-forward (org-src-coderef-regexp coderef-format)
@@ -9107,12 +9113,14 @@ non-nil."
 	    (end-of-line)
 	    (let* ((label (read-string "Code line label: "))
 		   (reference (format coderef-format label))
-		   (gc (- 79 (length link))))
+		   (gc (- 79 (length reference))))
 	      (if (< (current-column) gc)
 		  (org-move-to-column gc t)
 		(insert " "))
 	      (insert reference)
 	      (setq link (format "(%s)" label))))
+	   ;; No code reference, and non-interactive call.  Don't know
+	   ;; what to do.  Give up.
 	   (t (setq link nil)))))
 
        ;; We are in the agenda, link to referenced location
@@ -10317,18 +10325,12 @@ of matched result, which is either `dedicated' or `fuzzy'."
 	    (let ((element (org-element-at-point)))
 	      (when (and (memq (org-element-type element)
 			       '(example-block src-block))
-			 ;; Build proper regexp according to current
-			 ;; block's label format.
-			 (let ((label-fmt
-				(regexp-quote
-				 (or (org-element-property :label-fmt element)
-				     org-coderef-label-format))))
-			   (save-excursion
-			     (beginning-of-line)
-			     (looking-at (format ".*?\\(%s\\)[ \t]*$"
-						 (format label-fmt coderef))))))
+			 (org-match-line
+			  (concat ".*?" (org-src-coderef-regexp
+					 (org-src-coderef-format element)
+					 coderef))))
 		(setq type 'dedicated)
-		(goto-char (match-beginning 1))
+		(goto-char (match-beginning 2))
 		(throw :coderef-match nil))))
 	  (goto-char origin)
 	  (error "No match for coderef: %s" coderef))))