unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* new package: sketch-mode
@ 2021-08-23 10:17 dalanicolai
  2021-08-23 13:31 ` Lars Ingebrigtsen
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: dalanicolai @ 2021-08-23 10:17 UTC (permalink / raw)
  To: emacs-devel, larsi

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

I am writing primarily to notify you about a package, sketch-mode, I am
working on. It provides a handy interface to quickly draw svg's using, well
Emacs, but in particular svg.el and transient.el.
It is handy in particular for creating svg sketches really fast, while of
course, it has the advantage over other svg drawing applications that it is
very hackable in your favorite langauge :)

Although, it is very usable already, the work, especially for calling it a
package, is not (nearly) finished yet (for example, I am working on using
svg groups, for layers and snippets, I am not sure about how to best design
the interface and of course it needs (better) documentation). But because
while working on it, enhancements and new features come to mind all the
time, I think it would probably take "too long" to postpone this mail until
the package has been finished (I have postponed this mail already for a
while now).

Anyway, as I have never worked on a "new Emacs package" before, I do not
know how things work exactly. In any case, I hope this message will prevent
duplication of work. And, maybe if someone likes the package, then I wonder
if you already have some expert feedback or even contributions (I don't
expect anything in particular, but better mention it to early than too
late).

I am especially targeting Lars Magne Ingebrigtsen, because I have found
that he wrote svg.el  & dom.el (still also my primary goal is just to
notify you). The package already contains some extensions for svg.el,
namely a marker definition to enable drawing arrows, and a group definition
to 'add support' for svg groups (in the 'groups' implemntation branch). I
will be working on other features in different git branches (there is a
todo list at the start of sketch-mode.el). Some more info about motivation
can be found in the sketch-mode github wiki.

Cheers,
Daniel

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

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

* Re: new package: sketch-mode
  2021-08-23 10:17 new package: sketch-mode dalanicolai
@ 2021-08-23 13:31 ` Lars Ingebrigtsen
  2021-08-24 21:57 ` Stefan Monnier
  2021-08-30  6:00 ` Qiantan Hong
  2 siblings, 0 replies; 11+ messages in thread
From: Lars Ingebrigtsen @ 2021-08-23 13:31 UTC (permalink / raw)
  To: dalanicolai; +Cc: emacs-devel

dalanicolai <dalanicolai@gmail.com> writes:

> It is handy in particular for creating svg sketches really fast, while of course,
> it has the advantage over other svg drawing applications that it is very
> hackable in your favorite langauge :)

Sounds cool!

> The package already contains some extensions for svg.el, namely a
> marker definition to enable drawing arrows, and a group definition to
> 'add support' for svg groups (in the 'groups' implemntation branch).

Please do consider submitting new functionality for svg.el as separate
patches (if they are generally useful).

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no



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

* Re: new package: sketch-mode
  2021-08-23 10:17 new package: sketch-mode dalanicolai
  2021-08-23 13:31 ` Lars Ingebrigtsen
@ 2021-08-24 21:57 ` Stefan Monnier
  2021-08-27 10:06   ` dalanicolai
  2021-08-30  6:00 ` Qiantan Hong
  2 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2021-08-24 21:57 UTC (permalink / raw)
  To: dalanicolai; +Cc: emacs-devel, larsi

dalanicolai [2021-08-23 12:17:18] wrote:
> I am writing primarily to notify you about a package, sketch-mode, I am
> working on. It provides a handy interface to quickly draw svg's using, well
> Emacs, but in particular svg.el and transient.el.
> It is handy in particular for creating svg sketches really fast, while of
> course, it has the advantage over other svg drawing applications that it is
> very hackable in your favorite langauge :)
>
> Although, it is very usable already, the work, especially for calling it a
> package, is not (nearly) finished yet (for example, I am working on using
> svg groups, for layers and snippets, I am not sure about how to best design
> the interface and of course it needs (better) documentation). But because
> while working on it, enhancements and new features come to mind all the
> time, I think it would probably take "too long" to postpone this mail until
> the package has been finished (I have postponed this mail already for a
> while now).

I'd welcome this in GNU ELPA (it doesn't need to be "finished", since
for most packages there's always something else that still needs to be
done).

For that we'd need you to sign some copyright paperwork (unless you've
signed it already, of course, tho I can't find your name in there).
If that's OK with you, then please fill the form below and send it to
the FSF as instructed so they can send you the relevant paperwork
to sign.


        Stefan


Please email the following information to assign@gnu.org, and we
will send you the assignment form for your past and future changes.

Please use your full legal name (in ASCII characters) as the subject
line of the message.
----------------------------------------------------------------------
REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES

