emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Rick Frankel <rick@rickster.com>
To: Jarmo Hurri <jarmo.hurri@syk.fi>
Cc: emacs-orgmode@gnu.org
Subject: Re: Babel: the disappearing hline
Date: Tue, 12 Nov 2013 10:45:52 -0500	[thread overview]
Message-ID: <ad4285b5535d33da3e4ddae69d4409e3@mail.rickster.com> (raw)
In-Reply-To: <87r4amb0vc.fsf@syk.fi>

[-- Attachment #1: Type: text/plain, Size: 2712 bytes --]

On 2013-11-12 01:16, Jarmo Hurri wrote:
> Eric Schulte <schulte.eric@gmail.com> writes:
> 
> There are two paces to specify header arguments in a call line, the
> arguments in the [] are applied to the input-table function, *not* to
> the call line, so they change the inputs.  The trailing header
> arguments are applied to the call line.
> 
> So there is an implicit post-processing function that takes the result
> of the called block as input, and hline pruning is applied in this
> function?
> 
> I put on the table a suggestion that the default behaviour of #+CALL
> w.r.t. the handling of hlines is changed from removing hlines in output
> to not removing them. I am suggesting this partly because I don't
> understand why the default behaviour is as it is now, and secondly
> because the current behavious differs from the way hlines are handled 
> in
> other block evaluations:

This behavior is controlled globally by the value of
`org-babel-default-header-args'. This is overriden by the value of
`org-babel-default-header-args:{lang}' and of course, the setting on
individual source blocks and call lines. As you can see from the below
output, the default is =:hlines no=. Note that in versions of org-mode
prior to commit 6857d139 of 2013-09-28 (below), this was overridden in
the setting of `org-babel-default-header-args:emacs-lisp, so this may
be why you are seeing and "inconsistency" between the call line and
the emacs-lisp source block.

If you want hlines to be included by default, you can modify the value
of `org-babel-default-header-args'.

I have attached an org file i have been working on to see the results
of various settings of =colnames= and =hlines= on table evaluation in
various languages, you may find it useful.

rick

------
commit 6857d139e1b5ea5c235e3555dbe15aeab227aaef
Author: Eric Schulte <schulte.eric@gmail.com>
Date:   Sat Sep 28 06:37:54 2013 -0600

set default emacs-lisp header args to nil

The difference between elisp and every other language was causing
confusion, so simpler just to set these to nil.

* lisp/ob-emacs-lisp.el (org-babel-default-header-args:emacs-lisp):
Set to nil.

1 file changed, 1 insertion(+), 2 deletions(-)
lisp/ob-emacs-lisp.el | 3 +--

	Modified   lisp/ob-emacs-lisp.el
diff --git a/lisp/ob-emacs-lisp.el b/lisp/ob-emacs-lisp.el
index 886645d..4505129 100644
--- a/lisp/ob-emacs-lisp.el
+++ b/lisp/ob-emacs-lisp.el
@@ -28,8 +28,7 @@
;;; Code:
(require 'ob)

-(defvar org-babel-default-header-args:emacs-lisp
-  '((:hlines . "yes") (:colnames . "no"))
+(defvar org-babel-default-header-args:emacs-lisp nil
"Default arguments for evaluating an emacs-lisp source block.")

(declare-function orgtbl-to-generic "org-table" (table params))

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: colnames.org --]
[-- Type: text/x-lisp; name=colnames.org, Size: 5123 bytes --]

#+TITLE: Colnames handling
#+DATE: {{{modification-time(%Y-%m-%d)}}}
#+AUTHOR: Rick Frankel
#+EMAIL: ut0598@rtasdv12
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
#+OPTIONS: author:t c:nil creator:comment d:(not LOGBOOK) date:t
#+OPTIONS: e:t email:nil f:t inline:t num:nil p:nil pri:nil stat:t
#+OPTIONS: tags:t tasks:t tex:t timestamp:nil toc:t todo:t |:t
#+DESCRIPTION:
#+EXCLUDE_TAGS: noexport
#+KEYWORDS:
#+LANGUAGE: en
#+SELECT_TAGS: export

Evaluate the subtree [[Test generator]] with =org-babel-execute-subtree= (=C-c C-v C-s=).
It will:

1. Run [[generate-colnames-and-hlines-tests]] to create the [[colnames and
   hlines]] tests.
2. Run the tests.

Note that it will automatically require the file "ob-{lang}" for
each language block specified in [[Language functions]] below.

* Language functions
:PROPERTIES:
:results:  silent
:exports:  code
:var:      table=table
:ID:       LANGUAGES
:END:
This function should modify each cell of the input table by appending
/-o/ to the value of the cell and convert ='hline= rows in the
input to the literal /hline/, so it appears in the output table.

Create one for each babel language to be tested.

#+CAPTION: emacs-lisp
#+BEGIN_SRC emacs-lisp
  (mapcar
   (lambda (r)
     (if (sequencep r)
         (mapcar
          (lambda (c)
            (if (integerp c)
                (format "%d-o" c)
              (concat c "-o")))
          r)
       (list r)))
   table)
#+END_SRC

#+CAPTION: perl
#+BEGIN_SRC perl :results value
  return [map {
      ref $_ ? [map { $_ . "-o" } @$_] : $_
  } @$table];
#+END_SRC

#+CAPTION: python
#+name: python
#+BEGIN_SRC python
  return [isinstance(r,list) and [str(c)+"-o" for c in r] or [r] for r in table]
#+END_SRC

#+CAPTION: ruby
#+BEGIN_SRC ruby
  table.collect do |r|
    r.instance_of?(Array) ? r.collect { |c| "#{c}-o" } : [r]
  end
#+END_SRC

* Test generator
#+CAPTION: Input table
#+name: table
| a | b | c |
|---+---+---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
|---+---+---|
| 7 | 8 | 9 |

#+CAPTION: Function to list default header args by language
#+name: list-defaults
#+HEADER:  :var val='org-babel-default-header-args :eval never :exports code
#+BEGIN_SRC emacs-lisp :colnames '(option value)
  (or
   (mapcar
    (lambda (x) (list (car x) (cdr x))) (eval val)) '(("" "")))
#+END_SRC

#+name: generate-colnames-and-hlines-tests
#+BEGIN_SRC emacs-lisp :results raw :exports results
  (condition-case nil
      (progn
        (widen)
        (org-id-goto "COLNAMES-AND-HLINES")
        (org-cut-subtree))
    (error t))
  (concat
   "* Test results\n"
   ":PROPERTIES:\n"
   ":ID: COLNAMES-AND-HLINES\n"
   ":END:\n"
   (let ((data ()) (defaults '("org-babel-default-header-args")))
     (save-excursion
       (save-restriction
         (widen)
         (org-id-goto "LANGUAGES")
         (org-narrow-to-subtree)
         (org-babel-map-executables nil
           (let* ((info (org-babel-get-src-block-info 'light))
                  (lang (nth 0 info)))
             (push (format "org-babel-default-header-args:%s" lang) defaults)
             (require (intern (format "ob-%s" lang)))
             (push
              (concat
               (format "#+name: %s-%%s\n" lang)
               "#+HEADER: :results value :colnames %s :hlines %s\n"
               (format "#+BEGIN_SRC %s :var table=table\n" lang)
               (replace-regexp-in-string
                "^" "   "
                (replace-regexp-in-string "%" "%%" (nth 1 info)))
               "\n#+END_SRC\n"
               "#+ATTR_LATEX: :placement [H]"
               (format "\n#+CAPTION: %s" lang)
               (format "\n#+RESULTS: %s-%%s\n" lang))
              data)))))
     (concat
      "** Default header args\n"
      ":PROPERTIES:\n"
      ":colnames: yes\n"
      ":END:\n"
      "#+LaTeX: \\begin{multicols}{3}\n"
      (mapconcat
       (lambda (arg)
         (format "#+call: list-defaults[:eval yes]('%s)\n\n#+CAPTION: %s\n#+RESULTS:\n"
                 arg arg)) (reverse defaults) "\n") 
      "#+LaTeX: \\end{multicols}\n"
      (mapconcat
       'identity
       (mapcar
        (lambda (arg)
          (let* ((colname (car arg))
                 (hlines (nth 1 arg))
                 (argname (format "%s-%s"
                                  (if (symbolp colname)
                                      (symbol-name colname)
                                    (replace-regexp-in-string "[' ()]" "" colname))
                                  hlines)))
            (concat
             (format "** colnames %s, hlines %s\n" colname hlines)
             "#+LaTeX: \\begin{multicols}{3}\n"
             (mapconcat
              (lambda (block)
                (format block argname colname hlines argname))
              (reverse data) "\n")
             "#+LaTeX: \\end{multicols}\n")))
        (let ((l ()))
          (mapc (lambda (hline)
                  (mapc
                   (lambda (colname) (setq l (cons (list colname hline) l)))
                   (list "'nil" 'yes 'no "'t" "'(d e f)")))
                '(yes no))
          (reverse l))) "\n"))))
#+END_SRC

#+RESULTS: generate-colnames-and-hlines-tests

  reply	other threads:[~2013-11-12 15:46 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-11 14:35 Babel: the disappearing hline Jarmo Hurri
2013-11-11 14:53 ` Thorsten Jolitz
2013-11-11 15:11   ` Jarmo Hurri
2013-11-11 15:31     ` Thorsten Jolitz
2013-11-11 16:19       ` Eric Schulte
2013-11-11 17:26         ` Jarmo Hurri
2013-11-11 17:44           ` Eric Schulte
2013-11-12  6:16             ` Jarmo Hurri
2013-11-12 15:45               ` Rick Frankel [this message]
2013-11-12 16:09                 ` Jarmo Hurri
2013-11-12 19:22                   ` Rick Frankel
2013-11-13  6:19                     ` Jarmo Hurri
2013-11-13 14:17                       ` Eric Schulte
2013-11-13 18:52                         ` Rick Frankel
2013-11-13 23:27                           ` Eric Schulte
2013-11-15  6:50                         ` Jarmo Hurri

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ad4285b5535d33da3e4ddae69d4409e3@mail.rickster.com \
    --to=rick@rickster.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=jarmo.hurri@syk.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).