Mercurial > emacs
changeset 108652:79ce86edba9f
* emacs-lisp/smie.el (smie-next-sexp): Break inf-loop at BOB.
(smie-backward-sexp, smie-forward-sexp): Remove boundary condition now
handled in smie-next-sexp.
(smie-indent-calculate): Provide a starting indentation (so the
recursion is well-founded ;-).
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Tue, 18 May 2010 15:24:24 -0400 |
parents | 2e8869e152ed |
children | feaedf49cc07 |
files | lisp/ChangeLog lisp/emacs-lisp/smie.el |
diffstat | 2 files changed, 17 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Tue May 18 14:05:43 2010 -0400 +++ b/lisp/ChangeLog Tue May 18 15:24:24 2010 -0400 @@ -1,5 +1,11 @@ 2010-05-18 Stefan Monnier <monnier@iro.umontreal.ca> + * emacs-lisp/smie.el (smie-next-sexp): Break inf-loop at BOB. + (smie-backward-sexp, smie-forward-sexp): Remove boundary condition now + handled in smie-next-sexp. + (smie-indent-calculate): Provide a starting indentation (so the + recursion is well-founded ;-). + Fix handling of non-associative equal levels. * emacs-lisp/smie.el (smie-prec2-levels): Choose distinct levels even when it's not needed.
--- a/lisp/emacs-lisp/smie.el Tue May 18 14:05:43 2010 -0400 +++ b/lisp/emacs-lisp/smie.el Tue May 18 15:24:24 2010 -0400 @@ -348,10 +348,13 @@ (cond ((null toklevels) - (if (equal token "") + (when (equal token "") (condition-case err (progn (goto-char pos) (funcall next-sexp 1) nil) - (scan-error (throw 'return (list t (caddr err))))))) + (scan-error (throw 'return (list t (caddr err))))) + (if (eq pos (point)) + ;; We did not move, so let's abort the loop. + (throw 'return (list t (point)))))) ((null (funcall op-back toklevels)) ;; A token like a paren-close. (assert (funcall op-forw toklevels)) ;Otherwise, why mention it? @@ -401,15 +404,13 @@ (t POS TOKEN): same thing but for an open-paren or the beginning of buffer. (nil POS TOKEN): we skipped over a paren-like pair. nil: we skipped over an identifier, matched parentheses, ..." - (if (bobp) (list t (point)) (smie-next-sexp (lambda () (forward-comment (- (point-max))) (smie-backward-token)) (indirect-function 'backward-sexp) (indirect-function 'smie-op-left) (indirect-function 'smie-op-right) - halfsexp))) + halfsexp)) -;; Mirror image, not used for indentation. (defun smie-forward-sexp (&optional halfsexp) "Skip over one sexp. HALFSEXP if non-nil, means skip over a partial sexp if needed. I.e. if the @@ -421,13 +422,12 @@ (t POS TOKEN): same thing but for an open-paren or the beginning of buffer. (nil POS TOKEN): we skipped over a paren-like pair. nil: we skipped over an identifier, matched parentheses, ..." - (if (eobp) (list t (point)) (smie-next-sexp (lambda () (forward-comment (point-max)) (smie-forward-token)) (indirect-function 'forward-sexp) (indirect-function 'smie-op-right) (indirect-function 'smie-op-left) - halfsexp))) + halfsexp)) (defun smie-backward-sexp-command (&optional n) "Move backward through N logical elements." @@ -514,6 +514,10 @@ (and virtual (if (eq virtual :hanging) (not (smie-indent-hanging-p)) (smie-bolp)) (current-column)) + ;; Start the file at column 0. + (save-excursion + (forward-comment (- (point-max))) + (if (bobp) 0)) ;; Align close paren with opening paren. (save-excursion ;; (forward-comment (point-max))