* lisp/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.

* 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.
This commit is contained in:
Dmitry Gutov 2012-09-09 03:32:25 +04:00
parent 9d7f18633a
commit c326883141
4 changed files with 85 additions and 46 deletions

View 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.

View 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-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 ()
(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-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))

View 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).

View 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}\n" (buffer-substring-no-properties
(point-min) (point-max))))))
(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 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))