From mboxrd@z Thu Jan 1 00:00:00 1970 From: Achim Gratz Subject: Re: :session question Date: Thu, 09 May 2013 20:52:40 +0200 Message-ID: <87k3n8gf47.fsf@Rainer.invalid> References: <51501AF2.1070405@easy-emacs.de> <8738vjugwd.fsf@gmail.com> <51516699.6090604@gmail.com> <87ip4ezf93.fsf@med.uni-goettingen.de> <87fvzi72ve.fsf@gmail.com> <87ip4e5gai.fsf@gmail.com> <87k3nmd5es.fsf@Rainer.invalid> <87sj264o0f.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:48219) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UaVxa-0004qh-HI for emacs-orgmode@gnu.org; Thu, 09 May 2013 14:53:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UaVxY-0000cl-9H for emacs-orgmode@gnu.org; Thu, 09 May 2013 14:52:58 -0400 Received: from plane.gmane.org ([80.91.229.3]:50156) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UaVxX-0000cW-Ug for emacs-orgmode@gnu.org; Thu, 09 May 2013 14:52:56 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UaVxX-0007xv-7g for emacs-orgmode@gnu.org; Thu, 09 May 2013 20:52:55 +0200 Received: from pd9eb3e31.dip0.t-ipconnect.de ([217.235.62.49]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 09 May 2013 20:52:55 +0200 Received: from Stromeko by pd9eb3e31.dip0.t-ipconnect.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 09 May 2013 20:52:55 +0200 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-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain Eric Schulte writes: > I think these are great ideas. Personally I'd love to see them > implemented. Unfortunately I don't have time to work on an > implementation currently. I'm surprised that none of the users who > motivated this discussion have chimed in. Their opinions may be more > valuable than my own in this regard (as I'm not a heavy #+Property > user). The change on the Babel side was just a few lines, but reconciling Org's notion of property syntax in various places proved to be more difficult. It's still not very well tested (it does survive the test suite obviously) and I'll need to write tests and documentation (help is welcome). Also, a new-style form of specifying header arguments for all languages (to then deprecate the old form) is missing at the moment since I'd like to get feedback on the language specific side first. With these caveats, here's the patchset: --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-org.el-improve-org-property-re-and-use-it-throughout.patch >From fe5f9f46896939179f0163c2ce10f8738ebde709 Mon Sep 17 00:00:00 2001 From: Achim Gratz Date: Thu, 9 May 2013 19:47:59 +0200 Subject: [PATCH 1/2] org.el: improve org-property-re and use it throughout * lisp/org.el (org-property-re): Improve definition so that this regex can be used in all situations. Extend docstring with explanation of matching groups. (org-at-property-p): Implement using `org-element-at-point'. (org-entry-properties, org-buffer-property-keys, org-indent-line): Use `org-property-re' and adjust match group numbers accordingly. * lisp/org-element.el (org-element-node-property-parser): Use `org-property-re' and adjust match group numbers accordingly. Move `looking-at' out of the let clause to not rely on the unspecified evaluation order inside the let. --- lisp/org-element.el | 6 +++--- lisp/org.el | 40 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index aafba88..f180f91 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -1973,11 +1973,11 @@ (defun org-element-node-property-parser (limit) containing `:key', `:value', `:begin', `:end' and `:post-blank' keywords." (save-excursion + (looking-at org-property-re) (let ((case-fold-search t) (begin (point)) - (key (progn (looking-at "[ \t]*:\\(.*?\\):[ \t]+\\(.*?\\)[ \t]*$") - (org-match-string-no-properties 1))) - (value (org-match-string-no-properties 2)) + (key (org-match-string-no-properties 2)) + (value (org-match-string-no-properties 3)) (pos-before-blank (progn (forward-line) (point))) (end (progn (skip-chars-forward " \r\t\n" limit) (if (eobp) (point) (point-at-bol))))) diff --git a/lisp/org.el b/lisp/org.el index 1e28d93..b2e3836 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -6139,8 +6139,15 @@ (defun org-outline-level () (defvar org-font-lock-keywords nil) -(defconst org-property-re (org-re "^[ \t]*\\(:\\([-[:alnum:]_]+\\+?\\):\\)[ \t]*\\([^ \t\r\n].*\\)") - "Regular expression matching a property line.") +(defconst org-property-re + "^\\(?4:[ \t]*\\)\\(?1::\\(?2:.*?\\):\\)[ \t]+\\(?3:[^ \t\r\n].*?\\)\\(?5:[ \t]*\\)$" + "Regular expression matching a property line. +There are four matching groups: +1: :PROPKEY: including the leading and trailing colon, +2: PROPKEY without the leading and trailing colon, +3: PROPVAL without leading or trailing spaces, +4: the indentation of the current line, +5: trailing whitespace.") (defvar org-font-lock-hook nil "Functions to be called for special font lock stuff.") @@ -15116,13 +15123,9 @@ (defun org-set-effort (&optional value increment) (defun org-at-property-p () "Is cursor inside a property drawer?" (save-excursion - (beginning-of-line 1) - (when (looking-at (org-re "^[ \t]*\\(:\\([[:alpha:]][[:alnum:]_-]*\\):\\)[ \t]*\\(.*\\)")) - (save-match-data ;; Used by calling procedures - (let ((p (point)) - (range (unless (org-before-first-heading-p) - (org-get-property-block)))) - (and range (<= (car range) p) (< p (cdr range)))))))) + (when (equal 'node-property (car (org-element-at-point))) + (beginning-of-line 1) + (looking-at org-property-re)))) (defun org-get-property-block (&optional beg end force) "Return the (beg . end) range of the body of the property drawer. @@ -15247,11 +15250,10 @@ (defun org-entry-properties (&optional pom which specific) (setq range (org-get-property-block beg end)) (when range (goto-char (car range)) - (while (re-search-forward - (org-re "^[ \t]*:\\([[:alpha:]][[:alnum:]_-]*\\):[ \t]*\\(\\S-.*\\)?") + (while (re-search-forward org-property-re (cdr range) t) - (setq key (org-match-string-no-properties 1) - value (org-trim (or (org-match-string-no-properties 2) ""))) + (setq key (org-match-string-no-properties 2) + value (org-trim (or (org-match-string-no-properties 3) ""))) (unless (member key excluded) (push (cons key (or value "")) props))))) (if clocksum @@ -15520,10 +15522,9 @@ (defun org-buffer-property-keys (&optional include-specials include-defaults inc (while (re-search-forward org-property-start-re nil t) (setq range (org-get-property-block)) (goto-char (car range)) - (while (re-search-forward - (org-re "^[ \t]*:\\([-[:alnum:]_]+\\):") + (while (re-search-forward org-property-re (cdr range) t) - (add-to-list 'rtn (org-match-string-no-properties 1))) + (add-to-list 'rtn (org-match-string-no-properties 2))) (outline-next-heading)))) (when include-specials @@ -22029,11 +22030,10 @@ (defun org-indent-line () ;; Special polishing for properties, see `org-property-format' (setq column (current-column)) (beginning-of-line 1) - (if (looking-at - "\\([ \t]*\\)\\(:[-_0-9a-zA-Z]+:\\)[ \t]*\\(\\S-.*\\(\\S-\\|$\\)\\)") - (replace-match (concat (match-string 1) + (if (looking-at org-property-re) + (replace-match (concat (match-string 4) (format org-property-format - (match-string 2) (match-string 3))) + (match-string 1) (match-string 3))) t t)) (org-move-to-column column)))) -- 1.8.2.1 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-ob-core-allow-language-specific-header-arguments-in-.patch >From 659663d7f053f85872e572aca83541b470070abf Mon Sep 17 00:00:00 2001 From: Achim Gratz Date: Thu, 9 May 2013 20:01:45 +0200 Subject: [PATCH 2/2] ob-core: allow language specific header arguments in properties * lisp/ob-core.el (org-babel-insert-header-arg, org-babel-parse-src-block-match): Replace `if' with empty else part by `when' for readability. (org-babel-parse-src-block-match, org-babel-parse-inline-src-block-match): Inquire for language specific header args from properties and integrate them after other default header args. This allows for header arguments to be specified as properties (including inheritance). #+PROPERTY: header-args:R :session "*R-property*" :PROPERTIES: :header-args:R: :session "*R-drawer*" :END: --- lisp/ob-core.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 06d2520..c719089 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -757,7 +757,7 @@ (defun org-babel-insert-header-arg () (lang-headers (intern (concat "org-babel-header-args:" lang))) (headers (org-babel-combine-header-arg-lists org-babel-common-header-args-w-values - (if (boundp lang-headers) (eval lang-headers) nil))) + (when (boundp lang-headers) (eval lang-headers)))) (arg (org-icompleting-read "Header Arg: " (mapcar @@ -1309,6 +1309,9 @@ (defun org-babel-parse-src-block-match () (let* ((block-indentation (length (match-string 1))) (lang (org-no-properties (match-string 2))) (lang-headers (intern (concat "org-babel-default-header-args:" lang))) + (lang-props (save-match-data + (org-entry-get (point) (concat "header-args:" lang) + 'inherit 'literal-nil))) (switches (match-string 3)) (body (org-no-properties (let* ((body (match-string 5)) @@ -1329,8 +1332,9 @@ (defun org-babel-parse-src-block-match () (buffer-string))) (org-babel-merge-params org-babel-default-header-args - (if (boundp lang-headers) (eval lang-headers) nil) + (when (boundp lang-headers) (eval lang-headers)) (org-babel-params-from-properties lang) + (org-babel-parse-header-arguments lang-props) (org-babel-parse-header-arguments (org-no-properties (or (match-string 4) "")))) switches @@ -1339,6 +1343,9 @@ (defun org-babel-parse-src-block-match () (defun org-babel-parse-inline-src-block-match () "Parse the results from a match of the `org-babel-inline-src-block-regexp'." (let* ((lang (org-no-properties (match-string 2))) + (lang-props (save-match-data + (org-entry-get (point) (concat "header-args:" lang) + 'inherit 'literal-nil))) (lang-headers (intern (concat "org-babel-default-header-args:" lang)))) (list lang (org-unescape-code-in-string (org-no-properties (match-string 5))) -- 1.8.2.1 --=-=-= Content-Type: text/plain Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ Wavetables for the Terratec KOMPLEXER: http://Synth.Stromeko.net/Downloads.html#KomplexerWaves --=-=-=--