emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r112315: New defun movement commands.


From: Fabián Ezequiel Gallina
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r112315: New defun movement commands.
Date: Wed, 17 Apr 2013 02:08:20 -0300
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 112315
committer: Fabián Ezequiel Gallina <address@hidden>
branch nick: trunk
timestamp: Wed 2013-04-17 02:08:20 -0300
message:
  New defun movement commands.
  
  * lisp/progmodes/python.el (python-nav--syntactically)
  (python-nav--forward-defun, python-nav-backward-defun)
  (python-nav-forward-defun): New functions.
  
  * test/automated/python-tests.el (python-nav-backward-defun-1)
  (python-nav-forward-defun-1): New tests.
modified:
  lisp/ChangeLog
  lisp/progmodes/python.el
  test/ChangeLog
  test/automated/python-tests.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2013-04-17 02:52:50 +0000
+++ b/lisp/ChangeLog    2013-04-17 05:08:20 +0000
@@ -1,5 +1,12 @@
 2013-04-17  Fabián Ezequiel Gallina  <address@hidden>
 
+       New defun movement commands.
+       * progmodes/python.el (python-nav--syntactically)
+       (python-nav--forward-defun, python-nav-backward-defun)
+       (python-nav-forward-defun): New functions.
+
+2013-04-17  Fabián Ezequiel Gallina  <address@hidden>
+
        * progmodes/python.el (python-syntax--context-compiler-macro): New 
defun.
        (python-syntax-context): Use named compiler-macro for backwards
        compatibility with Emacs 24.x.

=== modified file 'lisp/progmodes/python.el'
--- a/lisp/progmodes/python.el  2013-04-17 02:52:50 +0000
+++ b/lisp/progmodes/python.el  2013-04-17 05:08:20 +0000
@@ -1192,6 +1192,66 @@
       ;; Ensure point moves forward.
       (and (> beg-pos (point)) (goto-char beg-pos)))))
 
+(defun python-nav--syntactically (fn poscompfn &optional pos)
+  "Move to point using FN ignoring non-code or paren context.
+FN must take no arguments and could be used to set match-data.
+POSCOMPFN is a two arguments function used to compare current and
+previous point after it is moved using FN, this is normally a
+less-than or greater-than comparison.  Optional argument POS is
+internally used in recursive calls and should not be explicitly
+passed."
+  (let* ((newpos
+          (and (funcall fn)
+               (save-match-data
+                 (and
+                  (not (python-syntax-context-type))
+                  (point-marker)))))
+         (current-match-data (match-data)))
+    (cond ((or (and (not pos) newpos)
+               (and pos newpos (funcall poscompfn newpos pos)))
+           (set-match-data current-match-data)
+           (point-marker))
+          ((and (not pos) (not newpos)) nil)
+          (t (python-nav--syntactically
+              fn poscompfn (point-marker))))))
+
+(defun python-nav--forward-defun (arg)
+  "Internal implementation of python-nav-{backward,forward}-defun.
+Uses ARG to define which function to call, and how many times
+repeat it."
+  (let ((found))
+    (while (and (> arg 0)
+                (setq found
+                      (python-nav--syntactically
+                       (lambda ()
+                         (re-search-forward
+                          python-nav-beginning-of-defun-regexp nil t))
+                       '>)))
+      (setq arg (1- arg)))
+    (while (and (< arg 0)
+                (setq found
+                      (python-nav--syntactically
+                       (lambda ()
+                         (re-search-backward
+                          python-nav-beginning-of-defun-regexp nil t))
+                       '<)))
+      (setq arg (1+ arg)))
+    found))
+
+(defun python-nav-backward-defun (&optional arg)
+  "Navigate to closer defun backward ARG times.
+Unlikely `python-nav-beginning-of-defun' this doesn't care about
+nested definitions."
+  (interactive "^p")
+  (python-nav--forward-defun (- (or arg 1))))
+
+(defun python-nav-forward-defun (&optional arg)
+  "Navigate to closer defun forward ARG times.
+Unlikely `python-nav-beginning-of-defun' this doesn't care about
+nested definitions."
+  (interactive "^p")
+  (python-nav--forward-defun (or arg 1)))
+
 (defun python-nav-beginning-of-statement ()
   "Move to start of current statement."
   (interactive "^")

=== modified file 'test/ChangeLog'
--- a/test/ChangeLog    2013-04-09 17:37:17 +0000
+++ b/test/ChangeLog    2013-04-17 05:08:20 +0000
@@ -1,3 +1,8 @@
+2013-04-17  Fabián Ezequiel Gallina  <address@hidden>
+
+       * automated/python-tests.el (python-nav-backward-defun-1)
+       (python-nav-forward-defun-1): New tests.
+
 2013-04-09  Masatake YAMATO  <address@hidden>
 
        * automated/add-log-tests.el: New file. (Bug#14112)

=== modified file 'test/automated/python-tests.el'
--- a/test/automated/python-tests.el    2013-04-01 07:58:04 +0000
+++ b/test/automated/python-tests.el    2013-04-17 05:08:20 +0000
@@ -674,6 +674,93 @@
                 (python-tests-look-at "return wrapped_f")
                 (line-beginning-position))))))
 
+(ert-deftest python-nav-backward-defun-1 ()
+  (python-tests-with-temp-buffer
+   "
+class A(object): # A
+
+    def a(self): # a
+        pass
+
+    def b(self): # b
+        pass
+
+    class B(object): # B
+
+        class C(object): # C
+
+            def d(self): # d
+                pass
+
+            # def e(self): # e
+            #     pass
+
+    def c(self): # c
+        pass
+
+    # def d(self): # d
+    #     pass
+"
+   (goto-char (point-max))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "    def c(self): # c" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "            def d(self): # d" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "        class C(object): # C" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "    class B(object): # B" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "    def b(self): # b" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "    def a(self): # a" -1)))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "class A(object): # A" -1)))
+   (should (not (python-nav-backward-defun)))))
+
+(ert-deftest python-nav-forward-defun-1 ()
+  (python-tests-with-temp-buffer
+   "
+class A(object): # A
+
+    def a(self): # a
+        pass
+
+    def b(self): # b
+        pass
+
+    class B(object): # B
+
+        class C(object): # C
+
+            def d(self): # d
+                pass
+
+            # def e(self): # e
+            #     pass
+
+    def c(self): # c
+        pass
+
+    # def d(self): # d
+    #     pass
+"
+   (goto-char (point-min))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(object): # A")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(self): # a")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(self): # b")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(object): # B")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(object): # C")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(self): # d")))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "(self): # c")))
+   (should (not (python-nav-forward-defun)))))
 
 (ert-deftest python-nav-beginning-of-statement-1 ()
   (python-tests-with-temp-buffer


reply via email to

[Prev in Thread] Current Thread [Next in Thread]