On Thu, Dec 04, 2014 at 07:21:30PM -0500, Kyle Meyer wrote: > Adam Spiers <orgm...@adamspiers.org> wrote: > > Forgive me if this has already been implemented, but I couldn't see > > it... > > I don't know of a command that does this. > > > I'm looking for something similar to the "extract method" operation > > which refactoring IDEs can perform on code. You would select a > > headline (or maybe even region), hit `refile-and-link', and then after > > the normal refiling, a link to the refiled section would be inserted > > in the place where the refiled section previously lived. > > > > Thoughts? > > The last refile location is stored in org-bookmark-names-plist. The > (lightly tested) function below uses that information to create a link > to the refiled heading. > > #+begin_src emacs-lisp > (defun org-refile-and-link () > "Refile heading, adding a link to the new location. > Prefix arguments are interpreted by `org-refile'." > (interactive) > (when (member current-prefix-arg '(3 (4) (16))) > (user-error "Linking is incompatible with that prefix argument")) > (let ((heading (org-get-heading t t)) > (orig-file (buffer-file-name))) > (call-interactively #'org-refile) > (let* ((refile-file > (bookmark-get-filename > (assoc (plist-get org-bookmark-names-plist :last-refile) > bookmark-alist))) > (same-file (string= orig-file refile-file)) > (link (if same-file > (concat "*" heading) > (concat refile-file "::*" heading))) > (desc heading)) > (open-line 1) > (insert (org-make-link-string link desc))))) > #+end_src
Thanks a lot! I've noticed a couple of minor issues - hopefully I'll fix them when I get time and then maybe submit a patch.