From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eric Schulte" Subject: Re: [BABEL] "unset" :var definitions for subtree Date: Thu, 10 Feb 2011 09:48:27 -0700 Message-ID: <87r5bfn8dg.fsf@gmail.com> References: <4D500BEC.1080300@gmail.com> <87bp2koeir.fsf@gmail.com> <4D53A2D2.2080300@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from [140.186.70.92] (port=40865 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PnZh9-0000sN-0S for emacs-orgmode@gnu.org; Thu, 10 Feb 2011 11:48:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PnZh7-0007Pq-Gq for emacs-orgmode@gnu.org; Thu, 10 Feb 2011 11:48:38 -0500 Received: from mail-qy0-f176.google.com ([209.85.216.176]:55804) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PnZh7-0007Pd-6M for emacs-orgmode@gnu.org; Thu, 10 Feb 2011 11:48:37 -0500 Received: by qyk10 with SMTP id 10so1253308qyk.0 for ; Thu, 10 Feb 2011 08:48:36 -0800 (PST) In-Reply-To: <4D53A2D2.2080300@gmail.com> (Rainer M. Krug's message of "Thu, 10 Feb 2011 09:33:22 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Rainer M Krug Cc: emacs-orgmode Rainer M Krug writes: > On 02/10/2011 02:27 AM, Eric Schulte wrote: >> Rainer M Krug writes: >> >>> Hi >>> >>> For one project, I am usinr org to write submit scripte to a cluster >>> runing torqu. The important bit in this is, that between the shebang and >>> the code, no other executable line must occur. As I am using variables >>> in org (:var) they will occur just after the shebang, which causes a >>> problem for torque. So, my question is, is there a way to "unset" >>> variables defined by using :var for a subtree? >>> >> >> Hi Rainer, >> >> Interesting question... unfortunately I don't think that removing >> variables from header arguments is possible under the current setup. >> >> Perhaps in your case you could add a function to the post-tangle hook, >> which recognizes when it is being called in a just-tangled torqu script >> (maybe by searching for a series of #PBS lines), and then removes any >> lines between the shebang and the first #PBS line? > > That is also an option - what I am using at the moment is to use > :no-expand as a code block specific header argument. But this raises the > other question: > > Can I set the :no-expand in a properties block? As far as I understand, > in the properties block I have the argument and the value - but what do > I do with :noexpand? > > :PROPERTIES: > :var: A=13 > :no-expand > :END: > You can just set it to "yes" or really any value you like (the value will be ignored). I did however have to add "no-expand" to the list of header argument names searched for in property blocks -- I just pushed up a patch to this effect. > >> >> More generally, I wonder what a natural method would be to allow >> unsetting of pre-set header arguments for local blocks or subtrees? >> This may only apply to the :var header argument, as most others have a >> default setting which can be actively set. If you have any ideas for a >> natural syntax for such an operation I'd be happy to hear it. > > First solution (probably the easiest to implement) would be along the > lines of the :no-expand header argument - > > :expand-var yes > and > :expand-var no > > This could possibly be expanded to > :expand-var A B C > > which would expand only the variables A B and C > > One step further: one could define groups of variables, like > :var-group X=A,B,C > or a similar syntax > > and then > :expand-var X > would expand A B and C > > This all would not be real unset - but a possibility for unsetting would be > > :var B= > > or > > :var-unset B > > i.e. if no value is specified in :var, the variable will be removed > (i.e. unset) - one could also use a null value (if it exists in elisp): > > :var B=(null) > Thanks for the ideas, I think you're right that something along the lines of the above should be the easiest to implement, however after reading these suggestions, I'm thinking that more generally there are a couple of other header arguments which could need to be unset, namely - file - dir - session - shebang some of these (like session) accept a "none" value which has the effect of un-setting the header argument. It would be nice to generalize whatever solution we apply across all types of header argument (both for implementation and for user simplicity). The simplest option would probably be to ensure that setting any header argument to :none would remove all instances of that header argument. The only problem there is cases like var, where you might not want to remove all :var's. Maybe this could be expanded s.t. :none could take arguments, e.g. :header :none(A, B) which would remove all instances of the "header" header argument whose value is or is named "A" or "B"? Or does that look too funky? > > But this raises another question of mine: > > I tried to use two :var headers in a properties block, but it only used > the first - did I miss something here? > Nope, it appears that property blocks (like a hash) assume that there is only one instance of each key->value pair, so once it is satisfied it will quit looking for more instances. Maybe the following alternative will suffice Best -- Eric ** two vars in a properties block -- not possible :PROPERTIES: :var: test1=7 :var: test2=8 :END: #+begin_src emacs-lisp (message "test1=%S test2=%S" test1 test2) #+end_src results in Error : let: Symbol's value as variable is void: test2 *** an alternative :PROPERTIES: :var: tests=all-tests :END: #+tblname: all-tests - 7 - 8 #+begin_src emacs-lisp :var eric=89 (message "test1=%S test2=%S" (first tests) (second tests)) #+end_src #+results: : test1=7 test2=8