From: Stefan Monnier Date: Tue, 31 Aug 2010 12:22:40 +0000 (+0200) Subject: * lisp/emacs-lisp/smie.el (smie-down-list): New command. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~48^2~181 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c8977b2e622e2c1ff46a160b252feff30bc1025e;p=emacs.git * lisp/emacs-lisp/smie.el (smie-down-list): New command. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index eba622b6bee..f01ddd2b2fd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2010-08-31 Stefan Monnier + * emacs-lisp/smie.el (smie-down-list): New command. + Remove old indentation and navigation code on octave-mode. * progmodes/octave-mod.el (octave-mode-map): Remap down-list to smie-down-list rather than add a binding for octave-down-block. diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el index c9876c55014..e8b5c2448e8 100644 --- a/lisp/emacs-lisp/smie.el +++ b/lisp/emacs-lisp/smie.el @@ -560,6 +560,42 @@ Possible return values: (indent-according-to-mode) (reindent-then-newline-and-indent)))) +(defun smie-down-list (&optional arg) + "Move forward down one level paren-like blocks. Like `down-list'. +With argument ARG, do this that many times. +A negative argument means move backward but still go down a level. +This command assumes point is not in a string or comment." + (interactive "p") + (let ((start (point)) + (inc (if (< arg 0) -1 1)) + (offset (if (< arg 0) 1 0)) + (next-token (if (< arg 0) + smie-backward-token-function + smie-forward-token-function))) + (while (/= arg 0) + (setq arg (- arg inc)) + (while + (let* ((pos (point)) + (token (funcall next-token)) + (levels (assoc token smie-op-levels))) + (cond + ((zerop (length token)) + (if (if (< inc 0) (looking-back "\\s(\\|\\s)" (1- (point))) + (looking-at "\\s(\\|\\s)")) + ;; Go back to `start' in case of an error. This presumes + ;; none of the token we've found until now include a ( or ). + (progn (goto-char start) (down-list inc) nil) + (forward-sexp inc) + (/= (point) pos))) + ((and levels (null (nth (+ 1 offset) levels))) nil) + ((and levels (null (nth (- 2 offset) levels))) + (let ((end (point))) + (goto-char start) + (signal 'scan-error + (list "Containing expression ends prematurely" + pos end)))) + (t))))))) + ;;; The indentation engine. (defcustom smie-indent-basic 4