org.el (org-store-link): Storing multiple links in the active region now requires...
authorBastien Guerry <bzg@altern.org>
Tue, 26 Mar 2013 12:50:07 +0000 (13:50 +0100)
committerBastien Guerry <bzg@altern.org>
Tue, 26 Mar 2013 12:50:07 +0000 (13:50 +0100)
* org.el (org-store-link): Storing multiple links in the
active region now requires a triple prefix argument.

Thanks to Matt Lundin for reporting bugs in this area.

lisp/org.el

index 377b8a0..b354b0f 100644 (file)
@@ -9283,7 +9283,7 @@ type.  For a simple example of an export function, see `org-bbdb.el'."
 (defvar org-id-link-to-org-use-id) ; Defined in org-id.el
 
 ;;;###autoload
-(defun org-store-link (arg &optional ignore-region)
+(defun org-store-link (arg)
   "\\<org-mode-map>Store an org-link to the current location.
 This link is added to `org-stored-links' and can later be inserted
 into an org-buffer with \\[org-insert-link].
@@ -9295,34 +9295,46 @@ For file links, arg negates `org-context-in-file-links'.
 A double prefix arg force skipping storing functions that are not
 part of Org's core.
 
-When the region is active and IGNORE-REGION is nil, store each line
-in the region as a separate link."
+A triple prefix arg force storing a link for each line in the
+active region."
   (interactive "P")
   (org-load-modules-maybe)
-  (setq org-store-link-plist nil)  ; reset
-  (if (and (org-region-active-p) (not ignore-region))
+  (if (and (equal arg '(64)) (org-region-active-p))
       (save-excursion
-       (let ((beg (region-beginning)) (end (region-end)))
-         (goto-char beg)
+       (let ((end (region-end)))
+         (goto-char (region-beginning))
+         (set-mark (point))
          (while (< (point-at-eol) end)
-           (funcall 'org-store-link arg t)
-           (move-beginning-of-line 2))))
+           (move-end-of-line 1) (activate-mark)
+           (let (current-prefix-arg)
+             (call-interactively 'org-store-link))
+           (move-beginning-of-line 2)
+           (set-mark (point)))))
     (org-with-limited-levels
-     (let (link cpltxt desc description search txt custom-id agenda-link sfuns sfunsn)
+     (setq org-store-link-plist nil)
+     (let (link cpltxt desc description search
+               txt custom-id agenda-link sfuns sfunsn)
        (cond
+
+       ;; Store a link using an external link type
        ((and (not (equal arg '(16)))
              (setq sfuns
                    (delq
-                    nil (mapcar (lambda (f) (let (fs) (if (funcall f) (push f fs))))
+                    nil (mapcar (lambda (f)
+                                  (let (fs) (if (funcall f) (push f fs))))
                                 org-store-link-functions))
                    sfunsn (mapcar (lambda (fu) (symbol-name (car fu))) sfuns))
              (or (and (cdr sfuns)
                       (funcall (intern
-                                (completing-read "Which function for creating the link? "
-                                                 sfunsn t (car sfunsn)))))
+                                (completing-read
+                                 "Which function for creating the link? "
+                                 sfunsn t (car sfunsn)))))
                  (funcall (caar sfuns)))
              (setq link (plist-get org-store-link-plist :link)
-                   desc (or (plist-get org-store-link-plist :description) link))))
+                   desc (or (plist-get org-store-link-plist
+                                       :description) link))))
+
+       ;; Store a link from a source code buffer
        ((org-src-edit-buffer-p)
         (let (label gc)
           (while (or (not label)
@@ -9342,8 +9354,8 @@ in the region as a separate link."
           (insert link)
           (setq link (concat "(" label ")") desc nil)))
 
+       ;; We are in the agenda, link to referenced location
        ((equal (org-bound-and-true-p org-agenda-buffer-name) (buffer-name))
-        ;; We are in the agenda, link to referenced location
         (let ((m (or (get-text-property (point) 'org-hd-marker)
                      (get-text-property (point) 'org-marker))))
           (when m
@@ -9378,20 +9390,14 @@ in the region as a separate link."
               link (url-view-url t))
         (org-store-link-props :type "w3" :url (url-view-url t)))
 
-       ((setq search (run-hook-with-args-until-success
-                      'org-create-file-search-functions))
-        (setq link (concat "file:" (abbreviate-file-name buffer-file-name)
-                           "::" search))
-        (setq cpltxt (or description link)))
-
        ((eq major-mode 'image-mode)
         (setq cpltxt (concat "file:"
                              (abbreviate-file-name buffer-file-name))
               link cpltxt)
         (org-store-link-props :type "image" :file buffer-file-name))
 
+       ;; In dired, store a link to the file of the current line
        ((eq major-mode 'dired-mode)
-        ;; link to the file in the current line
         (let ((file (dired-get-filename nil t)))
           (setq file (if file
                          (abbreviate-file-name
@@ -9401,9 +9407,16 @@ in the region as a separate link."
           (setq cpltxt (concat "file:" file)
                 link cpltxt)))
 
+       ((setq search (run-hook-with-args-until-success
+                      'org-create-file-search-functions))
+        (setq link (concat "file:" (abbreviate-file-name buffer-file-name)
+                           "::" search))
+        (setq cpltxt (or description link)))
+
        ((and (buffer-file-name (buffer-base-buffer)) (derived-mode-p 'org-mode))
         (setq custom-id (org-entry-get nil "CUSTOM_ID"))
         (cond
+         ;; Store a link using the radio target at point
          ((org-in-regexp "<<\\(.*?\\)>>")
           (setq cpltxt
                 (concat "file:"
@@ -9419,12 +9432,13 @@ in the region as a separate link."
                                      'create-if-interactive-and-no-custom-id)
                                  (not custom-id))))
                    (and org-id-link-to-org-use-id (org-entry-get nil "ID"))))
-          ;; We can make a link using the ID.
+          ;; Store a link using the ID at point
           (setq link (condition-case nil
                          (prog1 (org-id-store-link)
-                           (setq desc (plist-get org-store-link-plist :description)))
+                           (setq desc (plist-get org-store-link-plist
+                                                 :description)))
                        (error
-                        ;; probably before first headline, link to file only
+                        ;; Probably before first headline, link only to file
                         (concat "file:"
                                 (abbreviate-file-name
                                  (buffer-file-name (buffer-base-buffer))))))))
@@ -9463,7 +9477,7 @@ in the region as a separate link."
         (setq cpltxt (concat "file:"
                              (abbreviate-file-name
                               (buffer-file-name (buffer-base-buffer)))))
-        ;; Add a context string
+        ;; Add a context string.
         (when (org-xor org-context-in-file-links arg)
           (setq txt (if (org-region-active-p)
                         (buffer-substring (region-beginning) (region-end))
@@ -9480,28 +9494,28 @@ in the region as a separate link."
 
        (t (setq link nil)))
 
+       ;; We're done setting link and desc, clean up
        (if (consp link) (setq cpltxt (car link) link (cdr link)))
        (setq link (or link cpltxt)
             desc (or desc cpltxt))
        (cond ((equal desc "NONE") (setq desc nil))
             ((string-match org-bracket-link-regexp desc)
-             (setq desc (replace-regexp-in-string
-                         org-bracket-link-regexp
-                         (concat "\\3" (if (equal (length (match-string 0 desc))
-                                                  (length desc)) "*" "")) desc))))
-
-       (if (and (or (org-called-interactively-p 'any)
-                   executing-kbd-macro ignore-region) link)
-          (progn
-            (setq org-stored-links
-                  (cons (list link desc) org-stored-links))
-            (message "Stored: %s" (or desc link))
-            (when custom-id
-              (setq link (concat "file:" (abbreviate-file-name (buffer-file-name))
-                                 "::#" custom-id))
-              (setq org-stored-links
-                    (cons (list link desc) org-stored-links))))
-        (or agenda-link (and link (org-make-link-string link desc))))))))
+             (setq desc
+                   (replace-regexp-in-string
+                    org-bracket-link-regexp
+                    (concat "\\3" (if (equal (length (match-string 0 desc))
+                                             (length desc)) "*" "")) desc))))
+
+       ;; Return the link
+       (if (not (and (or (org-called-interactively-p 'any)
+                        executing-kbd-macro) link))
+          (or agenda-link (and link (org-make-link-string link desc)))
+        (push (list link desc) org-stored-links)
+        (message "Stored: %s" (or desc link))
+        (when custom-id
+          (setq link (concat "file:" (abbreviate-file-name
+                                      (buffer-file-name)) "::#" custom-id))
+          (push (list link desc) org-stored-links)))))))
 
 (defun org-store-link-props (&rest plist)
   "Store link properties, extract names and addresses."