emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* `with` as a list.
@ 2020-05-22 16:07 Mario Frasca
  2020-05-28 13:34 ` [PATCH] [FEATURE] " Mario Frasca
  2020-05-30  6:22 ` Kyle Meyer
  0 siblings, 2 replies; 23+ messages in thread
From: Mario Frasca @ 2020-05-22 16:07 UTC (permalink / raw)
  To: emacs-orgmode

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

good day to you all

now and then I use emacs to make graphs.  now recently I was plotting 
point data, and a running average "fit", so I wanted to have points, and 
lines, which I know it's possible in `gnuplot` but now how do I do that 
from org-plot …

I wrote a small patch for org-plot.el, I'm not a Lisp programmer so I'm 
sure the patch looks terrible, but it does allow me to do this:

#+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines)

it's two additions:

1. it lets me specify the order in which the dependent columns should be 
considered.

2. it lets me specify a different `with` for each column, in the same order.

if you leave the `with` away, you get "lines" for all columns.

if you specify only one `with` value, that value is used for all columns.

if you specify more `deps` than `with`, the ones not specified will get 
"lines".

if you specify more `with` than `deps`, they are ignored.

I ran the tests, and I get two failing ones, quite unrelated according 
to me:

2 unexpected results:
    FAILED  ob-exp/evaluate-all-executables-in-order
    FAILED  ob-exp/export-call-line-information

I have not defined test cases for the new behaviour, I'm willing to do 
that (learning the way this test environment works), but I don't find 
the location of the other tests related to the area of the program, 
which I'm tweaking.

best regards all,

Mario Frasca


[-- Attachment #2: with-as-a-list.patch --]
[-- Type: text/x-patch, Size: 3109 bytes --]

diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index a23195d2a..87a415137 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -179,6 +179,28 @@ and dependent variables."
 	  (setf back-edge "") (setf front-edge ""))))
     row-vals))
 
+(defun org-plot/zip-deps-with (num-cols ind deps with)
+  "describe each column to be plotted as (col . with)"
+  ;; make 'deps explicit
+  (unless deps
+    (setf deps (let (r)
+		 (dotimes (i num-cols r)
+		   (unless (eq num-cols (+ ind i))
+		     (setq r (cons (- num-cols i) r)))))))
+  ;; make sure 'with matches 'deps
+  (unless with
+    (setf with "lines"))
+  (unless (listp with)
+    (setf with (mapcar (lambda (x) with) deps)))
+  ;; invoke zipping function on converted data
+  (org-plot/zip deps with))
+
+(defun org-plot/zip (xs ys)
+  (unless
+      (null xs)
+    (cons (cons (car xs) (or (car ys) "lines"))
+	  (org-plot/zip (cdr xs) (cdr ys)))))
+
 (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
   "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
 NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -240,22 +262,22 @@ manner suitable for prepending to a user-specified script."
 			       "%Y-%m-%d-%H:%M:%S") "\"")))
     (unless preface
       (pcase type			; plot command
-	(`2d (dotimes (col num-cols)
-	       (unless (and (eq type '2d)
-			    (or (and ind (equal (1+ col) ind))
-				(and deps (not (member (1+ col) deps)))))
-		 (setf plot-lines
-		       (cons
-			(format plot-str data-file
-				(or (and ind (> ind 0)
-					 (not text-ind)
-					 (format "%d:" ind)) "")
-				(1+ col)
-				(if text-ind (format ":xticlabel(%d)" ind) "")
-				with
-				(or (nth col col-labels)
-				    (format "%d" (1+ col))))
-			plot-lines)))))
+	(`2d (dolist
+		 (col-with
+		  (org-plot/zip-deps-with num-cols ind deps with))
+	       (setf plot-lines
+		     (cons
+		      (format plot-str data-file
+			      (or (and ind (> ind 0)
+				       (not text-ind)
+				       (format "%d:" ind)) "")
+			      (car col-with)
+			      (if text-ind (format ":xticlabel(%d)" ind) "")
+			      (cdr col-with)
+			      (or (nth (1- (car col-with))
+				       col-labels)
+				  (format "%d" (car col-with))))
+		      plot-lines))))
 	(`3d
 	 (setq plot-lines (list (format "'%s' matrix with %s title ''"
 					data-file with))))
@@ -310,7 +332,8 @@ line directly before or after the table."
 				table data-file params)))
 		 (when y-labels (plist-put params :ylabels y-labels)))))
       ;; Check for timestamp ind column.
-      (let ((ind (1- (plist-get params :ind))))
+      (let ((ind (1- (plist-get params :ind)))
+	    (with (plist-get params :with)))
 	(when (and (>= ind 0) (eq '2d (plist-get params :plot-type)))
 	  (if (= (length
 		  (delq 0 (mapcar
@@ -320,7 +343,7 @@ line directly before or after the table."
 		 0)
 	      (plist-put params :timeind t)
 	    ;; Check for text ind column.
-	    (if (or (string= (plist-get params :with) "hist")
+	    (if (or (and (stringp with) (string= with "hist"))
 		    (> (length
 			(delq 0 (mapcar
 				 (lambda (el)

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH] [FEATURE] Re: `with` as a list.
  2020-05-22 16:07 `with` as a list Mario Frasca
@ 2020-05-28 13:34 ` Mario Frasca
  2020-05-30  6:22 ` Kyle Meyer
  1 sibling, 0 replies; 23+ messages in thread
From: Mario Frasca @ 2020-05-28 13:34 UTC (permalink / raw)
  To: emacs-orgmode; +Cc: schulte.eric

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

I have added a couple of unit tests to the suite, describing the two 
functions I added.  I have no unexpectedly failing tests now.

I'm explicitly cc-ing Eric Schulte because he's in the header for 
org-plot.el, and —missing the unit tests for that source— I hope he can 
assist me not breaking what he wrote.  … I guess I can write also test 
cases for what already exists, but I will very likely need assistance.

best regards,
Mario Frasca

On 22/05/2020 11:07, Mario Frasca wrote:
> good day to you all
>
> now and then I use emacs to make graphs.  now recently I was plotting 
> point data, and a running average "fit", so I wanted to have points, 
> and lines, which I know it's possible in `gnuplot` but now how do I do 
> that from org-plot …
>
> I wrote a small patch for org-plot.el, I'm not a Lisp programmer so 
> I'm sure the patch looks terrible, but it does allow me to do this:
>
> #+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines)
>
> it's two additions:
>
> 1. it lets me specify the order in which the dependent columns should 
> be considered.
>
> 2. it lets me specify a different `with` for each column, in the same 
> order.
>
> if you leave the `with` away, you get "lines" for all columns.
>
> if you specify only one `with` value, that value is used for all columns.
>
> if you specify more `deps` than `with`, the ones not specified will 
> get "lines".
>
> if you specify more `with` than `deps`, they are ignored.
>
> I ran the tests, and I get two failing ones, quite unrelated according 
> to me:
>
> 2 unexpected results:
>    FAILED  ob-exp/evaluate-all-executables-in-order
>    FAILED  ob-exp/export-call-line-information
>
> I have not defined test cases for the new behaviour, I'm willing to do 
> that (learning the way this test environment works), but I don't find 
> the location of the other tests related to the area of the program, 
> which I'm tweaking.
>
> best regards all,
>
> Mario Frasca
>

[-- Attachment #2: plot-with-list.patch --]
[-- Type: text/x-patch, Size: 5263 bytes --]

diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index a23195d2a..524615d98 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -179,6 +179,28 @@ and dependent variables."
 	  (setf back-edge "") (setf front-edge ""))))
     row-vals))
 
+(defun org-plot/zip-deps-with (num-cols ind deps with)
+  "describe each column to be plotted as (col . with)"
+  ;; make 'deps explicit
+  (unless deps
+    (setf deps (let (r)
+		 (dotimes (i num-cols r)
+		   (unless (eq num-cols (+ ind i))
+		     (setq r (cons (- num-cols i) r)))))))
+  ;; make sure 'with matches 'deps
+  (unless with
+    (setf with "lines"))
+  (unless (listp with)
+    (setf with (make-list (length deps) with)))
+  ;; invoke zipping function on converted data
+  (org-plot/zip deps with))
+
+(defun org-plot/zip (xs ys)
+  (unless
+      (null xs)
+    (cons (cons (car xs) (or (car ys) "lines"))
+	  (org-plot/zip (cdr xs) (cdr ys)))))
+
 (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
   "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
 NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -240,22 +262,24 @@ manner suitable for prepending to a user-specified script."
 			       "%Y-%m-%d-%H:%M:%S") "\"")))
     (unless preface
       (pcase type			; plot command
-	(`2d (dotimes (col num-cols)
-	       (unless (and (eq type '2d)
-			    (or (and ind (equal (1+ col) ind))
-				(and deps (not (member (1+ col) deps)))))
-		 (setf plot-lines
-		       (cons
-			(format plot-str data-file
-				(or (and ind (> ind 0)
-					 (not text-ind)
-					 (format "%d:" ind)) "")
-				(1+ col)
-				(if text-ind (format ":xticlabel(%d)" ind) "")
-				with
-				(or (nth col col-labels)
-				    (format "%d" (1+ col))))
-			plot-lines)))))
+	(`2d (dolist
+		 (col-with
+		  (org-plot/zip-deps-with num-cols ind deps with))
+	       (setf plot-lines
+		     (cons
+		      (format plot-str data-file
+			      (or (and ind (> ind 0)
+				       (not text-ind)
+				       (format "%d:" ind)) "")
+			      (car col-with)
+			      (if text-ind (format ":xticlabel(%d)" ind) "")
+			      (cdr col-with)
+			      (apply (lambda (x)
+				       (if (= 0 (length x))
+					   (format "%d" (car col-with))
+					 x))
+				     (list (nth (1- (car col-with)) col-labels))))
+		      plot-lines))))
 	(`3d
 	 (setq plot-lines (list (format "'%s' matrix with %s title ''"
 					data-file with))))
@@ -310,7 +334,8 @@ line directly before or after the table."
 				table data-file params)))
 		 (when y-labels (plist-put params :ylabels y-labels)))))
       ;; Check for timestamp ind column.
