From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Spiers Subject: Re: FR: refile-and-link Date: Wed, 10 Dec 2014 23:54:47 +0000 Message-ID: <20141210235447.GA4108@pacific.linksys.moosehall> References: <20141203124652.GE28615@pacific.linksys.moosehall> <871tofx7xx.fsf@kyleam.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:60726) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xyr5r-00082O-1c for emacs-orgmode@gnu.org; Wed, 10 Dec 2014 18:55:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xyr5l-0002b1-Bh for emacs-orgmode@gnu.org; Wed, 10 Dec 2014 18:54:54 -0500 Received: from coral.adamspiers.org ([2001:ba8:1f1:f27f::2]:60230) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xyr5l-0002av-5k for emacs-orgmode@gnu.org; Wed, 10 Dec 2014 18:54:49 -0500 Content-Disposition: inline In-Reply-To: <871tofx7xx.fsf@kyleam.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Kyle Meyer Cc: org-mode mailing list On Thu, Dec 04, 2014 at 07:21:30PM -0500, Kyle Meyer wrote: > Adam Spiers 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.