[What is the name of the program or package you're contributing to?]
Emacs

[Did you copy any files or text written by someone else in these changes?
Even if that material is free software, we need to know about it.]


[Do you have an employer who might have a basis to claim to own
your changes?  Do you attend a school which might make such a claim?]


[For the copyright registration, what country are you a citizen of?]


[What year were you born?]


[Please write your email address here.]


[Please write your postal address here.]





[Which files have you changed so far, and which new files have you written
so far?]




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

* Re: new package: sketch-mode
  2021-08-24 21:57 ` Stefan Monnier
@ 2021-08-27 10:06   ` dalanicolai
  2021-08-30 22:45     ` Stefan Monnier
  0 siblings, 1 reply; 11+ messages in thread
From: dalanicolai @ 2021-08-27 10:06 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: larsi, emacs-devel

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

Cool! Thanks. Yeah, for sure I am happy with that. So I will fill in the
paperform request.
It might still take some work/time to prepare the package for ELPA though.


On Tue, 24 Aug 2021 at 23:57, Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> dalanicolai [2021-08-23 12:17:18] wrote:
> > I am writing primarily to notify you about a package, sketch-mode, I am
> > working on. It provides a handy interface to quickly draw svg's using,
> well
> > Emacs, but in particular svg.el and transient.el.
> > It is handy in particular for creating svg sketches really fast, while of
> > course, it has the advantage over other svg drawing applications that it
> is
> > very hackable in your favorite langauge :)
> >
> > Although, it is very usable already, the work, especially for calling it
> a
> > package, is not (nearly) finished yet (for example, I am working on using
> > svg groups, for layers and snippets, I am not sure about how to best
> design
> > the interface and of course it needs (better) documentation). But because
> > while working on it, enhancements and new features come to mind all the
> > time, I think it would probably take "too long" to postpone this mail
> until
> > the package has been finished (I have postponed this mail already for a
> > while now).
>
> I'd welcome this in GNU ELPA (it doesn't need to be "finished", since
> for most packages there's always something else that still needs to be
> done).
>
> For that we'd need you to sign some copyright paperwork (unless you've
> signed it already, of course, tho I can't find your name in there).
> If that's OK with you, then please fill the form below and send it to
> the FSF as instructed so they can send you the relevant paperwork
> to sign.
>
>
>         Stefan
>
>
> Please email the following information to assign@gnu.org, and we
> will send you the assignment form for your past and future changes.
>
> Please use your full legal name (in ASCII characters) as the subject
> line of the message.
> ----------------------------------------------------------------------
> REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
>
> [What is the name of the program or package you're contributing to?]
> Emacs
>
> [Did you copy any files or text written by someone else in these changes?
> Even if that material is free software, we need to know about it.]
>
>
> [Do you have an employer who might have a basis to claim to own
> your changes?  Do you attend a school which might make such a claim?]
>
>
> [For the copyright registration, what country are you a citizen of?]
>
>
> [What year were you born?]
>
>
> [Please write your email address here.]
>
>
> [Please write your postal address here.]
>
>
>
>
>
> [Which files have you changed so far, and which new files have you written
> so far?]
>
>

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

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

* Re: new package: sketch-mode
  2021-08-23 10:17 new package: sketch-mode dalanicolai
  2021-08-23 13:31 ` Lars Ingebrigtsen
  2021-08-24 21:57 ` Stefan Monnier
@ 2021-08-30  6:00 ` Qiantan Hong
  2021-08-30 14:20   ` dalanicolai
  2 siblings, 1 reply; 11+ messages in thread
From: Qiantan Hong @ 2021-08-30  6:00 UTC (permalink / raw)
  To: dalanicolai; +Cc: larsi@gnus.org, Emacs Devel

> I am writing primarily to notify you about a package, sketch-mode, I am working on. It provides a handy interface to quickly draw svg's using, well Emacs, but in particular svg.el and transient.el.
> It is handy in particular for creating svg sketches really fast, while of course, it has the advantage over other svg drawing applications that it is very hackable in your favorite langauge :)

This looks very exciting! Is the code available somewhere?

One important question I have is, do you implement it by putting an SVG overlay/property over a single dummy character,
or do you put it on a range of text that *semantically* correspond the SVG being displayed?
I strongly recommend the latter model because it makes it possible to blend in Emacs,
e.g. you can get cursor movement, selection, copy/yank etc relatively easily.
Just for a started, suppose underlying text is structured as one word correspond to and SVG element,
then one can use forward-word backward-word to move between elements.
And there’s much more to explore using other existing structural editing command.
On the other hand, overlaying over a single dummy character just sounds like inventing
a different, isolated editor emulated in Emacs.

I posted some more in-depth discussion over such issue here http://lambda-the-ultimate.org/node/5630#comment-96710

If you find the above proposals compelling, I’m happy to collaborate on it if that’s helpful!
I once experimented building a music notation software using the above discipline
(character -> note head, word -> chord, sentence -> beamed note, paragraph -> bar)
but eventually I abandoned it and get away with MuseScore.

Best,
Qiantan


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

* Re: new package: sketch-mode
  2021-08-30  6:00 ` Qiantan Hong
@ 2021-08-30 14:20   ` dalanicolai
  0 siblings, 0 replies; 11+ messages in thread
From: dalanicolai @ 2021-08-30 14:20 UTC (permalink / raw)
  To: Qiantan Hong; +Cc: larsi@gnus.org, Emacs Devel

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

Ah, I remember that I linked to the package in my original
message, but indeed I do not find any link there (let me see if
this <https://github.com/dalanicolai/sketch-mode> works, otherwise the
package can be found at:
https://github.com/dalanicolai/sketch-mode).

Anyway, although I do not immediately see any big advantage of
having the image overlayed on a 'semantically corresponding
text', it sounds like an interesting idea. Maybe you can explain the
advantages in a little more detail.

I was thinking of creating a togglable side-window that can show various
'levels` of definitions (layers, objects etc.). It is not very useful to
get the
full definition of the svg image, as it is 'polluted' with the definitions
of
the grid and the object's labels. So a sketch-mode image is build up
modularly
using svg-groups, where the grid and labels and the different layers are
added
as different modules/groups. So when I overlay the image on semantically
corresponding text, I would not immediately know which part of the
definition
best to use for the text (the svg definition, the full elisp image
definition,
only the layers?)

Indeed, the package is only an isolated editor emulated in Emacs, but it has
certain advantages over more specialized software especially for simple svg
images; i.e. it is in Emacs, sketches can be created really quick and
finally it
is an Emacs package and therefore ultimately/easily hackable. So users can
implement whatever they like, e.g. snippets, and use elisp functions for
drawing certain patterns etc.

I have written a little motivation and vision in the sketch-mode wiki
<https://github.com/dalanicolai/sketch-mode/wiki>
(https://github.com/dalanicolai/sketch-mode/wiki).

Furthermore, if you would like to contribute/join in development then you
are
very welcome.

Finally, I think we should move further discussions to either a github
issue or
to the discussions board
<https://github.com/dalanicolai/sketch-mode/discussions> (
https://github.com/dalanicolai/sketch-mode/discussions).

Daniel

On Mon, 30 Aug 2021 at 08:00, Qiantan Hong <qhong@mit.edu> wrote:

> > I am writing primarily to notify you about a package, sketch-mode, I am
> working on. It provides a handy interface to quickly draw svg's using, well
> Emacs, but in particular svg.el and transient.el.
> > It is handy in particular for creating svg sketches really fast, while
> of course, it has the advantage over other svg drawing applications that it
> is very hackable in your favorite langauge :)
>
> This looks very exciting! Is the code available somewhere?
>
> One important question I have is, do you implement it by putting an SVG
> overlay/property over a single dummy character,
> or do you put it on a range of text that *semantically* correspond the SVG
> being displayed?
> I strongly recommend the latter model because it makes it possible to
> blend in Emacs,
> e.g. you can get cursor movement, selection, copy/yank etc relatively
> easily.
> Just for a started, suppose underlying text is structured as one word
> correspond to and SVG element,
> then one can use forward-word backward-word to move between elements.
> And there’s much more to explore using other existing structural editing
> command.
> On the other hand, overlaying over a single dummy character just sounds
> like inventing
> a different, isolated editor emulated in Emacs.
>
> I posted some more in-depth discussion over such issue here
> http://lambda-the-ultimate.org/node/5630#comment-96710
>
> If you find the above proposals compelling, I’m happy to collaborate on it
> if that’s helpful!
> I once experimented building a music notation software using the above
> discipline
> (character -> note head, word -> chord, sentence -> beamed note, paragraph
> -> bar)
> but eventually I abandoned it and get away with MuseScore.
>
> Best,
> Qiantan
>
>

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

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

* Re: new package: sketch-mode
  2021-08-27 10:06   ` dalanicolai
@ 2021-08-30 22:45     ` Stefan Monnier
  2021-09-15 15:42       ` dalanicolai
  0 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2021-08-30 22:45 UTC (permalink / raw)
  To: dalanicolai; +Cc: emacs-devel, larsi

> Cool! Thanks. Yeah, for sure I am happy with that. So I will fill in the
> paperform request.

Let me know when it's done.

> It might still take some work/time to prepare the package for ELPA though.

In the mean time, here's a patch which addresses some of the warnings
emitted by the byte-compiler.  I strongly recommend to byte-compile your
code on a regular basis and pay attention to the warnings.


        Stefan


diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..aa3ed33912
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.elc
+/sketch-mode-autoloads.el
+/sketch-mode-pkg.el
diff --git a/sketch-mode.el b/sketch-mode.el
index bedd344eaa..d59672f63f 100644
--- a/sketch-mode.el
+++ b/sketch-mode.el
@@ -1,10 +1,10 @@
 ;;; sketch-mode.el --- Quickly create svg sketches using keyboard and mouse -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2021 Daniel Nicolai
-
+;; Copyright (C) 2021  Free Software Foundation, Inc.
 
 ;; Author: D.L. Nicolai <dalanicolai@gmail.com>
 ;; Created: 17 Jul 2021
+;; Version: 0
 
 ;; Keywords: multimedia 
 ;; URL: https://github.com/dalanicolai/sketch-mode
@@ -79,7 +79,7 @@
   "Default size for sketch canvas.
 Cons cell with car and cdr both integers, respectively
 representing the image width and image height
-(default: '(800 . 600))."
+default: (800 . 600)."
   :type '(cons integer integer))
 
 (defcustom sketch-show-grid t
@@ -134,7 +134,7 @@ STOPS is a list of percentage/color pairs."
   (svg--def
    svg
    (apply
-    'dom-node
+    #'dom-node
     'marker 
     `((id . ,id)
       (viewBox . "0 0 10 10")
@@ -174,8 +174,8 @@ transient."
            (expt (- (cdr end-coords) (cdr start-coords)) 2))))
 
 (defun sketch--rectangle-coords (start-coords end-coords)
-  (let ((base-coords (cons (apply 'min (list (car start-coords) (car end-coords)))
-                           (apply 'min (list (cdr start-coords) (cdr end-coords))))))
+  (let ((base-coords (cons (apply #'min (list (car start-coords) (car end-coords)))
+                           (apply #'min (list (cdr start-coords) (cdr end-coords))))))
   (list (car base-coords)
         (cdr base-coords)
         (abs (- (car end-coords) (car start-coords)))
@@ -187,12 +187,13 @@ transient."
         (abs (/ (- (car end-coords) (car start-coords)) 2))
         (abs (/ (- (cdr end-coords) (cdr start-coords)) 2))))
 
+(defvar svg) ;FIXME: Use a longer name with `sketch-' prefix for dynbound vars!
+(defvar svg-canvas)
+(defvar svg-grid)
+(defvar svg-sketch)
+
 (defun sketch--create-canvas (width height &optional grid-param)
   "Create canvas for drawing svg using the mouse."
-  (defvar svg)
-  (defvar svg-canvas)
-  (defvar svg-grid)
-  (defvar svg-sketch)
     (insert-image
      (let ((width width)
            (height height))
@@ -240,6 +241,8 @@ values"
       (let ((width (if arg (car sketch-default-image-size) (read-number "Enter width: ") ))
             (height (if arg 600 (read-number "Enter height: "))))
         (switch-to-buffer (get-buffer-create "*sketch*"))
+        ;; FIXME: `defvar' can't be meaningfully inside a function like that.
+        ;; FIXME: Use a `sketch-' prefix for all dynbound vars.
         (defvar-local sketch-elements nil)
         (defvar-local grid-param 25)
         (setq grid-param (if arg 25 (read-number "Enter grid parameter (enter 0 for no grid): ")))
@@ -304,7 +307,7 @@ values"
   ((fallback    :initarg :fallback    :initform nil)
    (default     :initarg :default     :initform nil)))
 
-(cl-defmethod transient-infix-read ((obj sketch-variable:colors))
+(cl-defmethod transient-infix-read ((_obj sketch-variable:colors))
   (read-color "Select color: "))
 
 (cl-defmethod transient-infix-value ((obj sketch-variable:colors))
@@ -314,19 +317,24 @@ values"
       (when default
         (concat (oref obj argument) (substring-no-properties default))))))
 
+;; We always call the autoloaded `color-name-to-rgb' before calling this
+;; function, so we know it's available even tho the compiler doesn't.
+(declare-function color-rgb-to-hex "color"
+                  (red green blue &optional digits-per-component))
+
 (cl-defmethod transient-format-value ((obj sketch-variable:colors))
   (let ((value (oref obj value))
         (default  (oref obj default)))
     (if value
         (format "%s (%s)"
                 (propertize value 'face (cons 'foreground-color value))
-                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb value))
+                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb value))
                             'face 'transient-inactive-argument))
       (if (string= default "none")
           (propertize "none" 'face 'transient-inactive-argument)
         (format "%s (%s)"
                 (propertize default 'face (cons 'foreground-color default))
-                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb default))
+                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb default))
                             'face 'transient-inactive-argument))))))
 
   ;; (let* ((args (when transient-current-prefix (transient-args 'sketch-transient)))
@@ -474,7 +482,7 @@ values"
 (defun sketch-create-label ()
   (interactive)
   (let* ((alphabet "abcdefghijklmnopqrstuvwxyz")
-         (labels-list (mapcar 'string (concat alphabet (upcase alphabet))))
+         (labels-list (mapcar #'string (concat alphabet (upcase alphabet))))
          (labels (sketch-labels-list)))
     (while (member (car labels-list) labels)
       (setq labels-list (cdr labels-list)))
@@ -489,7 +497,8 @@ values"
   (dolist (coord args node)
     (cl-decf (alist-get coord (cadr node)) amount)))
 
-(defun svg-translate (dx dy)
+;; FIXME: Use a `sketch-' prefix for all definitions.
+(defun sketch--svg-translate (dx dy)
   (interactive)
   (mapcar (lambda (node)
             (pcase (car node)
@@ -607,7 +616,7 @@ values"
     (transient-quit-one)
     (switch-to-buffer-other-window buffer)
     (erase-buffer)
-    (pp svg-sketch (current-buffer)))
+    (pp sketch (current-buffer)))
     (emacs-lisp-mode))
 
 (transient-define-suffix sketch-copy-definition ()
@@ -621,9 +630,10 @@ values"
   (interactive)
   (setq svg-sketch (read (buffer-string))))
 
+(defvar sketch-undo-redo nil)
+
 (transient-define-suffix sketch-undo ()
   (interactive)
-  (defvar sketch-undo-redo nil)
   (let ((sketch-reverse (nreverse svg-sketch)))
     (push (pop sketch-reverse) sketch-undo-redo)
     (setq svg-sketch (nreverse sketch-reverse)))
@@ -660,7 +670,7 @@ values"
                              ;;               (if sketch-include-end-marker
                              ;;                   "url(#arrow)"
                              ;;                 "none"))))
-    (apply 'svg-text svg-sketch text :x (car coords) :y (cdr coords) object-props))
+    (apply #'svg-text svg-sketch text :x (car coords) :y (cdr coords) object-props))
     (sketch-redraw))
 
 (transient-define-infix sketch-select-font ()
@@ -702,7 +712,7 @@ values"
     (setq svg-canvas (svg-create new-width new-height :stroke "gray"))
     (svg-marker svg-canvas "arrow" 8 8 "black" t)
     (svg-rectangle svg-canvas 0 0 new-width new-height :fill "white")
-    (setf (cddr svg-sketch) (svg-translate (car start-coords) (cdr start-coords)))
+    (setf (cddr svg-sketch) (sketch--svg-translate (car start-coords) (cdr start-coords)))
     (sketch-redraw)))
 
 (transient-define-suffix sketch-save ()
@@ -710,4 +720,4 @@ values"
   (image-save))
 
 (provide 'sketch-mode)
-;;; filename ends here
+;;; sketch-mode.el ends here
diff --git a/sketch-scratch.el b/sketch-scratch.el
index c9f60b21ad..6bf62552a7 100644
--- a/sketch-scratch.el
+++ b/sketch-scratch.el
@@ -1,3 +1,7 @@
+;;; sketch-scratch.el ---    -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021  Free Software Foundation, Inc.
+
 ;; (setq svg-scratch (svg-create 100 100))
 ;; (svg-rectangle svg-scratch 25 25 50 50 :id "a")
 ;; (svg-line svg-scratch 25 25 75 75 :id "b" :stroke-color "black")
@@ -10,6 +14,7 @@
   (dolist (coord args node)
     (cl-decf (alist-get coord (cadr node)) amount)))
 
+;; FIXME: Use a `sketch-' prefix for all definitions.
 (defun svg-translate (dx dy)
   (interactive)
   (mapcar (lambda (node)




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

* Re: new package: sketch-mode
  2021-08-30 22:45     ` Stefan Monnier
@ 2021-09-15 15:42       ` dalanicolai
  2021-09-15 15:42         ` dalanicolai
  2021-09-15 20:03         ` Stefan Monnier
  0 siblings, 2 replies; 11+ messages in thread
From: dalanicolai @ 2021-09-15 15:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: larsi, Emacs Devel

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

Hi Stefan (et al.)

The paperwork is ready. Do I need to send the contract somewhere?

Also thank you for the patch and the tip. I have applied the patch, and I
am checking things regularly by byte-compiling the file.
I am still getting some

`... function` is for interactive use only

warnings, but I am not sure how to best deal with that, so I better ask
here (they all refer to transient suffixes)

I worked a little more on the package, so that it has become again a little
nicer. Of course, there are still many possibilities to improve it,
but it is a nice start (e.g. would be nice to merge some canvas-mode
features in it, i.e. freehand drawing and mouse
selection/moving objects, then it would become a very nice(r) alternative to
https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio ;
just noticed that package very recently).

Daniel

On Tue, 31 Aug 2021 at 00:45, Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> > Cool! Thanks. Yeah, for sure I am happy with that. So I will fill in the
> > paperform request.
>
> Let me know when it's done.
>
> > It might still take some work/time to prepare the package for ELPA
> though.
>
> In the mean time, here's a patch which addresses some of the warnings
> emitted by the byte-compiler.  I strongly recommend to byte-compile your
> code on a regular basis and pay attention to the warnings.
>
>
>         Stefan
>
>
> diff --git a/.gitignore b/.gitignore
> new file mode 100644
> index 0000000000..aa3ed33912
> --- /dev/null
> +++ b/.gitignore
> @@ -0,0 +1,3 @@
> +*.elc
> +/sketch-mode-autoloads.el
> +/sketch-mode-pkg.el
> diff --git a/sketch-mode.el b/sketch-mode.el
> index bedd344eaa..d59672f63f 100644
> --- a/sketch-mode.el
> +++ b/sketch-mode.el
> @@ -1,10 +1,10 @@
>  ;;; sketch-mode.el --- Quickly create svg sketches using keyboard and
> mouse -*- lexical-binding: t; -*-
>
> -;; Copyright (C) 2021 Daniel Nicolai
> -
> +;; Copyright (C) 2021  Free Software Foundation, Inc.
>
>  ;; Author: D.L. Nicolai <dalanicolai@gmail.com>
>  ;; Created: 17 Jul 2021
> +;; Version: 0
>
>  ;; Keywords: multimedia
>  ;; URL: https://github.com/dalanicolai/sketch-mode
> @@ -79,7 +79,7 @@
>    "Default size for sketch canvas.
>  Cons cell with car and cdr both integers, respectively
>  representing the image width and image height
> -(default: '(800 . 600))."
> +default: (800 . 600)."
>    :type '(cons integer integer))
>
>  (defcustom sketch-show-grid t
> @@ -134,7 +134,7 @@ STOPS is a list of percentage/color pairs."
>    (svg--def
>     svg
>     (apply
> -    'dom-node
> +    #'dom-node
>      'marker
>      `((id . ,id)
>        (viewBox . "0 0 10 10")
> @@ -174,8 +174,8 @@ transient."
>             (expt (- (cdr end-coords) (cdr start-coords)) 2))))
>
>  (defun sketch--rectangle-coords (start-coords end-coords)
> -  (let ((base-coords (cons (apply 'min (list (car start-coords) (car
> end-coords)))
> -                           (apply 'min (list (cdr start-coords) (cdr
> end-coords))))))
> +  (let ((base-coords (cons (apply #'min (list (car start-coords) (car
> end-coords)))
> +                           (apply #'min (list (cdr start-coords) (cdr
> end-coords))))))
>    (list (car base-coords)
>          (cdr base-coords)
>          (abs (- (car end-coords) (car start-coords)))
> @@ -187,12 +187,13 @@ transient."
>          (abs (/ (- (car end-coords) (car start-coords)) 2))
>          (abs (/ (- (cdr end-coords) (cdr start-coords)) 2))))
>
> +(defvar svg) ;FIXME: Use a longer name with `sketch-' prefix for dynbound
> vars!
> +(defvar svg-canvas)
> +(defvar svg-grid)
> +(defvar svg-sketch)
> +
>  (defun sketch--create-canvas (width height &optional grid-param)
>    "Create canvas for drawing svg using the mouse."
> -  (defvar svg)
> -  (defvar svg-canvas)
> -  (defvar svg-grid)
> -  (defvar svg-sketch)
>      (insert-image
>       (let ((width width)
>             (height height))
> @@ -240,6 +241,8 @@ values"
>        (let ((width (if arg (car sketch-default-image-size) (read-number
> "Enter width: ") ))
>              (height (if arg 600 (read-number "Enter height: "))))
>          (switch-to-buffer (get-buffer-create "*sketch*"))
> +        ;; FIXME: `defvar' can't be meaningfully inside a function like
> that.
> +        ;; FIXME: Use a `sketch-' prefix for all dynbound vars.
>          (defvar-local sketch-elements nil)
>          (defvar-local grid-param 25)
>          (setq grid-param (if arg 25 (read-number "Enter grid parameter
> (enter 0 for no grid): ")))
> @@ -304,7 +307,7 @@ values"
>    ((fallback    :initarg :fallback    :initform nil)
>     (default     :initarg :default     :initform nil)))
>
> -(cl-defmethod transient-infix-read ((obj sketch-variable:colors))
> +(cl-defmethod transient-infix-read ((_obj sketch-variable:colors))
>    (read-color "Select color: "))
>
>  (cl-defmethod transient-infix-value ((obj sketch-variable:colors))
> @@ -314,19 +317,24 @@ values"
>        (when default
>          (concat (oref obj argument) (substring-no-properties default))))))
>
> +;; We always call the autoloaded `color-name-to-rgb' before calling this
> +;; function, so we know it's available even tho the compiler doesn't.
> +(declare-function color-rgb-to-hex "color"
> +                  (red green blue &optional digits-per-component))
> +
>  (cl-defmethod transient-format-value ((obj sketch-variable:colors))
>    (let ((value (oref obj value))
>          (default  (oref obj default)))
>      (if value
>          (format "%s (%s)"
>                  (propertize value 'face (cons 'foreground-color value))
> -                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb
> value))
> +                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb
> value))
>                              'face 'transient-inactive-argument))
>        (if (string= default "none")
>            (propertize "none" 'face 'transient-inactive-argument)
>          (format "%s (%s)"
>                  (propertize default 'face (cons 'foreground-color
> default))
> -                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb
> default))
> +                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb
> default))
>                              'face 'transient-inactive-argument))))))
>
>    ;; (let* ((args (when transient-current-prefix (transient-args
> 'sketch-transient)))
> @@ -474,7 +482,7 @@ values"
>  (defun sketch-create-label ()
>    (interactive)
>    (let* ((alphabet "abcdefghijklmnopqrstuvwxyz")
> -         (labels-list (mapcar 'string (concat alphabet (upcase
> alphabet))))
> +         (labels-list (mapcar #'string (concat alphabet (upcase
> alphabet))))
>           (labels (sketch-labels-list)))
>      (while (member (car labels-list) labels)
>        (setq labels-list (cdr labels-list)))
> @@ -489,7 +497,8 @@ values"
>    (dolist (coord args node)
>      (cl-decf (alist-get coord (cadr node)) amount)))
>
> -(defun svg-translate (dx dy)
> +;; FIXME: Use a `sketch-' prefix for all definitions.
> +(defun sketch--svg-translate (dx dy)
>    (interactive)
>    (mapcar (lambda (node)
>              (pcase (car node)
> @@ -607,7 +616,7 @@ values"
>      (transient-quit-one)
>      (switch-to-buffer-other-window buffer)
>      (erase-buffer)
> -    (pp svg-sketch (current-buffer)))
> +    (pp sketch (current-buffer)))
>      (emacs-lisp-mode))
>
>  (transient-define-suffix sketch-copy-definition ()
> @@ -621,9 +630,10 @@ values"
>    (interactive)
>    (setq svg-sketch (read (buffer-string))))
>
> +(defvar sketch-undo-redo nil)
> +
>  (transient-define-suffix sketch-undo ()
>    (interactive)
> -  (defvar sketch-undo-redo nil)
>    (let ((sketch-reverse (nreverse svg-sketch)))
>      (push (pop sketch-reverse) sketch-undo-redo)
>      (setq svg-sketch (nreverse sketch-reverse)))
> @@ -660,7 +670,7 @@ values"
>                               ;;               (if
> sketch-include-end-marker
>                               ;;                   "url(#arrow)"
>                               ;;                 "none"))))
> -    (apply 'svg-text svg-sketch text :x (car coords) :y (cdr coords)
> object-props))
> +    (apply #'svg-text svg-sketch text :x (car coords) :y (cdr coords)
> object-props))
>      (sketch-redraw))
>
>  (transient-define-infix sketch-select-font ()
> @@ -702,7 +712,7 @@ values"
>      (setq svg-canvas (svg-create new-width new-height :stroke "gray"))
>      (svg-marker svg-canvas "arrow" 8 8 "black" t)
>      (svg-rectangle svg-canvas 0 0 new-width new-height :fill "white")
> -    (setf (cddr svg-sketch) (svg-translate (car start-coords) (cdr
> start-coords)))
> +    (setf (cddr svg-sketch) (sketch--svg-translate (car start-coords)
> (cdr start-coords)))
>      (sketch-redraw)))
>
>  (transient-define-suffix sketch-save ()
> @@ -710,4 +720,4 @@ values"
>    (image-save))
>
>  (provide 'sketch-mode)
> -;;; filename ends here
> +;;; sketch-mode.el ends here
> diff --git a/sketch-scratch.el b/sketch-scratch.el
> index c9f60b21ad..6bf62552a7 100644
> --- a/sketch-scratch.el
> +++ b/sketch-scratch.el
> @@ -1,3 +1,7 @@
> +;;; sketch-scratch.el ---    -*- lexical-binding: t; -*-
> +
> +;; Copyright (C) 2021  Free Software Foundation, Inc.
> +
>  ;; (setq svg-scratch (svg-create 100 100))
>  ;; (svg-rectangle svg-scratch 25 25 50 50 :id "a")
>  ;; (svg-line svg-scratch 25 25 75 75 :id "b" :stroke-color "black")
> @@ -10,6 +14,7 @@
>    (dolist (coord args node)
>      (cl-decf (alist-get coord (cadr node)) amount)))
>
> +;; FIXME: Use a `sketch-' prefix for all definitions.
>  (defun svg-translate (dx dy)
>    (interactive)
>    (mapcar (lambda (node)
>
>

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

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

* Re: new package: sketch-mode
  2021-09-15 15:42       ` dalanicolai
@ 2021-09-15 15:42         ` dalanicolai
  2021-09-15 20:03         ` Stefan Monnier
  1 sibling, 0 replies; 11+ messages in thread
From: dalanicolai @ 2021-09-15 15:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: larsi, Emacs Devel

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

Ah... once more the link to the package

https://github.com/dalanicolai/sketch-mode

On Wed, 15 Sept 2021 at 17:42, dalanicolai <dalanicolai@gmail.com> wrote:

> Hi Stefan (et al.)
>
> The paperwork is ready. Do I need to send the contract somewhere?
>
> Also thank you for the patch and the tip. I have applied the patch, and I
> am checking things regularly by byte-compiling the file.
> I am still getting some
>
> `... function` is for interactive use only
>
> warnings, but I am not sure how to best deal with that, so I better ask
> here (they all refer to transient suffixes)
>
> I worked a little more on the package, so that it has become again a
> little nicer. Of course, there are still many possibilities to improve it,
> but it is a nice start (e.g. would be nice to merge some canvas-mode
> features in it, i.e. freehand drawing and mouse
> selection/moving objects, then it would become a very nice(r) alternative
> to
> https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio
> ; just noticed that package very recently).
>
> Daniel
>
> On Tue, 31 Aug 2021 at 00:45, Stefan Monnier <monnier@iro.umontreal.ca>
> wrote:
>
>> > Cool! Thanks. Yeah, for sure I am happy with that. So I will fill in the
>> > paperform request.
>>
>> Let me know when it's done.
>>
>> > It might still take some work/time to prepare the package for ELPA
>> though.
>>
>> In the mean time, here's a patch which addresses some of the warnings
>> emitted by the byte-compiler.  I strongly recommend to byte-compile your
>> code on a regular basis and pay attention to the warnings.
>>
>>
>>         Stefan
>>
>>
>> diff --git a/.gitignore b/.gitignore
>> new file mode 100644
>> index 0000000000..aa3ed33912
>> --- /dev/null
>> +++ b/.gitignore
>> @@ -0,0 +1,3 @@
>> +*.elc
>> +/sketch-mode-autoloads.el
>> +/sketch-mode-pkg.el
>> diff --git a/sketch-mode.el b/sketch-mode.el
>> index bedd344eaa..d59672f63f 100644
>> --- a/sketch-mode.el
>> +++ b/sketch-mode.el
>> @@ -1,10 +1,10 @@
>>  ;;; sketch-mode.el --- Quickly create svg sketches using keyboard and
>> mouse -*- lexical-binding: t; -*-
>>
>> -;; Copyright (C) 2021 Daniel Nicolai
>> -
>> +;; Copyright (C) 2021  Free Software Foundation, Inc.
>>
>>  ;; Author: D.L. Nicolai <dalanicolai@gmail.com>
>>  ;; Created: 17 Jul 2021
>> +;; Version: 0
>>
>>  ;; Keywords: multimedia
>>  ;; URL: https://github.com/dalanicolai/sketch-mode
>> @@ -79,7 +79,7 @@
>>    "Default size for sketch canvas.
>>  Cons cell with car and cdr both integers, respectively
>>  representing the image width and image height
>> -(default: '(800 . 600))."
>> +default: (800 . 600)."
>>    :type '(cons integer integer))
>>
>>  (defcustom sketch-show-grid t
>> @@ -134,7 +134,7 @@ STOPS is a list of percentage/color pairs."
>>    (svg--def
>>     svg
>>     (apply
>> -    'dom-node
>> +    #'dom-node
>>      'marker
>>      `((id . ,id)
>>        (viewBox . "0 0 10 10")
>> @@ -174,8 +174,8 @@ transient."
>>             (expt (- (cdr end-coords) (cdr start-coords)) 2))))
>>
>>  (defun sketch--rectangle-coords (start-coords end-coords)
>> -  (let ((base-coords (cons (apply 'min (list (car start-coords) (car
>> end-coords)))
>> -                           (apply 'min (list (cdr start-coords) (cdr
>> end-coords))))))
>> +  (let ((base-coords (cons (apply #'min (list (car start-coords) (car
>> end-coords)))
>> +                           (apply #'min (list (cdr start-coords) (cdr
>> end-coords))))))
>>    (list (car base-coords)
>>          (cdr base-coords)
>>          (abs (- (car end-coords) (car start-coords)))
>> @@ -187,12 +187,13 @@ transient."
>>          (abs (/ (- (car end-coords) (car start-coords)) 2))
>>          (abs (/ (- (cdr end-coords) (cdr start-coords)) 2))))
>>
>> +(defvar svg) ;FIXME: Use a longer name with `sketch-' prefix for
>> dynbound vars!
>> +(defvar svg-canvas)
>> +(defvar svg-grid)
>> +(defvar svg-sketch)
>> +
>>  (defun sketch--create-canvas (width height &optional grid-param)
>>    "Create canvas for drawing svg using the mouse."
>> -  (defvar svg)
>> -  (defvar svg-canvas)
>> -  (defvar svg-grid)
>> -  (defvar svg-sketch)
>>      (insert-image
>>       (let ((width width)
>>             (height height))
>> @@ -240,6 +241,8 @@ values"
>>        (let ((width (if arg (car sketch-default-image-size) (read-number
>> "Enter width: ") ))
>>              (height (if arg 600 (read-number "Enter height: "))))
>>          (switch-to-buffer (get-buffer-create "*sketch*"))
>> +        ;; FIXME: `defvar' can't be meaningfully inside a function like
>> that.
>> +        ;; FIXME: Use a `sketch-' prefix for all dynbound vars.
>>          (defvar-local sketch-elements nil)
>>          (defvar-local grid-param 25)
>>          (setq grid-param (if arg 25 (read-number "Enter grid parameter
>> (enter 0 for no grid): ")))
>> @@ -304,7 +307,7 @@ values"
>>    ((fallback    :initarg :fallback    :initform nil)
>>     (default     :initarg :default     :initform nil)))
>>
>> -(cl-defmethod transient-infix-read ((obj sketch-variable:colors))
>> +(cl-defmethod transient-infix-read ((_obj sketch-variable:colors))
>>    (read-color "Select color: "))
>>
>>  (cl-defmethod transient-infix-value ((obj sketch-variable:colors))
>> @@ -314,19 +317,24 @@ values"
>>        (when default
>>          (concat (oref obj argument) (substring-no-properties
>> default))))))
>>
>> +;; We always call the autoloaded `color-name-to-rgb' before calling this
>> +;; function, so we know it's available even tho the compiler doesn't.
>> +(declare-function color-rgb-to-hex "color"
>> +                  (red green blue &optional digits-per-component))
>> +
>>  (cl-defmethod transient-format-value ((obj sketch-variable:colors))
>>    (let ((value (oref obj value))
>>          (default  (oref obj default)))
>>      (if value
>>          (format "%s (%s)"
>>                  (propertize value 'face (cons 'foreground-color value))
>> -                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb
>> value))
>> +                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb
>> value))
>>                              'face 'transient-inactive-argument))
>>        (if (string= default "none")
>>            (propertize "none" 'face 'transient-inactive-argument)
>>          (format "%s (%s)"
>>                  (propertize default 'face (cons 'foreground-color
>> default))
>> -                (propertize (apply 'color-rgb-to-hex (color-name-to-rgb
>> default))
>> +                (propertize (apply #'color-rgb-to-hex (color-name-to-rgb
>> default))
>>                              'face 'transient-inactive-argument))))))
>>
>>    ;; (let* ((args (when transient-current-prefix (transient-args
>> 'sketch-transient)))
>> @@ -474,7 +482,7 @@ values"
>>  (defun sketch-create-label ()
>>    (interactive)
>>    (let* ((alphabet "abcdefghijklmnopqrstuvwxyz")
>> -         (labels-list (mapcar 'string (concat alphabet (upcase
>> alphabet))))
>> +         (labels-list (mapcar #'string (concat alphabet (upcase
>> alphabet))))
>>           (labels (sketch-labels-list)))
>>      (while (member (car labels-list) labels)
>>        (setq labels-list (cdr labels-list)))
>> @@ -489,7 +497,8 @@ values"
>>    (dolist (coord args node)
>>      (cl-decf (alist-get coord (cadr node)) amount)))
>>
>> -(defun svg-translate (dx dy)
>> +;; FIXME: Use a `sketch-' prefix for all definitions.
>> +(defun sketch--svg-translate (dx dy)
>>    (interactive)
>>    (mapcar (lambda (node)
>>              (pcase (car node)
>> @@ -607,7 +616,7 @@ values"
>>      (transient-quit-one)
>>      (switch-to-buffer-other-window buffer)
>>      (erase-buffer)
>> -    (pp svg-sketch (current-buffer)))
>> +    (pp sketch (current-buffer)))
>>      (emacs-lisp-mode))
>>
>>  (transient-define-suffix sketch-copy-definition ()
>> @@ -621,9 +630,10 @@ values"
>>    (interactive)
>>    (setq svg-sketch (read (buffer-string))))
>>
>> +(defvar sketch-undo-redo nil)
>> +
>>  (transient-define-suffix sketch-undo ()
>>    (interactive)
>> -  (defvar sketch-undo-redo nil)
>>    (let ((sketch-reverse (nreverse svg-sketch)))
>>      (push (pop sketch-reverse) sketch-undo-redo)
>>      (setq svg-sketch (nreverse sketch-reverse)))
>> @@ -660,7 +670,7 @@ values"
>>                               ;;               (if
>> sketch-include-end-marker
>>                               ;;                   "url(#arrow)"
>>                               ;;                 "none"))))
>> -    (apply 'svg-text svg-sketch text :x (car coords) :y (cdr coords)
>> object-props))
>> +    (apply #'svg-text svg-sketch text :x (car coords) :y (cdr coords)
>> object-props))
>>      (sketch-redraw))
>>
>>  (transient-define-infix sketch-select-font ()
>> @@ -702,7 +712,7 @@ values"
>>      (setq svg-canvas (svg-create new-width new-height :stroke "gray"))
>>      (svg-marker svg-canvas "arrow" 8 8 "black" t)
>>      (svg-rectangle svg-canvas 0 0 new-width new-height :fill "white")
>> -    (setf (cddr svg-sketch) (svg-translate (car start-coords) (cdr
>> start-coords)))
>> +    (setf (cddr svg-sketch) (sketch--svg-translate (car start-coords)
>> (cdr start-coords)))
>>      (sketch-redraw)))
>>
>>  (transient-define-suffix sketch-save ()
>> @@ -710,4 +720,4 @@ values"
>>    (image-save))
>>
>>  (provide 'sketch-mode)
>> -;;; filename ends here
>> +;;; sketch-mode.el ends here
>> diff --git a/sketch-scratch.el b/sketch-scratch.el
>> index c9f60b21ad..6bf62552a7 100644
>> --- a/sketch-scratch.el
>> +++ b/sketch-scratch.el
>> @@ -1,3 +1,7 @@
>> +;;; sketch-scratch.el ---    -*- lexical-binding: t; -*-
>> +
>> +;; Copyright (C) 2021  Free Software Foundation, Inc.
>> +
>>  ;; (setq svg-scratch (svg-create 100 100))
>>  ;; (svg-rectangle svg-scratch 25 25 50 50 :id "a")
>>  ;; (svg-line svg-scratch 25 25 75 75 :id "b" :stroke-color "black")
>> @@ -10,6 +14,7 @@
>>    (dolist (coord args node)
>>      (cl-decf (alist-get coord (cadr node)) amount)))
>>
>> +;; FIXME: Use a `sketch-' prefix for all definitions.
>>  (defun svg-translate (dx dy)
>>    (interactive)
>>    (mapcar (lambda (node)
>>
>>

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

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

* Re: new package: sketch-mode
  2021-09-15 15:42       ` dalanicolai
  2021-09-15 15:42         ` dalanicolai
@ 2021-09-15 20:03         ` Stefan Monnier
  2021-09-18 11:25           ` dalanicolai
  1 sibling, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2021-09-15 20:03 UTC (permalink / raw)
  To: dalanicolai; +Cc: Emacs Devel, larsi

> The paperwork is ready.

Indeed, I see you in the the FSF's copyright database!

> Do I need to send the contract somewhere?

No, you're good to go.  I just pushed the patch below.

Please make sure to check/request copyright paperwork of your contributors
*before* you add their code to the `master` branch.


        Stefan




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

* Re: new package: sketch-mode
  2021-09-15 20:03         ` Stefan Monnier
@ 2021-09-18 11:25           ` dalanicolai
  0 siblings, 0 replies; 11+ messages in thread
From: dalanicolai @ 2021-09-18 11:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: larsi, Emacs Devel

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

Thanks! Will do that... (I somehow forgot to press the send button for this
message earlier)

On Wed, 15 Sept 2021 at 22:03, Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> > The paperwork is ready.
>
> Indeed, I see you in the the FSF's copyright database!
>
> > Do I need to send the contract somewhere?
>
> No, you're good to go.  I just pushed the patch below.
>
> Please make sure to check/request copyright paperwork of your contributors
> *before* you add their code to the `master` branch.
>
>
>         Stefan
>
>

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

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

end of thread, other threads:[~2021-09-18 11:25 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-23 10:17 new package: sketch-mode dalanicolai
2021-08-23 13:31 ` Lars Ingebrigtsen
2021-08-24 21:57 ` Stefan Monnier
2021-08-27 10:06   ` dalanicolai
2021-08-30 22:45     ` Stefan Monnier
2021-09-15 15:42       ` dalanicolai
2021-09-15 15:42         ` dalanicolai
2021-09-15 20:03         ` Stefan Monnier
2021-09-18 11:25           ` dalanicolai
2021-08-30  6:00 ` Qiantan Hong
2021-08-30 14:20   ` dalanicolai

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.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).