-      (let ((ind (1- (plist-get params :ind))))
+      (let ((ind (1- (plist-get params :ind)))
+	    (with (plist-get params :with)))
 	(when (and (>= ind 0) (eq '2d (plist-get params :plot-type)))
 	  (if (= (length
 		  (delq 0 (mapcar
@@ -320,7 +345,7 @@ line directly before or after the table."
 		 0)
 	      (plist-put params :timeind t)
 	    ;; Check for text ind column.
-	    (if (or (string= (plist-get params :with) "hist")
+	    (if (or (and (stringp with) (string= with "hist"))
 		    (> (length
 			(delq 0 (mapcar
 				 (lambda (el)
diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el
new file mode 100644
index 000000000..4ed8c15b4
--- /dev/null
+++ b/testing/lisp/test-org-plot.el
@@ -0,0 +1,62 @@
+;;; test-org-plot.el --- Tests for org-plot.el
+
+;; Copyright (C) 2020  Mario Frasca
+
+;; Author: Mario Frasca <mario at anche dot no>
+
+;; Released under the GNU General Public License version 3
+;; see: http://www.gnu.org/licenses/gpl-3.0.html
+
+;;;; Comments
+
+
+\f
+;;; Code:
+
+(require 'org-plot)
+
+(ert-deftest test-org-plot/zip ()
+  "Test `org-plot/zip' specifications."
+  ;; zipping two equal length lists
+  (should
+   (equal '((1 . "a") (2 . "b") (3 . "c"))
+	  (org-plot/zip '(1 2 3) '("a" "b" "c"))))
+  ;; if second is shorter, fill in with "lines"
+  (should
+   (equal '((1 . "a") (2 . "b") (3 . "lines"))
+	  (org-plot/zip '(1 2 3) '("a" "b"))))
+  ;; if first is shorter, stop there
+  (should
+   (equal '((1 . "a") (2 . "b"))
+	  (org-plot/zip '(1 2) '("a" "b" "c")))))
+
+(ert-deftest test-org-plot/zip-deps-with ()
+  "Test `org-plot/zip-deps-with' specifications."
+  ;; no deps, no with. defaults to all except ind, and "lines"
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil nil)
+	  '((2 . "lines") (3 . "lines"))))
+  ;; no deps, single with. defaults to all except ind, and repeated with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil "hist")
+	  '((2 . "hist") (3 . "hist"))))
+  ;; no deps, explicit with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil '("points" "hist"))
+	  '((2 . "points") (3 . "hist"))))
+  ;; explicit with, same length as deps
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(2 4) '("points" "hist"))
+	  '((2 . "points") (4 . "hist"))))
+  ;; same as above, but different order
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; fills in with "lines"
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2 3) '("points"))
+	  '((4 . "points") (2 . "lines") (3 . "lines")))))
+  
+     
+(provide 'test-org-plot)
+;;; test-org-plot.el end here

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-22 16:07 `with` as a list Mario Frasca
  2020-05-28 13:34 ` [PATCH] [FEATURE] " Mario Frasca
@ 2020-05-30  6:22 ` Kyle Meyer
  2020-05-30 14:23   ` Mario Frasca
  2020-05-30 16:01   ` Mario Frasca
  1 sibling, 2 replies; 23+ messages in thread
From: Kyle Meyer @ 2020-05-30  6:22 UTC (permalink / raw)
  To: Mario Frasca, emacs-orgmode

Mario Frasca writes:

> now and then I use emacs to make graphs.  now recently I was plotting 
> point data, and a running average "fit", so I wanted to have points, and 
> lines, which I know it's possible in `gnuplot` but now how do I do that 
> from org-plot …
>
> I wrote a small patch for org-plot.el, I'm not a Lisp programmer so I'm 
> sure the patch looks terrible, but it does allow me to do this:
>
> #+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines)
>
> it's two additions: [...]

Thanks for the patch and for clearly describing the motivation.  I'm not
an org-plot user, but the change sounds useful.  (It'd be great if
org-plot users could chime in.)

Two meta-comments:

  * Please provide a patch with a commit message.  See
    <https://orgmode.org/worg/org-contribute.html> for more information.

  * The link above also explains the copyright assignment requirement
    for contributions.  Please consider assigning copyright to the FSF.

> diff --git a/lisp/org-plot.el b/lisp/org-plot.el
> index a23195d2a..87a415137 100644
> --- a/lisp/org-plot.el
> +++ b/lisp/org-plot.el
> @@ -179,6 +179,28 @@ and dependent variables."
>  	  (setf back-edge "") (setf front-edge ""))))
>      row-vals))
>  
> +(defun org-plot/zip-deps-with (num-cols ind deps with)
> +  "describe each column to be plotted as (col . with)"

This doesn't match the convention used in this code base for docstrings.
Taking a look around should give you a good sense, but (1) the first
word should be capitalized, (2) sentences should end with a period, and
(3) ideally all parameters should be described in the docstring.

> +  ;; make 'deps explicit

I think this and the other comments in this function could safely be
dropped.

> +  (unless deps
> +    (setf deps (let (r)
> +		 (dotimes (i num-cols r)
> +		   (unless (eq num-cols (+ ind i))
> +		     (setq r (cons (- num-cols i) r)))))))

Hmm, org-plot does seem to use setf a lot (more than any other .el file
in the repo), though using setq unless setf is needed would be more
consistent with this code base.

The code above looks fine to me.  Another option would be to use
number-sequence and then filter out the ind value.

> +  ;; make sure 'with matches 'deps
> +  (unless with
> +    (setf with "lines"))
> +  (unless (listp with)
> +    (setf with (mapcar (lambda (x) with) deps)))

This is make-list in the more recent diff you sent, which I agree is
better.

> +  ;; invoke zipping function on converted data
> +  (org-plot/zip deps with))
> +
> +(defun org-plot/zip (xs ys)
> +  (unless
> +      (null xs)
> +    (cons (cons (car xs) (or (car ys) "lines"))

Is the "lines" fall back ever reached?  It looks like you're extending
`with' above to be the same length as `deps`.

> +	  (org-plot/zip (cdr xs) (cdr ys)))))

In Elisp, it's not very common to use recursive functions (and there's
no TCO).  In the case of zipping two lists, I think it'd probably be
easiest to just use cl-loop.  And in my view having a separate function
here is probably an overkill.

>  (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
>    "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
>  NUM-COLS controls the number of columns plotted in a 2-d plot.
> @@ -240,22 +262,22 @@ manner suitable for prepending to a user-specified script."
>  			       "%Y-%m-%d-%H:%M:%S") "\"")))
>      (unless preface
>        (pcase type			; plot command
> -	(`2d (dotimes (col num-cols)
> -	       (unless (and (eq type '2d)
> -			    (or (and ind (equal (1+ col) ind))
> -				(and deps (not (member (1+ col) deps)))))
> -		 (setf plot-lines
> -		       (cons
> -			(format plot-str data-file
> -				(or (and ind (> ind 0)
> -					 (not text-ind)
> -					 (format "%d:" ind)) "")
> -				(1+ col)
> -				(if text-ind (format ":xticlabel(%d)" ind) "")
> -				with
> -				(or (nth col col-labels)
> -				    (format "%d" (1+ col))))
> -			plot-lines)))))
> +	(`2d (dolist
> +		 (col-with
> +		  (org-plot/zip-deps-with num-cols ind deps with))
> +	       (setf plot-lines
> +		     (cons
> +		      (format plot-str data-file
> +			      (or (and ind (> ind 0)
> +				       (not text-ind)
> +				       (format "%d:" ind)) "")
> +			      (car col-with)
> +			      (if text-ind (format ":xticlabel(%d)" ind) "")
> +			      (cdr col-with)
> +			      (or (nth (1- (car col-with))
> +				       col-labels)
> +				  (format "%d" (car col-with))))
> +		      plot-lines))))

I haven't looked at this bit too closely (and I know the handling around
col-labels changed a bit in the last message you sent), but I did try
out a few org-plot invocations and things seemed to work as I expected.
I'll plan to take a closer when you send a reroll.

> @@ -320,7 +343,7 @@ line directly before or after the table."
>  		 0)
>  	      (plist-put params :timeind t)
>  	    ;; Check for text ind column.
> -	    (if (or (string= (plist-get params :with) "hist")
> +	    (if (or (and (stringp with) (string= with "hist"))

Could be simplified by using `equal'.

Thanks again for the patch.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30  6:22 ` Kyle Meyer
@ 2020-05-30 14:23   ` Mario Frasca
  2020-05-30 14:38     ` Mario Frasca
  2020-05-30 20:23     ` Kyle Meyer
  2020-05-30 16:01   ` Mario Frasca
  1 sibling, 2 replies; 23+ messages in thread
From: Mario Frasca @ 2020-05-30 14:23 UTC (permalink / raw)
  To: Kyle Meyer, emacs-orgmode

Hi Kyle,

thank you for writing back, I have a couple of questions in reply.

btw. are you on irc.freenode.net?  I'm `mariotomo' there.  and I just 
joined `#org-mode'.  I don't think that my terminal will ring a bell if 
I'm mentioned there.

On 30/05/2020 01:22, Kyle Meyer wrote:
> Mario Frasca writes:
>
>> […]
> Thanks for the patch and for clearly describing the motivation.  I'm not
> an org-plot user, but the change sounds useful.  (It'd be great if
> org-plot users could chime in.)

thank you for taking the time to review!


> Two meta-comments:
>
>    * Please provide a patch with a commit message.  See
>      <https://orgmode.org/worg/org-contribute.html> for more information.
>
>    * The link above also explains the copyright assignment requirement
>      for contributions.  Please consider assigning copyright to the FSF.

I'm editing in my cloned repository, and committing often, so I do not 
have a single commit, consequently also not a single commit message.

I just sent my form request to assign@gnu.org.


>> diff --git a/lisp/org-plot.el b/lisp/org-plot.el
>> index a23195d2a..87a415137 100644
>> --- a/lisp/org-plot.el
>> +++ b/lisp/org-plot.el
>> @@ -179,6 +179,28 @@ and dependent variables."
>>   	  (setf back-edge "") (setf front-edge ""))))
>>       row-vals))
>>   
>> +(defun org-plot/zip-deps-with (num-cols ind deps with)
>> +  "describe each column to be plotted as (col . with)"
> This doesn't match the convention used in this code base for docstrings.
> Taking a look around should give you a good sense, but (1) the first
> word should be capitalized, (2) sentences should end with a period, and
> (3) ideally all parameters should be described in the docstring.

ok, 1 and 2 are just consequence of my usual way of typing, however 
wrong, I will fix them.  3 I didn't consider.  useful point.


>
>> +  ;; make 'deps explicit
> I think this and the other comments in this function could safely be
> dropped.

:+1:


>> +  (unless deps
>> +    (setf deps (let (r)
>> +		 (dotimes (i num-cols r)
>> +		   (unless (eq num-cols (+ ind i))
>> +		     (setq r (cons (- num-cols i) r)))))))
> […] using setq unless setf is needed would be more
> consistent with this code base.

the "unless needed" makes me suspect I should read what's the difference.


> The code above looks fine to me.  Another option would be to use
> number-sequence and then filter out the ind value.

no, that would break functionality: I need to keep the given order.

btw my patch allows you to use the same column more than once.


>
>> +  ;; invoke zipping function on converted data
>> +  (org-plot/zip deps with))
>> +
>> +(defun org-plot/zip (xs ys)
>> +  (unless
>> +      (null xs)
>> +    (cons (cons (car xs) (or (car ys) "lines"))
> Is the "lines" fall back ever reached?  It looks like you're extending
> `with' above to be the same length as `deps`.

it is needed: I'm not extending any `with' given as a non-empty list.

but I should be using some settings, some global default `with' value, 
which I don't know where to find.  hard coding "lines" can't be the 
right thing to do.

>> +	  (org-plot/zip (cdr xs) (cdr ys)))))
> In Elisp, it's not very common to use recursive functions (and there's
> no TCO).  In the case of zipping two lists, I think it'd probably be
> easiest to just use cl-loop.  And in my view having a separate function
> here is probably an overkill.

I'm not sure about the TCO (in other words: I haven't the faintest idea 
what you mean by that), and I would not know how to write this using 
`cl-loop'.  I'll have a look though.


>>   (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
>>     "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
>>   NUM-COLS controls the number of columns plotted in a 2-d plot.
>> @@ -240,22 +262,22 @@ manner suitable for prepending to a user-specified script."
>>   			       "%Y-%m-%d-%H:%M:%S") "\"")))
>>       (unless preface
>>         (pcase type			; plot command
>> -	(`2d (dotimes (col num-cols)
>> -	       (unless (and (eq type '2d)
>> -			    (or (and ind (equal (1+ col) ind))
>> -				(and deps (not (member (1+ col) deps)))))
>> -		 (setf plot-lines
>> -		       (cons
>> -			(format plot-str data-file
>> -				(or (and ind (> ind 0)
>> -					 (not text-ind)
>> -					 (format "%d:" ind)) "")
>> -				(1+ col)
>> -				(if text-ind (format ":xticlabel(%d)" ind) "")
>> -				with
>> -				(or (nth col col-labels)
>> -				    (format "%d" (1+ col))))
>> -			plot-lines)))))
>> +	(`2d (dolist
>> +		 (col-with
>> +		  (org-plot/zip-deps-with num-cols ind deps with))
>> +	       (setf plot-lines
>> +		     (cons
>> +		      (format plot-str data-file
>> +			      (or (and ind (> ind 0)
>> +				       (not text-ind)
>> +				       (format "%d:" ind)) "")
>> +			      (car col-with)
>> +			      (if text-ind (format ":xticlabel(%d)" ind) "")
>> +			      (cdr col-with)
>> +			      (or (nth (1- (car col-with))
>> +				       col-labels)
>> +				  (format "%d" (car col-with))))
>> +		      plot-lines))))
> I haven't looked at this bit too closely (and I know the handling around
> col-labels changed a bit in the last message you sent), but I did try
> out a few org-plot invocations and things seemed to work as I expected.
> I'll plan to take a closer when you send a reroll.

the whole org-plot.el has (had) no unit tests, so if you share a couple 
of your org-plot invocations, I can convert them to regression tests.


>> @@ -320,7 +343,7 @@ line directly before or after the table."
>>   		 0)
>>   	      (plist-put params :timeind t)
>>   	    ;; Check for text ind column.
>> -	    (if (or (string= (plist-get params :with) "hist")
>> +	    (if (or (and (stringp with) (string= with "hist"))
> Could be simplified by using `equal'.

yes, definitely!  as said, I'm not a lisp programmer.  ;-)

I hope to post a new diff soon.

cheers, MF



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 14:23   ` Mario Frasca
@ 2020-05-30 14:38     ` Mario Frasca
  2020-05-30 20:23     ` Kyle Meyer
  1 sibling, 0 replies; 23+ messages in thread
From: Mario Frasca @ 2020-05-30 14:38 UTC (permalink / raw)
  To: Kyle Meyer, emacs-orgmode

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

On 30/05/2020 09:23, Mario Frasca wrote:
>> The code above looks fine to me.  Another option would be to use
>> number-sequence and then filter out the ind value.
>
> no, that would break functionality: I need to keep the given order.
ah, no, sorry, you are totally right here.  I'll see if using 
number-sequence makes the code shorter.

[-- Attachment #2: Type: text/html, Size: 780 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30  6:22 ` Kyle Meyer
  2020-05-30 14:23   ` Mario Frasca
@ 2020-05-30 16:01   ` Mario Frasca
  2020-05-30 20:25     ` Kyle Meyer
  1 sibling, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-05-30 16:01 UTC (permalink / raw)
  To: Kyle Meyer, emacs-orgmode

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

what's new …

edited the documentation string to `org-plot/zip-deps-with',

removed some redundancies there,

removed my ›zip‹ function, in favour of ›cl-mapcar 'cons‹,

simplified the double test `stringp', `string=' with `equal'.

simplified the unit tests correspondingly.

make test: no unexpected failing tests.


[-- Attachment #2: org-plot.diff --]
[-- Type: text/x-patch, Size: 5251 bytes --]

diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index a23195d2a..c44cca991 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -156,7 +156,8 @@ and dependent variables."
 			  table)))
     ;; write table to gnuplot grid datafile format
     (with-temp-file data-file
-      (let ((num-rows (length table)) (num-cols (length (nth 0 table)))
+      (let ((num-rows (length table))
+	    (num-cols (length (nth 0 table)))
 	    (gnuplot-row (lambda (col row value)
 			   (setf col (+ 1 col)) (setf row (+ 1 row))
 			   (format "%f  %f  %f\n%f  %f  %f\n"
@@ -179,6 +180,22 @@ and dependent variables."
 	  (setf back-edge "") (setf front-edge ""))))
     row-vals))
 
+(defun org-plot/zip-deps-with (num-cols ind deps with)
+  "Describe each column to be plotted as (col . with).
+Loops over DEPS and WITH in order to cons their elements.
+If the DEPS list of columns is not given, use all columns from 1
+to NUM-COLS, excluding IND.
+If WITH is given as a string, use the given value for all
+columns.
+If WITH is given as a list, and it's shorter than DEPS, expand it
+with the global default value."
+  (unless deps
+    (setq deps (remove ind (number-sequence 1 num-cols))))
+  (unless (listp with)
+    (setq with (make-list (length deps) with)))
+  (setq with (append with (make-list (- (length deps) (length with)) "lines")))
+  (cl-mapcar 'cons deps with))
+
 (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
   "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
 NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -240,22 +257,24 @@ manner suitable for prepending to a user-specified script."
 			       "%Y-%m-%d-%H:%M:%S") "\"")))
     (unless preface
       (pcase type			; plot command
-	(`2d (dotimes (col num-cols)
-	       (unless (and (eq type '2d)
-			    (or (and ind (equal (1+ col) ind))
-				(and deps (not (member (1+ col) deps)))))
-		 (setf plot-lines
-		       (cons
-			(format plot-str data-file
-				(or (and ind (> ind 0)
-					 (not text-ind)
-					 (format "%d:" ind)) "")
-				(1+ col)
-				(if text-ind (format ":xticlabel(%d)" ind) "")
-				with
-				(or (nth col col-labels)
-				    (format "%d" (1+ col))))
-			plot-lines)))))
+	(`2d (dolist
+		 (col-with
+		  (org-plot/zip-deps-with num-cols ind deps with))
+	       (setf plot-lines
+		     (cons
+		      (format plot-str data-file
+			      (or (and ind (> ind 0)
+				       (not text-ind)
+				       (format "%d:" ind)) "")
+			      (car col-with)
+			      (if text-ind (format ":xticlabel(%d)" ind) "")
+			      (cdr col-with)
+			      (apply (lambda (x)
+				       (if (= 0 (length x))
+					   (format "%d" (car col-with))
+					 x))
+				     (list (nth (1- (car col-with)) col-labels))))
+		      plot-lines))))
 	(`3d
 	 (setq plot-lines (list (format "'%s' matrix with %s title ''"
 					data-file with))))
@@ -310,7 +329,8 @@ line directly before or after the table."
 				table data-file params)))
 		 (when y-labels (plist-put params :ylabels y-labels)))))
       ;; Check for timestamp ind column.
-      (let ((ind (1- (plist-get params :ind))))
+      (let ((ind (1- (plist-get params :ind)))
+	    (with (plist-get params :with)))
 	(when (and (>= ind 0) (eq '2d (plist-get params :plot-type)))
 	  (if (= (length
 		  (delq 0 (mapcar
@@ -320,7 +340,7 @@ line directly before or after the table."
 		 0)
 	      (plist-put params :timeind t)
 	    ;; Check for text ind column.
-	    (if (or (string= (plist-get params :with) "hist")
+	    (if (or (equal with "hist")
 		    (> (length
 			(delq 0 (mapcar
 				 (lambda (el)
diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el
new file mode 100644
index 000000000..2bbd09b5f
--- /dev/null
+++ b/testing/lisp/test-org-plot.el
@@ -0,0 +1,50 @@
+;;; test-org-plot.el --- Tests for org-plot.el
+
+;; Copyright (C) 2020  Mario Frasca
+
+;; Author: Mario Frasca <mario at anche dot no>
+
+;; Released under the GNU General Public License version 3
+;; see: http://www.gnu.org/licenses/gpl-3.0.html
+
+;;;; Comments
+
+
+\f
+;;; Code:
+
+(require 'org-test)
+(require 'org-plot)
+
+\f
+;; General auxiliaries
+
+(ert-deftest test-org-plot/zip-deps-with ()
+  "Test `org-plot/zip-deps-with' specifications."
+  ;; no deps, no with. defaults to all except ind, and "lines"
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil nil)
+	  '((2 . "lines") (3 . "lines"))))
+  ;; no deps, single with. defaults to all except ind, and repeated with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil "hist")
+	  '((2 . "hist") (3 . "hist"))))
+  ;; no deps, explicit with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil '("points" "hist"))
+	  '((2 . "points") (3 . "hist"))))
+  ;; explicit with, same length as deps
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(2 4) '("points" "hist"))
+	  '((2 . "points") (4 . "hist"))))
+  ;; same as above, but different order
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; fills in with "lines"
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2 3) '("points"))
+	  '((4 . "points") (2 . "lines") (3 . "lines")))))
+\f
+(provide 'test-org-plot)
+;;; test-org-plot.el end here

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 14:23   ` Mario Frasca
  2020-05-30 14:38     ` Mario Frasca
@ 2020-05-30 20:23     ` Kyle Meyer
  2020-05-30 21:29       ` Mario Frasca
  1 sibling, 1 reply; 23+ messages in thread
From: Kyle Meyer @ 2020-05-30 20:23 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca writes:

> btw. are you on irc.freenode.net?  I'm `mariotomo' there.  and I just 
> joined `#org-mode'.  I don't think that my terminal will ring a bell if 
> I'm mentioned there.

No, sorry, I'm not.

> On 30/05/2020 01:22, Kyle Meyer wrote:
>> Mario Frasca writes:
>
>> Two meta-comments:
>>
>>    * Please provide a patch with a commit message.  See
>>      <https://orgmode.org/worg/org-contribute.html> for more information.
>>
>>    * The link above also explains the copyright assignment requirement
>>      for contributions.  Please consider assigning copyright to the FSF.
>
> I'm editing in my cloned repository, and committing often, so I do not 
> have a single commit, consequently also not a single commit message.

There are various ways to get those fixups into a single commit.  Here's
one that assumes that you're working from the command line and on a
topic branch rather than directly on master.  Do an interactive rebase
(`git rebase -i master').  When the editor pops up, replace "pick" with
"fixup" in all of the lines but the first.  (If any of the "fixup"
commits have message bits that you want to keep in the final message,
you can use "squash" instead.)

For later fixups, you can do the same process.  You could also use
git-commit's --amend.  (Again, there are lots of possible workflows, and
of course once you're working on a series of commits rather than a
single one, the process changes a bit.)

> I just sent my form request to assign@gnu.org.

Thank you!  Please let us know when the process is complete.

I see you already sent an updated patch, so I'll just respond to one
more point from this message.

>> I haven't looked at this bit too closely (and I know the handling around
>> col-labels changed a bit in the last message you sent), but I did try
>> out a few org-plot invocations and things seemed to work as I expected.
>> I'll plan to take a closer when you send a reroll.
>
> the whole org-plot.el has (had) no unit tests, so if you share a couple 
> of your org-plot invocations, I can convert them to regression tests.

I don't use org-plot.el, so to try this out, I just copied an example
from the Worg tutorial, stripped the table down a bit, and tried a few
`deps' and `with' values.  So there's nothing too useful, but here's is
the last one I had:

--8<---------------cut here---------------start------------->8---
#+PLOT: title:"example table" ind:1 deps:(2 3) type:2d with:(lines points)
#+PLOT: labels:("xlab" "ylab" "zlab")
#+TBLNAME:org-plot-example-1
|   x |    y |    z |
|-----+------+------|
| 0.1 | 0.42 | 0.37 |
| 0.2 | 0.31 | 0.33 |
| 0.3 | 0.24 | 0.28 |
| 0.4 | 0.27 | 0.23 |
--8<---------------cut here---------------end--------------->8---

Thanks for your interest in adding tests.  Of course it'd be good for
org-plot.el to have some, and there are existing spots where I think it
should be easy enough to hook into and test (in particular generating
the script file and data file).  However, that doesn't necessarily have
to be tacked on to this series.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 16:01   ` Mario Frasca
@ 2020-05-30 20:25     ` Kyle Meyer
  2020-05-30 21:36       ` Mario Frasca
  0 siblings, 1 reply; 23+ messages in thread
From: Kyle Meyer @ 2020-05-30 20:25 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca writes:

> diff --git a/lisp/org-plot.el b/lisp/org-plot.el
> index a23195d2a..c44cca991 100644
> --- a/lisp/org-plot.el
> +++ b/lisp/org-plot.el
> @@ -156,7 +156,8 @@ and dependent variables."
>  			  table)))
>      ;; write table to gnuplot grid datafile format
>      (with-temp-file data-file
> -      (let ((num-rows (length table)) (num-cols (length (nth 0 table)))
> +      (let ((num-rows (length table))
> +	    (num-cols (length (nth 0 table)))

I don't disagree with the style preference here, but it's easier on
reviewers if the patch doesn't contain unrelated changes.

>  	    (gnuplot-row (lambda (col row value)
>  			   (setf col (+ 1 col)) (setf row (+ 1 row))
>  			   (format "%f  %f  %f\n%f  %f  %f\n"
> @@ -179,6 +180,22 @@ and dependent variables."
>  	  (setf back-edge "") (setf front-edge ""))))
>      row-vals))
>  
> +(defun org-plot/zip-deps-with (num-cols ind deps with)
> +  "Describe each column to be plotted as (col . with).
> +Loops over DEPS and WITH in order to cons their elements.
> +If the DEPS list of columns is not given, use all columns from 1
> +to NUM-COLS, excluding IND.
> +If WITH is given as a string, use the given value for all
> +columns.
> +If WITH is given as a list, and it's shorter than DEPS, expand it
> +with the global default value."

Thanks for updating the docstring.

> +  (unless deps
> +    (setq deps (remove ind (number-sequence 1 num-cols))))
> +  (unless (listp with)
> +    (setq with (make-list (length deps) with)))
> +  (setq with (append with (make-list (- (length deps) (length with)) "lines")))

The caller can crash this with something like

    make-list(-1 "lines")
    (append with (make-list (- (length deps) (length with)) "lines"))
    (setq with (append with (make-list (- (length deps) (length with)) "lines")))
    org-plot/zip-deps-with(3 1 (2 3) (lines points lines))
    [...]

if they accidentally give more `with` values than `deps`.

Also, if the `(unless (listp with) ...` condition is entered, I think
the second make-list call is unnecessary.

So, combining those two points, perhaps something like this:

    (setq with (if (listp with)
                   (append with
                           (make-list (max 0 (- (length deps) (length with)))
                                      "lines"))
                 (make-list (length deps) with)))

> +  (cl-mapcar 'cons deps with))

Nit-pick: s/'/#'/

The latter is short for `function' and, unlike the former, lets the
byte-compiler know that cons is a function (enabling a warning if, say,
you accidentally typed `conss`).

>  (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
>    "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
>  NUM-COLS controls the number of columns plotted in a 2-d plot.
> @@ -240,22 +257,24 @@ manner suitable for prepending to a user-specified script."
>  			       "%Y-%m-%d-%H:%M:%S") "\"")))
>      (unless preface
>        (pcase type			; plot command
> -	(`2d (dotimes (col num-cols)
> -	       (unless (and (eq type '2d)
> -			    (or (and ind (equal (1+ col) ind))
> -				(and deps (not (member (1+ col) deps)))))
> -		 (setf plot-lines
> -		       (cons
> -			(format plot-str data-file
> -				(or (and ind (> ind 0)
> -					 (not text-ind)
> -					 (format "%d:" ind)) "")
> -				(1+ col)
> -				(if text-ind (format ":xticlabel(%d)" ind) "")
> -				with
> -				(or (nth col col-labels)
> -				    (format "%d" (1+ col))))
> -			plot-lines)))))
> +	(`2d (dolist
> +		 (col-with
> +		  (org-plot/zip-deps-with num-cols ind deps with))
> +	       (setf plot-lines
> +		     (cons
> +		      (format plot-str data-file
> +			      (or (and ind (> ind 0)
> +				       (not text-ind)
> +				       (format "%d:" ind)) "")
> +			      (car col-with)
> +			      (if text-ind (format ":xticlabel(%d)" ind) "")
> +			      (cdr col-with)
> +			      (apply (lambda (x)
> +				       (if (= 0 (length x))
> +					   (format "%d" (car col-with))
> +					 x))
> +				     (list (nth (1- (car col-with)) col-labels))))

If I'm reading it correctly, (apply ...) could be simplified to

    (or (nth (1- (car col-with)) col-labels)
        (format "%d" (car col-with)))

> diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el
> new file mode 100644
> index 000000000..2bbd09b5f
> --- /dev/null
> +++ b/testing/lisp/test-org-plot.el
> @@ -0,0 +1,50 @@
> +;;; test-org-plot.el --- Tests for org-plot.el
> +
> +;; Copyright (C) 2020  Mario Frasca
> +
> +;; Author: Mario Frasca <mario at anche dot no>
> +
> +;; Released under the GNU General Public License version 3
> +;; see: http://www.gnu.org/licenses/gpl-3.0.html

Could you update this header to match the style used by other tests
(see, e.g., test-org-num.el)?

Tests themselves look good to me.  Thanks for adding them.  I think it'd
also be good to add a test for the with-longer-than-deps case I
mentioned above.

The manual should also be updated to mention this new feature, and it'd
be good to have an ORG-NEWS entry.

Thanks for working on this.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 20:23     ` Kyle Meyer
@ 2020-05-30 21:29       ` Mario Frasca
  2020-05-31 20:18         ` Mario Frasca
  0 siblings, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-05-30 21:29 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: emacs-orgmode

oops .. you mentioned `cl-loop' and I found it interesting, in 
particular the de-structuring part.

so I rewrote the (dolist (col-with …) …) as (cl-loop for (col . with) in 
… do …).

so I could simplify `(car col-with)' and `(cdr col-with)', then I 
replaced the `do' with a `collect', so I could squash other `setq' into 
one, and finally removed the need to do a `reverse' on the result.  less 
parentheses, and 4 lines less.

I added one regression test which is still respected, as is the rest of 
the test suite.

so maybe all is fine.

putting order in the commits is now the challenge.  thank you for your 
hints on git commit amend etc.

I hope to be back soon with a single commit...

ciao, Mario



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 20:25     ` Kyle Meyer
@ 2020-05-30 21:36       ` Mario Frasca
  2020-05-31  0:36         ` Kyle Meyer
  0 siblings, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-05-30 21:36 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: emacs-orgmode

On 30/05/2020 15:25, Kyle Meyer wrote:
> Could you update this header to match the style used by other tests
> (see, e.g., test-org-num.el)?

apparently, I managed to pick precisely the wrong example!

;;; test-org-clock.el --- Tests for org-clock.el




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 21:36       ` Mario Frasca
@ 2020-05-31  0:36         ` Kyle Meyer
  0 siblings, 0 replies; 23+ messages in thread
From: Kyle Meyer @ 2020-05-31  0:36 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca writes:

> On 30/05/2020 15:25, Kyle Meyer wrote:
>> Could you update this header to match the style used by other tests
>> (see, e.g., test-org-num.el)?
>
> apparently, I managed to pick precisely the wrong example!
>
> ;;; test-org-clock.el --- Tests for org-clock.el

Ha, I poked around in a few and couldn't find the one that looked like
yours, even though I figured it was based off another one.  I think
either way is fine, though it probably makes sense to go with the fuller
header that seems to be more common.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-30 21:29       ` Mario Frasca
@ 2020-05-31 20:18         ` Mario Frasca
  2020-06-01  0:19           ` Kyle Meyer
  0 siblings, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-05-31 20:18 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: emacs-orgmode

On 30/05/2020 16:29, Mario Frasca wrote:
> I hope to be back soon with a single commit... 

one doubt.  what's the point of having me squash all in a single commit, 
when I do not have write access to the repository?  if we were on 
github, I would be working on a pull request, which would have a 
description and a title, and contain several commits.  I don't 
understand the workflow apparently.




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-05-31 20:18         ` Mario Frasca
@ 2020-06-01  0:19           ` Kyle Meyer
  2020-06-01  1:47             ` Mario Frasca
  0 siblings, 1 reply; 23+ messages in thread
From: Kyle Meyer @ 2020-06-01  0:19 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca writes:

> On 30/05/2020 16:29, Mario Frasca wrote:
>> I hope to be back soon with a single commit... 
>
> one doubt.  what's the point of having me squash all in a single commit, 
> when I do not have write access to the repository? 

To provide me or another committer with a polished, final state to
apply, along with a commit message that follows the convention mentioned
at <https://orgmode.org/worg/org-contribute.html> and ideally explains
why the change should be applied.  (The rationale you sent in your first
message could be adapted for this.)  You've been sending a diff,
presumably from the point you branched off of to the tip of your branch.
In that case, you're already presenting each iteration you've sent as
one change; it just lacks a commit message.

Just for clarity: In this case, I think the change proposed so far makes
sense to present as a single commit.  I'm not claiming that in general a
patch series should be reduced to _one_ commit.

> if we were on github, I would be working on a pull request, which
> would have a description and a title, and contain several commits. 

If I were reviewing a pull request from you, I would still request that
you not pile fixup commits on top and that you instead rewrite/polish
the series to address feedback.  People have strong opinions in both
directions on this, and I hope this thread doesn't derail into a
discussion of those.  My point is just that this workflow is not unique
to mailing list patch submission.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-01  0:19           ` Kyle Meyer
@ 2020-06-01  1:47             ` Mario Frasca
  2020-06-01  2:31               ` Kyle Meyer
  0 siblings, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-06-01  1:47 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: emacs-orgmode

On 31/05/2020 19:19, Kyle Meyer wrote:
> You've been sending a diff,
> presumably from the point you branched off of to the tip of your branch.
> In that case, you're already presenting each iteration you've sent as
> one change; it just lacks a commit message.

right, that's indeed what I did, and this is also what I thought, so no 
need to rebase, squash or whatever, as long as I make sure that the diff 
I'm sending you is about this single issue, and let's agree on the 
commit message, because after all I'm adding a function to a software I 
don't really know.

I hope to send an updated patch soon, that will also include the docs.

I have no strong opinion on workflows, just trying to understand the one 
used here.

btw: if I had write permissions to the repositories, I would be adding 
test cases, and reviewing the docstrings, some of which I find 
misleading.  your remark on setf/setq could also be addressed in the 
code.  and some of the code ought to be refactored, as to allow for unit 
tests.

ciao, MF



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-01  1:47             ` Mario Frasca
@ 2020-06-01  2:31               ` Kyle Meyer
  2020-06-03 15:09                 ` Mario Frasca
  0 siblings, 1 reply; 23+ messages in thread
From: Kyle Meyer @ 2020-06-01  2:31 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca writes:

> On 31/05/2020 19:19, Kyle Meyer wrote:
>> You've been sending a diff,
>> presumably from the point you branched off of to the tip of your branch.
>> In that case, you're already presenting each iteration you've sent as
>> one change; it just lacks a commit message.
>
> right, that's indeed what I did, and this is also what I thought, so no 
> need to rebase, squash or whatever, as long as I make sure that the diff 
> I'm sending you is about this single issue, and let's agree on the 
> commit message, because after all I'm adding a function to a software I 
> don't really know.

The way to add the commit message to the patch you're sending is to
create a commit in your repository with the commit message and then
convert that commit to a patch with `git format-patch'.  When you send
the patch, the commit message can then be reviewed along with the code
change.

The contributing page that I linked to before
(<https://orgmode.org/worg/org-contribute.html>) has some information on
the expected commit message format and on using format-patch.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-01  2:31               ` Kyle Meyer
@ 2020-06-03 15:09                 ` Mario Frasca
  2020-06-03 15:13                   ` Bastien
  0 siblings, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-06-03 15:09 UTC (permalink / raw)
  To: Kyle Meyer; +Cc: emacs-orgmode

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

see attachment

[-- Attachment #2: 0001-org-plot.el-implementing-new-feature-with-as-list.patch --]
[-- Type: text/x-patch, Size: 8331 bytes --]

From 2a30f377281955f57723ef46ff56613373cf721d Mon Sep 17 00:00:00 2001
From: mfrasca <mario@anche.no>
Date: Tue, 2 Jun 2020 16:10:11 -0500
Subject: [PATCH] org-plot.el: implementing new feature "with-as-list"

Allows user specify as many `with' values as the columns in `deps'.

User can indicate the order in which the `deps' columns are to be
plotted, this is reflected in the order of the key (legend) elements,
and the z-order of the plotted elements.

User can specify as many different `with`, one for each `deps' column,
in the same order as `deps'.  If you leave the `with` away, you get
"lines" for all columns.  If you specify only one `with` value, that
value is used for all columns.  If you specify more `deps` than
`with`, the ones not specified will get "lines".  If you specify more
`with` than `deps`, they are ignored.

An example:

 #+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines)

A more complicated example:

 #+PLOT: set:"style line 2 lw 2 lc rgb 'forest-green'"
 #+PLOT: set:"style line 3 lw 2 lc rgb 'red'"
 #+PLOT: set:"style line 4 lw 1 lc rgb 'red'"
 #+PLOT: ind:1 deps:(3 6 4 7 10)
 #+PLOT: with:("points pt 3 lc rgb 'blue'" "points smooth csplines ls 2" "points pt 19 lc rgb 'blue'" "points smooth csplines ls 3" "points smooth csplines ls 4")

it does not work with histograms.
---
 doc/org-manual.org            |  7 ++--
 lisp/org-plot.el              | 66 +++++++++++++++++++++--------------
 testing/lisp/test-org-plot.el | 64 +++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+), 29 deletions(-)
 create mode 100644 testing/lisp/test-org-plot.el

diff --git a/doc/org-manual.org b/doc/org-manual.org
index 92252179b..40cb3c2f2 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -2845,9 +2845,10 @@ For more information and examples see the [[https://orgmode.org/worg/org-tutoria
 
 - =with= ::
 
-  Specify a =with= option to be inserted for every column being
-  plotted, e.g., =lines=, =points=, =boxes=, =impulses=.  Defaults to
-  =lines=.
+  Specify a =with= option to be inserted for the columns being
+  plotted, e.g., =lines=, =points=, =boxes=, =impulses=.  You can specify
+  a single value, to be applied to all columns, or a list of different
+  values, one for each column in the =deps= property.  Defaults to =lines=.
 
 - =file= ::
 
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index a23195d2a..073075037 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -179,6 +179,24 @@ and dependent variables."
 	  (setf back-edge "") (setf front-edge ""))))
     row-vals))
 
+(defun org-plot/zip-deps-with (num-cols ind deps with)
+  "Describe each column to be plotted as (col . with).
+Loops over DEPS and WITH in order to cons their elements.
+If the DEPS list of columns is not given, use all columns from 1
+to NUM-COLS, excluding IND.
+If WITH is given as a string, use the given value for all columns.
+If WITH is given as a list, and it's shorter than DEPS, expand it
+with the global default value."
+  (unless deps
+    (setq deps (remove ind (number-sequence 1 num-cols))))
+  (setq with
+	(if (listp with)
+	    (append with
+		    (make-list (max 0 (- (length deps) (length with)))
+			       "lines"))
+	  (make-list (length deps) with)))
+  (cl-mapcar #'cons deps with))
+
 (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
   "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
 NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -239,32 +257,27 @@ manner suitable for prepending to a user-specified script."
 			   (or timefmt	; timefmt passed to gnuplot
 			       "%Y-%m-%d-%H:%M:%S") "\"")))
     (unless preface
-      (pcase type			; plot command
-	(`2d (dotimes (col num-cols)
-	       (unless (and (eq type '2d)
-			    (or (and ind (equal (1+ col) ind))
-				(and deps (not (member (1+ col) deps)))))
-		 (setf plot-lines
-		       (cons
-			(format plot-str data-file
-				(or (and ind (> ind 0)
-					 (not text-ind)
-					 (format "%d:" ind)) "")
-				(1+ col)
-				(if text-ind (format ":xticlabel(%d)" ind) "")
-				with
-				(or (nth col col-labels)
-				    (format "%d" (1+ col))))
-			plot-lines)))))
-	(`3d
-	 (setq plot-lines (list (format "'%s' matrix with %s title ''"
-					data-file with))))
-	(`grid
-	 (setq plot-lines (list (format "'%s' with %s title ''"
-					data-file with)))))
+      (setq plot-lines
+	    (pcase type			; plot command
+	      (`2d (cl-loop
+		    for (col . with)
+		    in (org-plot/zip-deps-with num-cols ind deps with)
+		    collect (format plot-str data-file
+				    (or (and ind (> ind 0)
+					     (not text-ind)
+					     (format "%d:" ind)) "")
+				    col
+				    (if text-ind (format ":xticlabel(%d)" ind) "")
+				    with
+				    (or (nth (1- col) col-labels)
+					(format "%d" col)))))
+	      (`3d (list (format "'%s' matrix with %s title ''"
+				 data-file with)))
+	      (`grid (list (format "'%s' with %s title ''"
+				   data-file with)))))
       (funcall ats
 	       (concat plot-cmd " " (mapconcat #'identity
-					       (reverse plot-lines)
+					       plot-lines
 					       ",\\\n    "))))
     script))
 
@@ -310,7 +323,8 @@ line directly before or after the table."
 				table data-file params)))
 		 (when y-labels (plist-put params :ylabels y-labels)))))
       ;; Check for timestamp ind column.
-      (let ((ind (1- (plist-get params :ind))))
+      (let ((ind (1- (plist-get params :ind)))
+	    (with (plist-get params :with)))
 	(when (and (>= ind 0) (eq '2d (plist-get params :plot-type)))
 	  (if (= (length
 		  (delq 0 (mapcar
@@ -320,7 +334,7 @@ line directly before or after the table."
 		 0)
 	      (plist-put params :timeind t)
 	    ;; Check for text ind column.
-	    (if (or (string= (plist-get params :with) "hist")
+	    (if (or (equal with "hist")
 		    (> (length
 			(delq 0 (mapcar
 				 (lambda (el)
diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el
new file mode 100644
index 000000000..2bf153400
--- /dev/null
+++ b/testing/lisp/test-org-plot.el
@@ -0,0 +1,64 @@
+;;; test-org-plot.el --- Tests for Org Plot library    -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020  Mario Frasca
+
+;; Author: Mario Frasca <mario at anche dot no>
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'org-test)
+(require 'org-plot)
+
+\f
+;; General auxiliaries
+
+(ert-deftest test-org-plot/zip-deps-with ()
+  "Test `org-plot/zip-deps-with' specifications."
+  ;; no deps, no with. defaults to all except ind, and "lines"
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil nil)
+	  '((2 . "lines") (3 . "lines"))))
+  ;; no deps, single with. defaults to all except ind, and repeated with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil "hist")
+	  '((2 . "hist") (3 . "hist"))))
+  ;; no deps, explicit with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil '("points" "hist"))
+	  '((2 . "points") (3 . "hist"))))
+  ;; explicit with, same length as deps
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(2 4) '("points" "hist"))
+	  '((2 . "points") (4 . "hist"))))
+  ;; same as above, but different order
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; if with exceeds deps, trailing elements are discarded
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist" "lines"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; fills in with "lines"
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2 3) '("points"))
+	  '((4 . "points") (2 . "lines") (3 . "lines")))))
+
+
+\f
+(provide 'test-org-plot)
+;;; test-org-plot.el end here
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:09                 ` Mario Frasca
@ 2020-06-03 15:13                   ` Bastien
  2020-06-03 15:18                     ` Mario Frasca
  2020-06-03 15:25                     ` Mario Frasca
  0 siblings, 2 replies; 23+ messages in thread
From: Bastien @ 2020-06-03 15:13 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca <mario@anche.no> writes:

> see attachment

Thanks for the effort -- the commit message is not correctly formatted
though.  See https://orgmode.org/worg/org-contribute.html#commit-messages
and perhaps also read previous commit messages.

Also you need to sign the FSF copyright assignment if you want to make
big changes like this one.

See https://orgmode.org/request-assign-future.txt

Thanks,

-- 
 Bastien


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:13                   ` Bastien
@ 2020-06-03 15:18                     ` Mario Frasca
  2020-06-03 15:29                       ` Bastien
  2020-06-03 15:25                     ` Mario Frasca
  1 sibling, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-06-03 15:18 UTC (permalink / raw)
  To: Bastien; +Cc: emacs-orgmode

I'm very so much sorry Bastien, but I do not know what you mean, by "not 
correctly formatted".  if it were a bug report, you do agree it would be 
a useless one?  like "it doesn't work".

I'm sure you do understand what I mean, and I guess you know what would 
be the correctly formatted version.  can you show me?  next time I'll do 
better, but as of now, I obviously do not understand what you want, and 
why.  I was busy amending my other patches, and preparing a few more, 
but let's save time on both sides, and I'll give up for the time being.

ciao,

Mario


On 03/06/2020 10:13, Bastien wrote:
> Mario Frasca <mario@anche.no> writes:
>
>> see attachment
> Thanks for the effort -- the commit message is not correctly formatted
> though.  See https://orgmode.org/worg/org-contribute.html#commit-messages
> and perhaps also read previous commit messages.
>
> Also you need to sign the FSF copyright assignment if you want to make
> big changes like this one.
>
> See https://orgmode.org/request-assign-future.txt
>
> Thanks,
>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:13                   ` Bastien
  2020-06-03 15:18                     ` Mario Frasca
@ 2020-06-03 15:25                     ` Mario Frasca
  2020-06-03 15:30                       ` Bastien
  1 sibling, 1 reply; 23+ messages in thread
From: Mario Frasca @ 2020-06-03 15:25 UTC (permalink / raw)
  To: Bastien; +Cc: emacs-orgmode

On 03/06/2020 10:13, Bastien wrote:
> Also you need to sign the FSF copyright assignment if you want to make
> big changes like this one.
yes, I received the ASSIGNMENT –GNU EMACS pdf last night, I'm now seeing 
how I print & sign it.  it might take some time.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:18                     ` Mario Frasca
@ 2020-06-03 15:29                       ` Bastien
  2020-06-03 17:08                         ` Mario Frasca
  2020-06-03 22:15                         ` Mario Frasca
  0 siblings, 2 replies; 23+ messages in thread
From: Bastien @ 2020-06-03 15:29 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca <mario@anche.no> writes:

> I'm sure you do understand what I mean, and I guess you know what
> would be the correctly formatted version.  can you show me?  

Yes.  You mentioned earlier that you missed this section:
 https://orgmode.org/worg/org-contribute.html#commit-messages

Let me quote the text from this section:

A commit message should be constructed in the following way:

    Line 1 of the commit message should always be a short description
    of the overall change. Line 1 does not get a dot at the end and
    does not start with a star. Generally, it starts with the filename
    that has been changed, followed by a colon.

    Line 2 is an empty line.

    In line 3, the ChangeLog entry should start. A ChangeLog entry
    looks like this:

      * org-timer.el (org-timer-cancel-timer, org-timer-stop): Enhance
      message.
      (org-timer-set-timer): Use the number of minutes in the Effort
      property as the default timer value. Three prefix arguments will
      ignore the Effort value property.

The few lines above is what we called the "changelog".  It should be
the first part of the commit message -- after which you can add more
free-form context and explanations, if needed.

When you are on a function/variable that you updated in the modified
version of your code, you can create a changelog entry by hitting the
`C-x 4 a' keybinding.

This will open a new buffer, quote the function or variable, and let
you write a short sentence (starting with an uppercase letter and
ending with the ".", as a regular sentence.)

See these examples:

https://code.orgmode.org/bzg/org-mode/commit/b908367b03
https://code.orgmode.org/bzg/org-mode/commit/65fdf2be16
https://code.orgmode.org/bzg/org-mode/commit/f5997d5956

> next time I'll do better, but as of now, I obviously do not
> understand what you want, and why. 

I hope it is a bit more clear now.

> I was busy amending my other patches, and preparing a few more, but
> let's save time on both sides, and I'll give up for the time being.

You did the hardest part, which is to fix things, I hope you will be 
able to update the formatting of the commit messages.

As for the "why", this is because Org follows the same conventions
than Emacs when it comes to commit messages (partly because Org is
part of Emacs.)

Thanks in advance for when you'll feel motivated again!

-- 
 Bastien


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:25                     ` Mario Frasca
@ 2020-06-03 15:30                       ` Bastien
  0 siblings, 0 replies; 23+ messages in thread
From: Bastien @ 2020-06-03 15:30 UTC (permalink / raw)
  To: Mario Frasca; +Cc: emacs-orgmode

Mario Frasca <mario@anche.no> writes:

> yes, I received the ASSIGNMENT –GNU EMACS pdf last night, I'm now
> seeing how I print & sign it.  it might take some time.

Sure - probably a few weeks.  Let us know when this is done so that 
we can go ahead with applying your patches.

-- 
 Bastien


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:29                       ` Bastien
@ 2020-06-03 17:08                         ` Mario Frasca
  2020-06-03 22:15                         ` Mario Frasca
  1 sibling, 0 replies; 23+ messages in thread
From: Mario Frasca @ 2020-06-03 17:08 UTC (permalink / raw)
  To: Bastien; +Cc: emacs-orgmode

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

fixing things is not as difficult as following stiff rules. anyhow, 
again an attempt, with the terrible feeling I'm wasting my and your 
time.  (looks like I found a printer, for signing the paperwork.)


[-- Attachment #2: 0001-org-plot.el-implementing-new-feature-with-as-list.patch --]
[-- Type: text/x-patch, Size: 8755 bytes --]

From 3375ee101054dc087b40da119941e0433b63fea5 Mon Sep 17 00:00:00 2001
From: mfrasca <mario@anche.no>
Date: Tue, 2 Jun 2020 16:10:11 -0500
Subject: [PATCH] org-plot.el: implementing new feature "with-as-list"

* testing/lisp/test-org-plot.el (test-org-plot/zip-deps-with): new
file, testing the added functionality.
lisp/org-plot.el (org-plot/zip-deps-with): new internal function, used
in modified `org-plot/gnuplot'.
(org-plot/gnuplot): implemented the "with-as-list" feature.
doc/org-manual.org: describing the new feature.

This patch allows user specify as many `with' values as the columns in
`deps'.

User can indicate the order in which the `deps' columns are to be
plotted.  This is reflected in the order of the key (legend) elements,
and the z-order of the plotted elements.

User can specify as many different `with` as the columns to be
plotted, that is one for each `deps' column, in the same order as
`deps'.  If you leave the `with` away, you get "lines" for all columns
(this is hard-coded).  If you specify only one `with` value, that
value is used for all columns.  If you specify more `deps` than
`with`, the ones not specified will get "lines" (again hard-coded).
If you specify more `with` than `deps`, the exceeding elements are
ignored.

An example:

 #+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines)

A more complicated example:

 #+PLOT: set:"style line 2 lw 2 lc rgb 'forest-green'"
 #+PLOT: set:"style line 3 lw 2 lc rgb 'red'"
 #+PLOT: set:"style line 4 lw 1 lc rgb 'red'"
 #+PLOT: ind:1 deps:(3 6 4 7 10)
 #+PLOT: with:("points pt 3 lc rgb 'blue'" "points smooth csplines ls 2" "points pt 19 lc rgb 'blue'" "points smooth csplines ls 3" "points smooth csplines ls 4")

It does not work with histograms.
---
 doc/org-manual.org            |  7 ++--
 lisp/org-plot.el              | 66 +++++++++++++++++++++--------------
 testing/lisp/test-org-plot.el | 64 +++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+), 29 deletions(-)
 create mode 100644 testing/lisp/test-org-plot.el

diff --git a/doc/org-manual.org b/doc/org-manual.org
index 92252179b..40cb3c2f2 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -2845,9 +2845,10 @@ For more information and examples see the [[https://orgmode.org/worg/org-tutoria
 
 - =with= ::
 
-  Specify a =with= option to be inserted for every column being
-  plotted, e.g., =lines=, =points=, =boxes=, =impulses=.  Defaults to
-  =lines=.
+  Specify a =with= option to be inserted for the columns being
+  plotted, e.g., =lines=, =points=, =boxes=, =impulses=.  You can specify
+  a single value, to be applied to all columns, or a list of different
+  values, one for each column in the =deps= property.  Defaults to =lines=.
 
 - =file= ::
 
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index a23195d2a..073075037 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -179,6 +179,24 @@ and dependent variables."
 	  (setf back-edge "") (setf front-edge ""))))
     row-vals))
 
+(defun org-plot/zip-deps-with (num-cols ind deps with)
+  "Describe each column to be plotted as (col . with).
+Loops over DEPS and WITH in order to cons their elements.
+If the DEPS list of columns is not given, use all columns from 1
+to NUM-COLS, excluding IND.
+If WITH is given as a string, use the given value for all columns.
+If WITH is given as a list, and it's shorter than DEPS, expand it
+with the global default value."
+  (unless deps
+    (setq deps (remove ind (number-sequence 1 num-cols))))
+  (setq with
+	(if (listp with)
+	    (append with
+		    (make-list (max 0 (- (length deps) (length with)))
+			       "lines"))
+	  (make-list (length deps) with)))
+  (cl-mapcar #'cons deps with))
+
 (defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
   "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
 NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -239,32 +257,27 @@ manner suitable for prepending to a user-specified script."
 			   (or timefmt	; timefmt passed to gnuplot
 			       "%Y-%m-%d-%H:%M:%S") "\"")))
     (unless preface
-      (pcase type			; plot command
-	(`2d (dotimes (col num-cols)
-	       (unless (and (eq type '2d)
-			    (or (and ind (equal (1+ col) ind))
-				(and deps (not (member (1+ col) deps)))))
-		 (setf plot-lines
-		       (cons
-			(format plot-str data-file
-				(or (and ind (> ind 0)
-					 (not text-ind)
-					 (format "%d:" ind)) "")
-				(1+ col)
-				(if text-ind (format ":xticlabel(%d)" ind) "")
-				with
-				(or (nth col col-labels)
-				    (format "%d" (1+ col))))
-			plot-lines)))))
-	(`3d
-	 (setq plot-lines (list (format "'%s' matrix with %s title ''"
-					data-file with))))
-	(`grid
-	 (setq plot-lines (list (format "'%s' with %s title ''"
-					data-file with)))))
+      (setq plot-lines
+	    (pcase type			; plot command
+	      (`2d (cl-loop
+		    for (col . with)
+		    in (org-plot/zip-deps-with num-cols ind deps with)
+		    collect (format plot-str data-file
+				    (or (and ind (> ind 0)
+					     (not text-ind)
+					     (format "%d:" ind)) "")
+				    col
+				    (if text-ind (format ":xticlabel(%d)" ind) "")
+				    with
+				    (or (nth (1- col) col-labels)
+					(format "%d" col)))))
+	      (`3d (list (format "'%s' matrix with %s title ''"
+				 data-file with)))
+	      (`grid (list (format "'%s' with %s title ''"
+				   data-file with)))))
       (funcall ats
 	       (concat plot-cmd " " (mapconcat #'identity
-					       (reverse plot-lines)
+					       plot-lines
 					       ",\\\n    "))))
     script))
 
@@ -310,7 +323,8 @@ line directly before or after the table."
 				table data-file params)))
 		 (when y-labels (plist-put params :ylabels y-labels)))))
       ;; Check for timestamp ind column.
-      (let ((ind (1- (plist-get params :ind))))
+      (let ((ind (1- (plist-get params :ind)))
+	    (with (plist-get params :with)))
 	(when (and (>= ind 0) (eq '2d (plist-get params :plot-type)))
 	  (if (= (length
 		  (delq 0 (mapcar
@@ -320,7 +334,7 @@ line directly before or after the table."
 		 0)
 	      (plist-put params :timeind t)
 	    ;; Check for text ind column.
-	    (if (or (string= (plist-get params :with) "hist")
+	    (if (or (equal with "hist")
 		    (> (length
 			(delq 0 (mapcar
 				 (lambda (el)
diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el
new file mode 100644
index 000000000..2bf153400
--- /dev/null
+++ b/testing/lisp/test-org-plot.el
@@ -0,0 +1,64 @@
+;;; test-org-plot.el --- Tests for Org Plot library    -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020  Mario Frasca
+
+;; Author: Mario Frasca <mario at anche dot no>
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'org-test)
+(require 'org-plot)
+
+\f
+;; General auxiliaries
+
+(ert-deftest test-org-plot/zip-deps-with ()
+  "Test `org-plot/zip-deps-with' specifications."
+  ;; no deps, no with. defaults to all except ind, and "lines"
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil nil)
+	  '((2 . "lines") (3 . "lines"))))
+  ;; no deps, single with. defaults to all except ind, and repeated with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil "hist")
+	  '((2 . "hist") (3 . "hist"))))
+  ;; no deps, explicit with
+  (should
+   (equal (org-plot/zip-deps-with 3 1 nil '("points" "hist"))
+	  '((2 . "points") (3 . "hist"))))
+  ;; explicit with, same length as deps
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(2 4) '("points" "hist"))
+	  '((2 . "points") (4 . "hist"))))
+  ;; same as above, but different order
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; if with exceeds deps, trailing elements are discarded
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist" "lines"))
+	  '((4 . "points") (2 . "hist"))))
+  ;; fills in with "lines"
+  (should
+   (equal (org-plot/zip-deps-with 5 1 '(4 2 3) '("points"))
+	  '((4 . "points") (2 . "lines") (3 . "lines")))))
+
+
+\f
+(provide 'test-org-plot)
+;;; test-org-plot.el end here
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: `with` as a list.
  2020-06-03 15:29                       ` Bastien
  2020-06-03 17:08                         ` Mario Frasca
@ 2020-06-03 22:15                         ` Mario Frasca
  1 sibling, 0 replies; 23+ messages in thread
From: Mario Frasca @ 2020-06-03 22:15 UTC (permalink / raw)
  To: Bastien; +Cc: emacs-orgmode

On 03/06/2020 10:29, Bastien wrote:
> The few lines above is what we called the "changelog".  It should be
> the first part of the commit message -- after which you can add more
> free-form context and explanations, if needed.

this "Changelog", and I'm sure I am the stiffy one, isn't clear from the 
description.  browsing through the other contributions, I recognize this 
structure:

the "Changelog" is the second block, (preferably) without any empty 
lines.  the next empty line will end the "Changelog" and start the less 
formal comments. (unsure about this).

changes are grouped by file, each changed file is introduced by a line 
starting with an asterisk '*', and the complete path of the file.  then 
follows the function affected, in single parentheses, a colon ':', and 
the description of the change.  if the change is relative to 
documentation, the parentheses include title of the affected paragraph.  
finally the description, formatted as per your html page.

if the next change is in the same file, you skip the leading '*' and 
file name and the line should start with the parenthesized affected object.

----------------------------

for example (two files, two different changes --- code and doc):

* lisp/org.el (org-read-date-analyze): Add support for HHhMM time
input, in similar way as for am/pm times.
* doc/org-manual.org (The date/time prompt): Add example to illustrate
the feature.

----------------------------

other example (two affected files, single description --- code):

* testing/lisp/test-ob-tangle.el (ob-tangle/jump-to-org):
* testing/lisp/test-org-attach.el (test-org-attach/dir): Rig
org-file-apps so that temporary files are visited inside Emacs.

----------------------------

(one file, two different changes --- doc):

* doc/org-manual.org (Capturing column view): Replace stale binding
with mention of org-dynamic-block-insert-dblock, and refer to
org-columns-insert-dblock rather than its obsolete variant.
(The clock table): Prune references to stale binding, rewrite
org-dynamic-block-insert-dblock key sequence in a clearer manner, and
add a dedicated entry for org-clock-report.

----------------------------

slightly sloppy example (two files, single description, not clear what's 
affected):

* lisp/org-clock.el:
* lisp/org-colview.el: Autoload call to org-dynamic-block-define.

----------------------------

etc/ORG-NEWS is an exception, and should be mentioned as first.
are empty lines acceptable?  or will your parser fail to understand?

* etc/ORG-NEWS: Announce the change.

* lisp/org-keys.el (org-mode-map): Rebind C-j to a command emulating
`electric-newline-and-maybe-indent'.

* lisp/org.el (org-cdlatex-environment-indent): Stop using the now
obsolete function.
(org--newline): New helper function.
(org-return): Use it to transparently handle `electric-indent-mode'.
(org-return-and-maybe-indent): New command to emulate
`electric-newline-and-maybe-indent' while taking care of Org special
cases (tables, links, timestamps).

----------------------------




^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2020-06-03 22:16 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-22 16:07 `with` as a list Mario Frasca
2020-05-28 13:34 ` [PATCH] [FEATURE] " Mario Frasca
2020-05-30  6:22 ` Kyle Meyer
2020-05-30 14:23   ` Mario Frasca
2020-05-30 14:38     ` Mario Frasca
2020-05-30 20:23     ` Kyle Meyer
2020-05-30 21:29       ` Mario Frasca
2020-05-31 20:18         ` Mario Frasca
2020-06-01  0:19           ` Kyle Meyer
2020-06-01  1:47             ` Mario Frasca
2020-06-01  2:31               ` Kyle Meyer
2020-06-03 15:09                 ` Mario Frasca
2020-06-03 15:13                   ` Bastien
2020-06-03 15:18                     ` Mario Frasca
2020-06-03 15:29                       ` Bastien
2020-06-03 17:08                         ` Mario Frasca
2020-06-03 22:15                         ` Mario Frasca
2020-06-03 15:25                     ` Mario Frasca
2020-06-03 15:30                       ` Bastien
2020-05-30 16:01   ` Mario Frasca
2020-05-30 20:25     ` Kyle Meyer
2020-05-30 21:36       ` Mario Frasca
2020-05-31  0:36         ` Kyle Meyer

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).