tsd@tsdye.com (Thomas S. Dye) writes: > Eric Schulte writes: > >> Torsten Wagner writes: >> >>> Hi, >>> >>> for me the biggest "trouble" with babel is to remember the possible >>> keywords in the header for different languages. >>> There were a lot of ongoing syntax change which did not make it easier >>> for me to remember all this. >>> Thus a menu which is organised by languages offering all possible >>> settings for each language would be very helpful. >>> | >>> Python >>> | | >>> | export - code - result - both - none >>> | | >>> | tangle - no - yes- filename >>> | | >>> | result - value - output >>> | | >>> | ... >>> | >>> ... >>> >>> Not sure how effectual this would be in a main menu. It would be >>> definitely awesome in a context menu >>> >>> That would be (copied from worg) [*] indicates cursor position >>> >>> #+NAME: factorial >>> #+BEGIN_SRC haskell [*] :results silent :exports code :var n=0 >>> >>> a context menu would appear presenting all possible header arguments for haskell >>> >>> #+NAME: factorial >>> #+BEGIN_SRC haskell :results [*] :exports code :var n=0 >>> >>> a context menu presenting all possible values for the header argument >>> :results in haskell >>> I guess that together with the possibility to call this menu by >>> keyboard strokes or alternatively show the same infos in the >>> minibuffer would be a great win for babel and it would make many >>> questions here on the list unnecessary. >>> Furthermore, any change or extension in the syntax for a certain >>> language would be directly reflected to the end-user. E.g., If I >>> suddenly see the menu entry :exports 3dprint, I would be curious and >>> check it out on worg and the manual ;) >>> >>> Totti >>> >> >> Hi, >> >> I've put together a first pass at such support for interactive header >> argument look up. Please evaluate this elisp code [1] in your *scratch* >> buffer, then in an Org-mode buffer insert a code block like the >> following with the point at [*], and press tab. >> >> #+begin_src R :[*] >> :foo >> #+end_src >> >> You should see an auto-completion list showing which header arguments >> are available and (for those with known arguments) which arguments may >> be specified. This includes language specific header arguments, i.e., >> the R code block above suggests about twice as many possible header >> arguments as an elisp block. Note this "expand on tab after :" behavior >> is active on "#+headers:" lines as well. >> >> This makes use of the `org-babel-common-header-args-w-values' variable >> which holds header argument names and completions, as well as the >> org-babel-header-arg-names:lang variables. >> >> Does this seem like a good interface? >> >> Is it missing any important functionality? >> >> Best, >> >> Footnotes: >> [1] >> ;; Add support for completing-read insertion of header arguments after ":" >> (defun org-babel-header-arg-expand () >> "Call `org-babel-enter-header-arg-w-completion' in appropriate contexts." >> (when (and (= (char-before) ?\:) (org-babel-where-is-src-block-head)) >> (org-babel-enter-header-arg-w-completion (match-string 2)))) >> >> (defun org-babel-enter-header-arg-w-completion (&optional lang) >> "Insert header argument appropriate for LANG with completion." >> (let* ((lang-headers-var (intern (concat "org-babel-header-arg-names:" lang))) >> (lang-headers (when (boundp lang-headers-var) >> (mapcar #'symbol-name (eval lang-headers-var)))) >> (headers (append (mapcar #'symbol-name org-babel-header-arg-names) >> lang-headers)) >> (header (org-completing-read "Header Arg: " headers)) >> (args (cdr (assoc (intern header) >> org-babel-common-header-args-w-values))) >> (arg (when (and args (listp args)) >> (org-completing-read >> (format "%s: " header) >> (mapcar #'symbol-name (car args)))))) >> (insert (concat header " " (or arg ""))) >> (cons header arg))) >> >> (add-hook 'org-tab-first-hook 'org-babel-header-arg-expand) > > Hi Eric, > > This is potentially much nicer than a function template. I tried > filling out an R source code block's header arguments, but I couldn't > find a way to get :results output graphics, which I use frequently for > ggplot2 graphics. With TAB I could see type arguments, but not > collection or handling arguments. Is there some way to cycle through > the various completion lists? > > All the best, > Tom Hi Tom, Currently language specific arguments for header arguments are not stored in any elisp variables so there is no way to provide this information to the auto completion function. I'm adding a new suite of language-specific variables which may be customized by each language to provide information on language-specific header-argument arguments. I've just put together this new code into a patch. I'm not currently able to run the test suite without massive failures (with or without this patch), so I'm just attaching the patch here rather than pushing it up directly. If it works well on other people's systems I think it should be committed. After this is applied the language-specific header argument variables will need to be fleshed out. For example see the value of the `org-babel-header-args:R' which includes the "graphics" results option. The arguments of these variables will override the arguments of specific headers in the global `org-babel-common-header-args-w-values' variable. Best,