From: Alan Third <alan@idiocy.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Image transformations
Date: Mon, 17 Jun 2019 22:13:32 +0100 [thread overview]
Message-ID: <20190617211332.GA55597@breton.holly.idiocy.org> (raw)
In-Reply-To: <83d0jdv68i.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1797 bytes --]
On Sun, Jun 16, 2019 at 07:34:53PM +0300, Eli Zaretskii wrote:
> > Date: Sun, 16 Jun 2019 16:22:59 +0100
> > From: Alan Third <alan@idiocy.org>
> > Cc: emacs-devel@gnu.org
> >
> > In another part of this thread you pointed out that crop and image
> > slices are doing basically the same thing. I hadn’t realised that.
> > Given that that’s the case, I think we should just get rid of the crop
> > function.
>
> I agree, but please make sure the slices are indeed a 100% replacement
> (I cannot yet do that because I don't have a working :crop support to
> try it).
As far as I can tell they are perhaps a 90% replacement, the only real
difference is that the interactive keybinds from image.el don’t work
(r for rotate, + for scale up, etc.). They can probably be made to
work, but to be honest I’m not sure it matters. If someone is cropping
an image I can’t think of any use cases where they’d want to then
provide the user the ability to play with that image interactively.
Perhaps I’m just not imaginative enough.
> > + [x] [m11 m12 tx] [x']
> > + [y] X [m21 m22 ty] = [y']
> > + [1] [ 0 0 1] [1 ]
>
> Either we use a column vector, and it should be on the right of the
> matrix; or we use a row vector, in which case it should be on the
> left. Which of these is the case?
It is the former. I fixed it before pushing.
> > diff --git a/test/manual/image-transforms-tests.el b/test/manual/image-transforms-tests.el
> > new file mode 100644
> > index 0000000000..d601b9397e
> > --- /dev/null
> > +++ b/test/manual/image-transforms-tests.el
>
> This is great, but Windows only supports displaying images from files,
> so we will have to write these specs to files, and then display them.
That’s unfortunate. Patch attached.
--
Alan Third
[-- Attachment #2: 0001-Move-inline-SVG-images-to-separate-files.patch --]
[-- Type: text/plain, Size: 16821 bytes --]
From a9b7f48e7a1b4c1541226467919e263c0b3c8cea Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
Date: Mon, 17 Jun 2019 22:07:44 +0100
Subject: [PATCH] Move inline SVG images to separate files
* test/data/image/transform-crop-base.svg: New file.
* test/data/image/transform-crop-bottom-right.svg: New file.
* test/data/image/transform-crop-middle.svg: New file.
* test/data/image/transform-crop-top-left.svg: New file.
* test/data/image/transform-rotation-down.svg: New file.
* test/data/image/transform-rotation-left.svg: New file.
* test/data/image/transform-rotation-right.svg: New file.
* test/data/image/transform-rotation-up.svg: New file.
* test/data/image/transform-scaling-base.svg: New file.
* test/data/image/transform-scaling-large.svg: New file.
* test/data/image/transform-scaling-rotation-base.svg: New file.
* test/data/image/transform-scaling-rotation-x0.5-180.svg: New file.
* test/data/image/transform-scaling-rotation-x2--90.svg: New file.
* test/data/image/transform-scaling-rotation-x2-90.svg: New file.
* test/data/image/transform-scaling-small.svg: New file.
* test/manual/image-transforms-tests.el (test-rotation):
(test-cropping):
(test-transforms): Remove inline SVG image data and replace with new
image files.
(insert-test): Construct paths to new files and use them.
---
test/data/image/transform-crop-base.svg | 9 ++
.../image/transform-crop-bottom-right.svg | 4 +
test/data/image/transform-crop-middle.svg | 6 +
test/data/image/transform-crop-top-left.svg | 3 +
test/data/image/transform-rotation-down.svg | 3 +
test/data/image/transform-rotation-left.svg | 3 +
test/data/image/transform-rotation-right.svg | 3 +
test/data/image/transform-rotation-up.svg | 3 +
test/data/image/transform-scaling-base.svg | 6 +
test/data/image/transform-scaling-large.svg | 8 ++
.../image/transform-scaling-rotation-base.svg | 6 +
.../transform-scaling-rotation-x0.5-180.svg | 6 +
.../transform-scaling-rotation-x2--90.svg | 6 +
.../transform-scaling-rotation-x2-90.svg | 6 +
test/data/image/transform-scaling-small.svg | 6 +
test/manual/image-transforms-tests.el | 108 +++++-------------
16 files changed, 106 insertions(+), 80 deletions(-)
create mode 100644 test/data/image/transform-crop-base.svg
create mode 100644 test/data/image/transform-crop-bottom-right.svg
create mode 100644 test/data/image/transform-crop-middle.svg
create mode 100644 test/data/image/transform-crop-top-left.svg
create mode 100644 test/data/image/transform-rotation-down.svg
create mode 100644 test/data/image/transform-rotation-left.svg
create mode 100644 test/data/image/transform-rotation-right.svg
create mode 100644 test/data/image/transform-rotation-up.svg
create mode 100644 test/data/image/transform-scaling-base.svg
create mode 100644 test/data/image/transform-scaling-large.svg
create mode 100644 test/data/image/transform-scaling-rotation-base.svg
create mode 100644 test/data/image/transform-scaling-rotation-x0.5-180.svg
create mode 100644 test/data/image/transform-scaling-rotation-x2--90.svg
create mode 100644 test/data/image/transform-scaling-rotation-x2-90.svg
create mode 100644 test/data/image/transform-scaling-small.svg
diff --git a/test/data/image/transform-crop-base.svg b/test/data/image/transform-crop-base.svg
new file mode 100644
index 0000000000..188f47ac29
--- /dev/null
+++ b/test/data/image/transform-crop-base.svg
@@ -0,0 +1,9 @@
+<svg height="30" width="30">
+ <rect x="0" y="0" width="10" height="10"/>
+ <rect x="10" y="10" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <line x1="10" y1="10" x2="20" y2="20" style="stroke:#000"/>
+ <line x1="20" y1="10" x2="10" y2="20" style="stroke:#000"/>
+ <rect x="20" y="20" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+</svg>
diff --git a/test/data/image/transform-crop-bottom-right.svg b/test/data/image/transform-crop-bottom-right.svg
new file mode 100644
index 0000000000..74e09f03da
--- /dev/null
+++ b/test/data/image/transform-crop-bottom-right.svg
@@ -0,0 +1,4 @@
+<svg height="10" width="10">
+ <rect x="0" y="0" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+</svg>
diff --git a/test/data/image/transform-crop-middle.svg b/test/data/image/transform-crop-middle.svg
new file mode 100644
index 0000000000..e707df1e55
--- /dev/null
+++ b/test/data/image/transform-crop-middle.svg
@@ -0,0 +1,6 @@
+<svg height="10" width="10">
+ <rect x="0" y="0" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <line x1="0" y1="0" x2="10" y2="10" style="stroke:#000"/>
+ <line x1="10" y1="0" x2="0" y2="10" style="stroke:#000"/>
+</svg>
diff --git a/test/data/image/transform-crop-top-left.svg b/test/data/image/transform-crop-top-left.svg
new file mode 100644
index 0000000000..0f62f89a05
--- /dev/null
+++ b/test/data/image/transform-crop-top-left.svg
@@ -0,0 +1,3 @@
+<svg height="10" width="10">
+ <rect x="0" y="0" width="10" height="10"/>
+</svg>
diff --git a/test/data/image/transform-rotation-down.svg b/test/data/image/transform-rotation-down.svg
new file mode 100644
index 0000000000..67f3e11e64
--- /dev/null
+++ b/test/data/image/transform-rotation-down.svg
@@ -0,0 +1,3 @@
+<svg height="9" width="9">
+ <polygon points="0,0 4,8 8,0"/>
+</svg>
diff --git a/test/data/image/transform-rotation-left.svg b/test/data/image/transform-rotation-left.svg
new file mode 100644
index 0000000000..33cfab6264
--- /dev/null
+++ b/test/data/image/transform-rotation-left.svg
@@ -0,0 +1,3 @@
+<svg height="9" width="9">
+ <polygon points="8,0 0,4 8,8"/>
+</svg>
diff --git a/test/data/image/transform-rotation-right.svg b/test/data/image/transform-rotation-right.svg
new file mode 100644
index 0000000000..60f247cf42
--- /dev/null
+++ b/test/data/image/transform-rotation-right.svg
@@ -0,0 +1,3 @@
+<svg height="9" width="9">
+ <polygon points="0,0 8,4 0,8"/>
+</svg>
diff --git a/test/data/image/transform-rotation-up.svg b/test/data/image/transform-rotation-up.svg
new file mode 100644
index 0000000000..57d545a99d
--- /dev/null
+++ b/test/data/image/transform-rotation-up.svg
@@ -0,0 +1,3 @@
+<svg height="9" width="9">
+ <polygon points="0,8 4,0 8,8"/>
+</svg>
diff --git a/test/data/image/transform-scaling-base.svg b/test/data/image/transform-scaling-base.svg
new file mode 100644
index 0000000000..e707df1e55
--- /dev/null
+++ b/test/data/image/transform-scaling-base.svg
@@ -0,0 +1,6 @@
+<svg height="10" width="10">
+ <rect x="0" y="0" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <line x1="0" y1="0" x2="10" y2="10" style="stroke:#000"/>
+ <line x1="10" y1="0" x2="0" y2="10" style="stroke:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-large.svg b/test/data/image/transform-scaling-large.svg
new file mode 100644
index 0000000000..0803f073dc
--- /dev/null
+++ b/test/data/image/transform-scaling-large.svg
@@ -0,0 +1,8 @@
+<svg height="20" width="20">
+ <rect x="0" y="0" width="20" height="20"
+ style="fill:none;stroke-width:2;stroke:#000"/>
+ <line x1="0" y1="0" x2="20" y2="20"
+ style="stroke-width:2;stroke:#000"/>
+ <line x1="20" y1="0" x2="0" y2="20"
+ style="stroke-width:2;stroke:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-rotation-base.svg b/test/data/image/transform-scaling-rotation-base.svg
new file mode 100644
index 0000000000..046a0523a2
--- /dev/null
+++ b/test/data/image/transform-scaling-rotation-base.svg
@@ -0,0 +1,6 @@
+<svg height="20" width="20">
+ <rect x="0" y="0" width="20" height="20"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <rect x="0" y="0" width="10" height="10"
+ style="fill:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-rotation-x0.5-180.svg b/test/data/image/transform-scaling-rotation-x0.5-180.svg
new file mode 100644
index 0000000000..8bbbb5ce03
--- /dev/null
+++ b/test/data/image/transform-scaling-rotation-x0.5-180.svg
@@ -0,0 +1,6 @@
+<svg height="10" width="10">
+ <rect x="0" y="0" width="10" height="10"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <rect x="5" y="5" width="5" height="5"
+ style="fill:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-rotation-x2--90.svg b/test/data/image/transform-scaling-rotation-x2--90.svg
new file mode 100644
index 0000000000..9c62df53e3
--- /dev/null
+++ b/test/data/image/transform-scaling-rotation-x2--90.svg
@@ -0,0 +1,6 @@
+<svg height="40" width="40">
+ <rect x="0" y="0" width="40" height="40"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <rect x="0" y="20" width="20" height="20"
+ style="fill:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-rotation-x2-90.svg b/test/data/image/transform-scaling-rotation-x2-90.svg
new file mode 100644
index 0000000000..189d0b1a15
--- /dev/null
+++ b/test/data/image/transform-scaling-rotation-x2-90.svg
@@ -0,0 +1,6 @@
+<svg height="40" width="40">
+ <rect x="0" y="0" width="40" height="40"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <rect x="20" y="0" width="20" height="20"
+ style="fill:#000"/>
+</svg>
diff --git a/test/data/image/transform-scaling-small.svg b/test/data/image/transform-scaling-small.svg
new file mode 100644
index 0000000000..2e51cb2901
--- /dev/null
+++ b/test/data/image/transform-scaling-small.svg
@@ -0,0 +1,6 @@
+<svg height="5" width="5">
+ <rect x="0" y="0" width="4" height="4"
+ style="fill:none;stroke-width:1;stroke:#000"/>
+ <line x1="0" y1="0" x2="4" y2="4" style="stroke:#000"/>
+ <line x1="4" y1="0" x2="0" y2="4" style="stroke:#000"/>
+</svg>
diff --git a/test/manual/image-transforms-tests.el b/test/manual/image-transforms-tests.el
index d601b9397e..739df2f2ac 100644
--- a/test/manual/image-transforms-tests.el
+++ b/test/manual/image-transforms-tests.el
@@ -28,10 +28,10 @@
;;; Code:
(defun test-rotation ()
- (let ((up "<svg height='9' width='9'><polygon points='0,8 4,0 8,8'/></svg>")
- (down "<svg height='9' width='9'><polygon points='0,0 4,8 8,0'/></svg>")
- (left "<svg height='9' width='9'><polygon points='8,0 0,4 8,8'/></svg>")
- (right "<svg height='9' width='9'><polygon points='0,0 8,4 0,8'/></svg>"))
+ (let ((up "transform-rotation-up.svg")
+ (down "transform-rotation-down.svg")
+ (left "transform-rotation-left.svg")
+ (right "transform-rotation-right.svg"))
(insert-header "Test Rotation: rotating an image")
(insert-test "0" up up '(:rotation 0))
(insert-test "360" up up '(:rotation 360))
@@ -45,28 +45,10 @@ test-rotation
(insert "\n\n"))
(defun test-cropping ()
- (let ((image "<svg height='30' width='30'>
- <rect x='0' y='0' width='10' height='10'/>
- <rect x='10' y='10' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='10' y1='10' x2='20' y2='20' style='stroke:#000'/>
- <line x1='20' y1='10' x2='10' y2='20' style='stroke:#000'/>
- <rect x='20' y='20' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- </svg>")
- (top-left "<svg height='10' width='10'>
- <rect x='0' y='0' width='10' height='10'/>
- </svg>")
- (middle "<svg height='10' width='10'>
- <rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='10' y2='10' style='stroke:#000'/>
- <line x1='10' y1='0' x2='0' y2='10' style='stroke:#000'/>
- </svg>")
- (bottom-right "<svg height='10' width='10'>
- <rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- </svg>"))
+ (let ((image "transform-crop-base.svg")
+ (top-left "transform-crop-top-left.svg")
+ (middle "transform-crop-middle.svg")
+ (bottom-right "transform-crop-bottom-right.svg"))
(insert-header "Test Crop: cropping an image")
(insert-test "all params" top-left image '(:crop (10 10 0 0)))
(insert-test "width/height only" middle image '(:crop (10 10)))
@@ -75,26 +57,9 @@ test-cropping
(insert "\n\n"))
(defun test-scaling ()
- (let ((image "<svg height='10' width='10'>
- <rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='10' y2='10' style='stroke:#000'/>
- <line x1='10' y1='0' x2='0' y2='10' style='stroke:#000'/>
- </svg>")
- (large "<svg height='20' width='20'>
- <rect x='0' y='0' width='20' height='20'
- style='fill:none;stroke-width:2;stroke:#000'/>
- <line x1='0' y1='0' x2='20' y2='20'
- style='stroke-width:2;stroke:#000'/>
- <line x1='20' y1='0' x2='0' y2='20'
- style='stroke-width:2;stroke:#000'/>
- </svg>")
- (small "<svg height='5' width='5'>
- <rect x='0' y='0' width='4' height='4'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='4' y2='4' style='stroke:#000'/>
- <line x1='4' y1='0' x2='0' y2='4' style='stroke:#000'/>
- </svg>"))
+ (let ((image "transform-scaling-base.svg")
+ (large "transform-scaling-large.svg")
+ (small "transform-scaling-small.svg"))
(insert-header "Test Scaling: resize an image (pixelization may occur)")
(insert-test "1x" image image '(:scale 1))
(insert-test "2x" large image '(:scale 2))
@@ -105,30 +70,10 @@ test-scaling
(insert "\n\n"))
(defun test-scaling-rotation ()
- (let ((image "<svg height='20' width='20'>
- <rect x='0' y='0' width='20' height='20'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <rect x='0' y='0' width='10' height='10'
- style='fill:#000'/>
- </svg>")
- (x2-90 "<svg height='40' width='40'>
- <rect x='0' y='0' width='40' height='40'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <rect x='20' y='0' width='20' height='20'
- style='fill:#000'/>
- </svg>")
- (x2--90 "<svg height='40' width='40'>
- <rect x='0' y='0' width='40' height='40'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <rect x='0' y='20' width='20' height='20'
- style='fill:#000'/>
- </svg>")
- (x0.5-180 "<svg height='10' width='10'>
- <rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <rect x='5' y='5' width='5' height='5'
- style='fill:#000'/>
- </svg>"))
+ (let ((image "transform-scaling-rotation-base.svg")
+ (x2-90 "transform-scaling-rotation-x2-90.svg")
+ (x2--90 "transform-scaling-rotation-x2--90.svg")
+ (x0.5-180 "transform-scaling-rotation-x0.5-180.svg"))
(insert-header "Test Scaling and Rotation: resize and rotate an image (pixelization may occur)")
(insert-test "1x, 0 degrees" image image '(:scale 1 :rotation 0))
(insert-test "2x, 90 degrees" x2-90 image '(:scale 2 :rotation 90.0))
@@ -149,16 +94,19 @@ insert-header
(insert "\n"))
(defun insert-test (description expected image params)
- (indent-to 2)
- (insert description)
- (indent-to 40)
- (insert-image (create-image expected 'svg t))
- (indent-to 50)
- (insert-image (apply #'create-image image 'svg t params))
- (when (fboundp #'imagemagick-types)
- (indent-to 60)
- (insert-image (apply #'create-image image 'imagemagick t params)))
- (insert "\n"))
+ (let* ((image-dir (concat source-directory "test/data/image"))
+ (expected (expand-file-name expected image-dir))
+ (image (expand-file-name image image-dir)))
+ (indent-to 2)
+ (insert description)
+ (indent-to 40)
+ (insert-image (create-image expected 'svg nil))
+ (indent-to 50)
+ (insert-image (apply #'create-image image 'svg nil params))
+ (when (fboundp #'imagemagick-types)
+ (indent-to 60)
+ (insert-image (apply #'create-image image 'imagemagick nil params)))
+ (insert "\n")))
(defun test-transforms ()
(interactive)
--
2.21.0
next prev parent reply other threads:[~2019-06-17 21:13 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-11 5:10 Image transformations Eli Zaretskii
2019-06-11 20:02 ` Alan Third
2019-06-12 15:30 ` Eli Zaretskii
2019-06-12 22:07 ` Alan Third
2019-06-12 22:15 ` Alan Third
2019-06-13 4:16 ` Alp Aker
2019-06-13 5:41 ` Eli Zaretskii
2019-06-13 9:19 ` Alp Aker
2019-06-13 13:05 ` Eli Zaretskii
2019-06-13 15:57 ` Alp Aker
2019-06-13 16:20 ` Eli Zaretskii
2019-06-13 19:00 ` Richard Copley
2019-06-13 19:29 ` Eli Zaretskii
2019-06-14 10:45 ` Alp Aker
2019-06-14 10:55 ` Richard Copley
2019-06-14 11:45 ` YAMAMOTO Mitsuharu
2019-06-14 11:59 ` Alp Aker
2019-06-13 16:12 ` Alan Third
2019-06-13 17:05 ` Eli Zaretskii
2019-06-13 19:35 ` Richard Copley
2019-06-13 5:48 ` Eli Zaretskii
2019-06-13 16:58 ` Alan Third
2019-06-13 17:11 ` Eli Zaretskii
2019-06-13 19:27 ` Alan Third
2019-06-13 19:39 ` Alan Third
2019-06-13 19:47 ` Eli Zaretskii
2019-06-13 22:26 ` Alan Third
2019-06-14 7:05 ` Eli Zaretskii
2019-06-14 9:57 ` Stefan Monnier
2019-06-14 10:57 ` Eli Zaretskii
2019-06-14 11:21 ` Richard Copley
2019-06-14 12:06 ` Eli Zaretskii
2019-06-14 12:49 ` Richard Copley
2019-06-14 14:16 ` Yuri Khan
2019-06-14 14:43 ` Eli Zaretskii
2019-06-14 15:55 ` Richard Copley
2019-06-15 11:00 ` Alan Third
2019-06-15 11:34 ` Eli Zaretskii
2019-06-15 10:42 ` Alan Third
2019-06-15 11:31 ` Eli Zaretskii
2019-06-16 15:22 ` Alan Third
2019-06-16 16:34 ` Eli Zaretskii
2019-06-17 21:13 ` Alan Third [this message]
2019-06-19 17:56 ` Eli Zaretskii
2019-06-24 17:54 ` Eli Zaretskii
2019-06-24 19:50 ` Stefan Monnier
2019-06-25 2:33 ` Eli Zaretskii
2019-06-25 3:28 ` Stefan Monnier
2019-06-25 4:34 ` Eli Zaretskii
2019-06-25 14:43 ` Stefan Monnier
2019-06-25 15:35 ` Eli Zaretskii
2019-06-26 0:28 ` YAMAMOTO Mitsuharu
2019-06-26 15:34 ` Eli Zaretskii
2019-06-27 3:37 ` YAMAMOTO Mitsuharu
2019-06-27 13:13 ` Eli Zaretskii
2019-06-25 18:33 ` Alan Third
2019-06-25 18:57 ` Eli Zaretskii
2019-06-27 13:59 ` Eli Zaretskii
2019-06-28 18:36 ` Alan Third
2019-06-28 19:50 ` Eli Zaretskii
2019-06-29 11:55 ` Eli Zaretskii
2019-06-29 19:51 ` Alan Third
2019-06-29 19:49 ` Alan Third
2019-06-29 19:53 ` Lars Ingebrigtsen
2019-06-30 14:38 ` Alan Third
2019-06-30 15:24 ` Lars Ingebrigtsen
2019-07-25 19:40 ` Lars Ingebrigtsen
2019-07-26 6:10 ` Eli Zaretskii
2019-07-26 6:46 ` Lars Ingebrigtsen
2019-07-26 8:06 ` Eli Zaretskii
2019-07-26 8:23 ` Lars Ingebrigtsen
2019-07-26 8:24 ` Lars Ingebrigtsen
2019-07-26 8:33 ` Eli Zaretskii
2019-07-26 8:58 ` Lars Ingebrigtsen
2019-07-26 9:13 ` Eli Zaretskii
2019-07-26 10:23 ` Lars Ingebrigtsen
2019-07-26 14:08 ` Stefan Monnier
2019-07-26 8:32 ` Eli Zaretskii
2019-06-29 21:05 ` Stefan Monnier
2019-06-30 15:12 ` Eli Zaretskii
2019-06-30 19:10 ` Alan Third
2019-07-01 14:55 ` Eli Zaretskii
2019-06-18 11:01 ` Tak Kunihiro
2019-06-13 17:41 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190617211332.GA55597@breton.holly.idiocy.org \
--to=alan@idiocy.org \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.