]> code.delx.au - gnu-emacs/commitdiff
* lisp/progmodes/ruby-mode.el (ruby-toggle-block): Guess the current block,
authorDmitry Gutov <dgutov@yandex.ru>
Sat, 8 Sep 2012 23:32:25 +0000 (03:32 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Sat, 8 Sep 2012 23:32:25 +0000 (03:32 +0400)
not just expect to be at its beginning.  Adjust callees.
Succeed when do-end block has no space before the pipe character.
(ruby-brace-to-do-end): When the original block is one-liner,
convert to multiline.  Reindent the result.

* test/automated/ruby-mode-tests.el:
(ruby-toggle-block-to-multiline): New test.
(ruby-should-indent-buffer, ruby-toggle-block-to-do-end)
(ruby-toggle-block-to-brace): Use buffer-string.

lisp/ChangeLog
lisp/progmodes/ruby-mode.el
test/ChangeLog
test/automated/ruby-mode-tests.el

index 7104f68e816090f532cb1ecf53a2e0ab381cb129..29fa06c10e59de15d03a06a48618812c53673a45 100644 (file)
@@ -1,3 +1,11 @@
+2012-09-08  Dmitry Gutov  <dgutov@yandex.ru>
+
+       * progmodes/ruby-mode.el (ruby-toggle-block): Guess the current block,
+       not just expect to be at its beginning.  Adjust callees.
+       Succeed when do-end block has no space before the pipe character.
+       (ruby-brace-to-do-end): When the original block is one-liner,
+       convert to multiline.  Reindent the result.
+
 2012-09-08  Jambunathan K  <kjambunathan@gmail.com>
 
        * register.el (register): New group.
index 947c12560a15a8835fbd730537a2453612271246..77ec8084ea2b3afb42d52337c15b43d42b8158f6 100644 (file)
@@ -1107,46 +1107,65 @@ See `add-log-current-defun-function'."
               (if mlist (concat mlist mname) mname)
             mlist)))))
 
-(defun ruby-brace-to-do-end ()
-  (when (looking-at "{")
-    (let ((orig (point)) (end (progn (ruby-forward-sexp) (point))))
-      (when (eq (char-before) ?\})
-        (delete-char -1)
-        (if (eq (char-syntax (char-before)) ?w)
-            (insert " "))
-        (insert "end")
-        (if (eq (char-syntax (char-after)) ?w)
-            (insert " "))
-        (goto-char orig)
-        (delete-char 1)
-        (if (eq (char-syntax (char-before)) ?w)
-            (insert " "))
-        (insert "do")
-        (when (looking-at "\\sw\\||")
-          (insert " ")
-          (backward-char))
-        t))))
-
-(defun ruby-do-end-to-brace ()
-  (when (and (or (bolp)
-                 (not (memq (char-syntax (char-before)) '(?w ?_))))
-             (looking-at "\\<do\\(\\s \\|$\\)"))
-    (let ((orig (point)) (end (progn (ruby-forward-sexp) (point))))
-      (backward-char 3)
-      (when (looking-at ruby-block-end-re)
-        (delete-char 3)
-        (insert "}")
-        (goto-char orig)
-        (delete-char 2)
-        (insert "{")
-        (if (looking-at "\\s +|")
-            (delete-char (- (match-end 0) (match-beginning 0) 1)))
-        t))))
+(defun ruby-brace-to-do-end (orig end)
+  (let (beg-marker end-marker)
+    (goto-char end)
+    (when (eq (char-before) ?\})
+      (delete-char -1)
+      (skip-chars-backward " \t")
+      (when (not (bolp))
+        (insert "\n"))
+      (insert "end")
+      (setq end-marker (point-marker))
+      (when (and (not (eobp)) (eq (char-syntax (char-after)) ?w))
+        (insert " "))
+      (goto-char orig)
+      (delete-char 1)
+      (when (eq (char-syntax (char-before)) ?w)
+        (insert " "))
+      (insert "do")
+      (setq beg-marker (point-marker))
+      (when (looking-at "\\(\\s \\)*|")
+        (unless (match-beginning 1)
+          (insert " "))
+        (goto-char (1+ (match-end 0)))
+        (search-forward "|"))
+      (unless (looking-at "\\s *$")
+        (insert "\n"))
+      (indent-region beg-marker end-marker)
+      (goto-char beg-marker)
+      t)))
+
+(defun ruby-do-end-to-brace (orig end)
+  (goto-char (- end 3))
+  (when (looking-at ruby-block-end-re)
+    (delete-char 3)
+    (insert "}")
+    (goto-char orig)
+    (delete-char 2)
+    (insert "{")
+    (if (looking-at "\\s +|")
+        (delete-char (- (match-end 0) (match-beginning 0) 1)))
+    t))
 
 (defun ruby-toggle-block ()
+  "Toggle block type from do-end to braces or back.
+The block must begin on the current line or above it and end after the point.
+If the result is do-end block, it will always be multiline."
   (interactive)
-  (or (ruby-brace-to-do-end)
-      (ruby-do-end-to-brace)))
+  (let ((start (point)) beg end)
+    (end-of-line)
+    (unless
+        (if (and (re-search-backward "\\({\\)\\|\\_<do\\(\\s \\|$\\||\\)")
+                 (progn
+                   (setq beg (point))
+                   (save-match-data (ruby-forward-sexp))
+                   (setq end (point))
+                   (> end start)))
+            (if (match-beginning 1)
+                (ruby-brace-to-do-end beg end)
+              (ruby-do-end-to-brace beg end)))
+      (goto-char start))))
 
 (declare-function ruby-syntax-propertize-heredoc "ruby-mode" (limit))
 (declare-function ruby-syntax-enclosing-percent-literal "ruby-mode" (limit))
index 541937ec4e7b65aa8afb872fb1ef88f83eee7ff0..a7e22aa9ae1256ee18a924d7bb21330bec27d4e6 100644 (file)
@@ -1,3 +1,10 @@
+2012-09-08  Dmitry Gutov  <dgutov@yandex.ru>
+
+       * automated/ruby-mode-tests.el:
+       (ruby-toggle-block-to-multiline): New test.
+       (ruby-should-indent-buffer, ruby-toggle-block-to-do-end)
+       (ruby-toggle-block-to-brace): Use buffer-string.
+
 2012-09-07  Dmitry Gutov  <dgutov@yandex.ru>
 
        * automated/ruby-mode-tests.el: New tests (Bug#11613).
index 515353bc2d0cf8d86c9b62b329f00154db0bf6ec..e711b52fb9c4821293a802bc59bdeed12d34e0a8 100644 (file)
@@ -40,8 +40,7 @@ The whitespace before and including \"|\" on each line is removed."
       (insert (fix-indent content))
       (ruby-mode)
       (indent-region (point-min) (point-max))
-      (should (string= (fix-indent expected) (buffer-substring-no-properties
-                                              (point-min) (point-max)))))))
+      (should (string= (fix-indent expected) (buffer-string))))))
 
 (defun ruby-assert-state (content &rest values-plist)
   "Assert syntax state values at the end of CONTENT.
@@ -213,21 +212,27 @@ VALUES-PLIST is a list with alternating index and value elements."
 
 (ert-deftest ruby-toggle-block-to-do-end ()
   (with-temp-buffer
-    (insert "foo {|b|\n}\n")
+    (insert "foo {|b|\n}")
     (ruby-mode)
-    (search-backward "{")
+    (beginning-of-line)
     (ruby-toggle-block)
-    (should (string= "foo do |b|\nend\n" (buffer-substring-no-properties
-                                          (point-min) (point-max))))))
+    (should (string= "foo do |b|\nend" (buffer-string)))))
 
 (ert-deftest ruby-toggle-block-to-brace ()
   (with-temp-buffer
-    (insert "foo do |b|\nend\n")
+    (insert "foo do |b|\nend")
     (ruby-mode)
-    (search-backward "do")
+    (beginning-of-line)
+    (ruby-toggle-block)
+    (should (string= "foo {|b|\n}" (buffer-string)))))
+
+(ert-deftest ruby-toggle-block-to-multiline ()
+  (with-temp-buffer
+    (insert "foo {|b| b + 1}")
+    (ruby-mode)
+    (beginning-of-line)
     (ruby-toggle-block)
-    (should (string= "foo {|b|\n}\n" (buffer-substring-no-properties
-                                      (point-min) (point-max))))))
+    (should (string= "foo do |b|\n  b + 1\nend" (buffer-string)))))
 
 (ert-deftest ruby-recognize-symbols-starting-with-at-character ()
   (ruby-assert-face ":@abc" 3 'font-lock-constant-face))