# HG changeset patch # User Stefan Monnier # Date 1274210664 14400 # Node ID 79ce86edba9f0db990c15750af98b0c5719e42f8 # Parent 2e8869e152ed63e72fc989f7a43188c4e59318a0 * 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 ;-). diff -r 2e8869e152ed -r 79ce86edba9f lisp/ChangeLog --- 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 + * 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. diff -r 2e8869e152ed -r 79ce86edba9f lisp/emacs-lisp/smie.el --- 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))