abo-abo / lispy

Short and sweet LISP editing
http://oremacs.com/lispy/
1.21k stars 133 forks source link

Fix reader syntaxes disrupted by newlines #655

Open RuijieYu opened 1 year ago

RuijieYu commented 1 year ago

Note that I am writing this PR on a recent Emacs 30 build, whereas the min version supported for lispy is 24.3. I hope someone can test on some earlier versions.

Fixes #647. Also fixes #653 by its first commit.

Lispy would assume an implicit nil after the reader syntax, like this:

(defun foo ()
  '
  (bar baz)
  ) ;; point here, press i to format

Gets this incorrect result:

(defun foo ()
  '() (bar baz))

(lispy--delete-insignificant-sexps): allow removing sexps that are implicitly-created by lispy, and serve no purpose in the real input and output sexp other than formatting. At the moment, just remove newline nodes.

(lispy--read-reader-syntax): helper function to avoid code duplication; converts a reader syntax RS, e.g., "`", plus its immediately-next sexp, into an internal representation with TAG.

(lispy--read): update handling of "#'", ",@", "'", "`", "," to make use of lispy--read-reader-syntax.

(lispy--insert): fixed float and quasiquote handling (currently it calls (insert (caddr sxp)), which is incorrect because insert considers it a character; float was not problematic because this code path was never triggered: things like 1.2 have not been converted into ly-raw float constructs anyway.

(lispy-read-quote-newline): added 5 simple tests for each of the addressed reader syntaxes.