From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Charles C. Berry" Subject: Re: Tangling flow control Date: Wed, 9 Nov 2016 13:41:08 -0800 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:60608) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c4acb-0008Qy-SS for emacs-orgmode@gnu.org; Wed, 09 Nov 2016 16:41:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c4acY-0001Rc-Pw for emacs-orgmode@gnu.org; Wed, 09 Nov 2016 16:41:29 -0500 Received: from iport-acv1-out.ucsd.edu ([132.239.0.176]:38939) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1c4acY-0001RF-Ej for emacs-orgmode@gnu.org; Wed, 09 Nov 2016 16:41:26 -0500 In-Reply-To: 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" To: Philip Hudson Cc: emacs orgmode-mailinglist On Wed, 9 Nov 2016, Philip Hudson wrote: > On 9 November 2016 at 17:54, Charles C. Berry wrote: >> On Tue, 8 Nov 2016, Philip Hudson wrote: >> >> [snip] >>> >>> How do you do "looping" flow control? >>> >>> For context, what I'm trying to write is a single Org file from which >>> I can tangle out a number of =~/.ssh/config= files, one for each of >>> several hosts on a LAN. Within this file I need to repeatedly place a >>> template =BEGIN_SRC ssh-config= block, each time with a few words and >>> numbers changed. Do you do this anywhere? If so, how have you >>> implemented it? >> >> It sounds like what you want is a template for the src block and another src >> block that does substitutions in that template using a table of values >> inside a loop. >> >> Just to get you started, with this template: >> >> #+NAME: template >> #+BEGIN_SRC org >> ,#+BEGIN_SRC shell :tangle %to-file >> ls -lt %filename >> ,#+END_SRC >> #+END_SRC >> >> and this helper src-block >> >> #+NAME: get-body >> #+BEGIN_SRC emacs-lisp :var src-block-name="c-code" >> (save-excursion >> (org-babel-goto-named-src-block >> src-block-name) >> (cadr (org-babel-get-src-block-info))) >> >> #+END_SRC >> >> >> running >> >> #+header: :wrap src org :var tmpl=get-body("template") >> #+BEGIN_SRC emacs-lisp >> (org-fill-template tmpl >> '(("to-file" . "abc.sh")("filename" . "my-dir"))) >> #+END_SRC >> >> yields >> >> #+RESULTS: >> #+BEGIN_src org >> ,#+BEGIN_SRC shell :tangle abc.sh >> ls -lt my-dir >> ,#+END_SRC >> #+END_src >> >> >> To revise this for your application, you need to provide a table of the >> associated values for the "to-file" and "filename" keys in the alist, read >> that table using a :var header, loop thru the table reconstructing the alist >> each time creating src blocks, and send the output to an org tempfile. Then >> you tangle the tempfile. >> >> Alternatively, you simply write the script files directly without bothering >> to write to an org tempfile. > > Thanks Chuck. I think I've got that straight. I hadn't come across > `org-fill-template' before. I think I know how to loop thru a table, > though I haven't done it myself before; I've seen how to "get" a table > as a list. > > What I'm not clear about is why the template nests a shell-script > block inside an Org block. Should the outer Org block not have a > %-escaped placeholder for a :tangle target, an intermediate Org file? No. The org src block is just a container. Its body is a src block template that gets copied into the variable `tmpl', which if filled and placed in file can be tangled. Alternatively, you can eval (setq tmpl "