]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/smie.el (smie-down-list): New command.
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 31 Aug 2010 12:22:40 +0000 (14:22 +0200)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 31 Aug 2010 12:22:40 +0000 (14:22 +0200)
lisp/ChangeLog
lisp/emacs-lisp/smie.el

index eba622b6beeb52b087a93a44401e250dc0004b10..f01ddd2b2fdc6e5370d5e100dbb2da1486b56a13 100644 (file)
@@ -1,5 +1,7 @@
 2010-08-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * 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.
index c9876c55014b64e61f25d1cd7f3ff2f77e91bf4f..e8b5c2448e880113d124cd52d1ff293619979498 100644 (file)
@@ -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