1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-08 15:30:40 -08:00

* lisp/emacs-lisp/smie.el: Provide smarter auto-filling.

(smie-auto-fill): New function.
(smie-setup): Use it.
This commit is contained in:
Stefan Monnier 2012-02-15 09:38:21 -05:00
parent 4bdf2ad222
commit 3f99e6e686
2 changed files with 39 additions and 0 deletions

View file

@ -1539,6 +1539,38 @@ to which that point should be aligned, if we were to reindent it.")
(save-excursion (indent-line-to indent))
(indent-line-to indent)))))
(defun smie-auto-fill ()
(let ((fc (current-fill-column))
(try-again nil))
(while (and fc (> (current-column) fc))
(cond
((not (or (nth 8 (save-excursion
(syntax-ppss (line-beginning-position))))
(nth 8 (syntax-ppss))))
(save-excursion
(beginning-of-line)
(smie-indent-forward-token)
(let ((bsf (point))
(gain 0)
curcol)
(while (<= (setq curcol (current-column)) fc)
;; FIXME? `smie-indent-calculate' can (and often will)
;; return a result that actually depends on the presence/absence
;; of a newline, so the gain computed here may not be accurate,
;; but in practice it seems to works well enough.
(let* ((newcol (smie-indent-calculate))
(newgain (- curcol newcol)))
(when (> newgain gain)
(setq gain newgain)
(setq bsf (point))))
(smie-indent-forward-token))
(when (> gain 0)
(setq try-again)
(goto-char bsf)
(newline-and-indent)))))
(t (do-auto-fill))))))
(defun smie-setup (grammar rules-function &rest keywords)
"Setup SMIE navigation and indentation.
GRAMMAR is a grammar table generated by `smie-prec2->grammar'.
@ -1549,6 +1581,7 @@ KEYWORDS are additional arguments, which can use the following keywords:
(set (make-local-variable 'smie-rules-function) rules-function)
(set (make-local-variable 'smie-grammar) grammar)
(set (make-local-variable 'indent-line-function) 'smie-indent-line)
(set (make-local-variable 'normal-auto-fill-function) 'smie-auto-fill)
(set (make-local-variable 'forward-sexp-function)
'smie-forward-sexp-command)
(while keywords