hylang / hy-mode

Hy mode for Emacs
GNU General Public License v3.0
191 stars 47 forks source link

Fix indent on immediately applied function definition/evaluation results. #102

Open jams2 opened 3 years ago

jams2 commented 3 years ago

I hope you don't mind the unsolicited PR but I made the changes for my own use anyway so thought it makes sense to share.

Current behaviour (installed from master):

((fn [x y] (+ x y))
  1
 7)

((fn [x y]
   (+ x y))
  1
 7)

(((fn [x] (fn [y] (+ x y)))
   3)
  4)

The indentation of the rest of the forms in the outermost expression (1, 7, 3, 4) is currently "one past the opening paren of the previous sexp". This differs from Hy's style guide (see the third law) and indentation in other lisp modes (e.g. elisp mode), and to my eye is confusing. This PR changes the behaviour so the previous example will be indented as such:

((fn [x y] (+ x y))
 1
 7)

((fn [x y]
   (+ x y))
 1
 7)

(((fn [x] (fn [y] (+ x y)))
  3)
 4)

I also added assoc to hy-indent--exactly, to bring behaviour in line with the style guide (see special arguments).

jams2 commented 3 years ago

Apologies - after reviewing the tests I can see that this is intended behavior of hy-mode:

    (it "form opens a form - only sexp on line"
      (expect "
((a b)
  c)
" :indented))

I know indentation can be a contentious topic, so let me know if this is something worth further discussion, otherwise I'll just use my own fork :)