emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Tangling flow control


From: Charles C. Berry
Subject: Re: [O] Tangling flow control
Date: Wed, 9 Nov 2016 13:41:08 -0800
User-agent: Alpine 2.20 (OSX 67 2015-01-07)

On Wed, 9 Nov 2016, Philip Hudson wrote:

On 9 November 2016 at 17:54, Charles C. Berry <address@hidden> 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 "<template string>") somewhere (maybe in a local variables block), where the <template string> part is the template.

But it seems easier to edit the template as an org src block - C-c ' puts your template in an OrgSrc buffer, then moving point to a src block and typing M-x org-edit-src-code puts its body in another OrgSrc buffer where you can edit it in the shell-mode or whatever mode.

Also, I suppose that template should have been an ssh-config src block to conform with your earlier posting. But I think you get the idea.

Chuck



reply via email to

[Prev in Thread] Current Thread [Next in Thread]