Commit b520f210 authored by Dmitry Gutov's avatar Dmitry Gutov
Browse files

* lisp/progmodes/ruby-mode.el (ruby-align-to-stmt-keywords): New

option. 
(ruby-smie--indent-to-stmt-p): Use it.
(ruby-smie-rules): Revert the logic in the handling of `when'.
Expand the `begin' clause to handle `ruby-align-to-stmt-keywords'.
(ruby-deep-arglist, ruby-deep-indent-paren)
(ruby-deep-indent-paren-style): Update docstrings to note that the
vars don't have any effect with SMIE.

* test/automated/ruby-mode-tests.el: Add tests for
`ruby-align-to-stmt-keywords'.

* test/indent/ruby.rb: Update examples to reflect the lack of change in
default indentation of `begin' blocks.

Fixes: debbugs:16182
parent 26b75b45
......@@ -714,6 +714,8 @@ whether it is safe to use Bash's --noediting option. These days
*** Add more Ruby file types to `auto-mode-alist'.
*** New option `ruby-align-to-stmt-keywords'.
** JS Mode
*** Better indentation of multiple-variable declarations.
......
2013-12-20 Dmitry Gutov <dgutov@yandex.ru>
* progmodes/ruby-mode.el (ruby-align-to-stmt-keywords): New
option. (Bug#16182)
(ruby-smie--indent-to-stmt-p): Use it.
(ruby-smie-rules): Revert the logic in the handling of `when'.
Expand the begin clause to handle `ruby-align-to-stmt-keywords'.
(ruby-deep-arglist, ruby-deep-indent-paren)
(ruby-deep-indent-paren-style): Update docstrings to note that the
vars don't have any effect with SMIE.
2013-12-20 Jay Belanger <jay.p.belanger@gmail.com>
* calc/calc.el (calc-enter, calc-pop): Use the variable
......
......@@ -226,9 +226,48 @@ This should only be called after matching against `ruby-here-doc-beg-re'."
:group 'ruby
:safe 'integerp)
(defcustom ruby-align-to-stmt-keywords nil
"Keywords to align their expression body to statement.
When nil, an expression that begins with one these keywords is
indented to the column of the keyword. Example:
tee = if foo
bar
else
qux
end
If this value is t or contains a symbol with the name of given
keyword, the expression is indented to align to the beginning of
the statement:
tee = if foo
bar
else
qux
end
Only has effect when `ruby-use-smie' is t.
"
:type '(choice
(const :tag "None" nil)
(const :tag "All" t)
(repeat :tag "User defined"
(choice (const if)
(const while)
(const unless)
(const until)
(const begin)
(const case)
(const for))))
:group 'ruby
:safe 'listp
:version "24.4")
(defcustom ruby-deep-arglist t
"Deep indent lists in parenthesis when non-nil.
Also ignores spaces after parenthesis when 'space."
Also ignores spaces after parenthesis when `space'.
Only has effect when `ruby-use-smie' is nil."
:type 'boolean
:group 'ruby
:safe 'booleanp)
......@@ -236,11 +275,13 @@ Also ignores spaces after parenthesis when 'space."
(defcustom ruby-deep-indent-paren '(?\( ?\[ ?\] t)
"Deep indent lists in parenthesis when non-nil.
The value t means continuous line.
Also ignores spaces after parenthesis when 'space."
Also ignores spaces after parenthesis when `space'.
Only has effect when `ruby-use-smie' is nil."
:group 'ruby)
(defcustom ruby-deep-indent-paren-style 'space
"Default deep indent style."
"Default deep indent style.
Only has effect when `ruby-use-smie' is nil."
:options '(t nil space) :group 'ruby)
(defcustom ruby-encoding-map
......@@ -520,6 +561,10 @@ It is used when `ruby-encoding-magic-comment-style' is set to `custom'."
(smie-backward-sexp ";")
(cons 'column (smie-indent-virtual))))
(defun ruby-smie--indent-to-stmt-p (keyword)
(or (eq t ruby-align-to-stmt-keywords)
(memq (intern keyword) ruby-align-to-stmt-keywords)))
(defun ruby-smie-rules (kind token)
(pcase (cons kind token)
(`(:elem . basic) ruby-indent-level)
......@@ -572,7 +617,9 @@ It is used when `ruby-encoding-magic-comment-style' is set to `custom'."
(`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure"))
(smie-rule-parent))
(`(:before . "when")
(if (not (smie-rule-sibling-p)) 0)) ;; ruby-indent-level
;; Align to the previous `when', but look up the virtual
;; indentation of `case'.
(if (smie-rule-sibling-p) 0 (smie-rule-parent)))
(`(:after . ,(or "=" "iuwu-mod" "+" "-" "*" "/" "&&" "||" "%" "**" "^" "&"
"<=>" ">" "<" ">=" "<=" "==" "===" "!=" "<<" ">>"
"+=" "-=" "*=" "/=" "%=" "**=" "&=" "|=" "^=" "|"
......@@ -581,9 +628,11 @@ It is used when `ruby-encoding-magic-comment-style' is set to `custom'."
(smie-indent--hanging-p)
ruby-indent-level))
(`(:after . ,(or "?" ":")) ruby-indent-level)
(`(:before . "begin")
(unless (save-excursion (skip-chars-backward " \t") (bolp))
(smie-rule-parent)))
(`(:before . ,(or "if" "while" "unless" "until" "begin" "case" "for"))
(when (not (save-excursion (skip-chars-backward " \t") (bolp)))
(if (ruby-smie--indent-to-stmt-p token)
(ruby-smie--indent-to-stmt)
(cons 'column (current-column)))))
))
(defun ruby-imenu-create-index-in-block (prefix beg end)
......
2013-12-20 Dmitry Gutov <dgutov@yandex.ru>
* automated/ruby-mode-tests.el: Add tests for
`ruby-align-to-stmt-keywords'.
* indent/ruby.rb: Update examples to reflect the lack of change in
default indentation of `begin' blocks.
2013-12-17 Dmitry Gutov <dgutov@yandex.ru>
* indent/ruby.rb: Update examples according to the change
......
......@@ -282,6 +282,57 @@ VALUES-PLIST is a list with alternating index and value elements."
| 3)
|")))
(ert-deftest ruby-align-to-stmt-keywords-t ()
(let ((ruby-align-to-stmt-keywords t))
(ruby-should-indent-buffer
"foo = if bar?
| 1
|else
| 2
|end
|
|foo || begin
| bar
|end
|
|foo ||
| begin
| bar
| end
|"
"foo = if bar?
| 1
|else
| 2
| end
|
| foo || begin
| bar
|end
|
| foo ||
| begin
|bar
| end
|")
))
(ert-deftest ruby-align-to-stmt-keywords-case ()
(let ((ruby-align-to-stmt-keywords '(case)))
(ruby-should-indent-buffer
"b = case a
|when 13
| 6
|else
| 42
|end"
"b = case a
| when 13
| 6
| else
| 42
| end")))
(ert-deftest ruby-move-to-block-stops-at-indentation ()
(ruby-with-temp-buffer "def f\nend"
(beginning-of-line)
......
......@@ -114,17 +114,17 @@ def test2 (arg)
puts "there"
end
case a
when "a"
6
# Support for this syntax was removed in Ruby 1.9, so we
# probably don't need to handle it either.
# when "b" :
# 7
# when "c" : 2
when "d" then 4
else 5
end
b = case a
when "a"
6
# Support for this syntax was removed in Ruby 1.9, so we
# probably don't need to handle it either.
# when "b" :
# 7
# when "c" : 2
when "d" then 4
else 5
end
end
# Some Cucumber code:
......@@ -321,18 +321,13 @@ def bar
foo |
bar
foo ||
begin
bar
end
def qux
foo ||= begin
bar
tee
rescue
oomph
end
bar
tee
rescue
oomph
end
end
%^abc^
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment