]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/progmodes/ruby-mode.el (ruby-mode-map): Add binding for
authorDmitry Gutov <dgutov@yandex.ru>
Mon, 21 Oct 2013 03:50:06 +0000 (07:50 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Mon, 21 Oct 2013 03:50:06 +0000 (07:50 +0400)
`smie-down-list'.
(ruby-smie--args-separator-p): Check that there's no newline
between method call and its arguments.
(ruby-smie-rules): Handle new cases: curly block with and without
parameters, hash surrounded with parens, block passed to
paren-less method call.

* test/indent/ruby.rb: New examples for indentation of blocks.  Example
of hash inside parens that inflooped before this commit.

lisp/ChangeLog
lisp/progmodes/ruby-mode.el
test/ChangeLog
test/indent/ruby.rb

index ecb5ef0e70ed7086963bc89f6d7c1f86127545d7..c57ac41171cbcc290167a75ecf239e630648bd22 100644 (file)
@@ -1,3 +1,10 @@
+2013-10-21  Dmitry Gutov  <dgutov@yandex.ru>
+
+       * progmodes/ruby-mode.el (ruby-mode-map): Add binding for
+       `smie-down-list'.
+       (ruby-smie--args-separator-p): Check that there's no newline
+       between method call and its arguments.
+
 2013-10-20  Alan Mackenzie  <acm@muc.de>
 
        Allow comma separated lists after Java "implements".
index a29540ad3a3dfd6b7bf19f0797bcd0cf85ed343f..6abc525f705588bc93bc819f509108d4c4fa4ce9 100644 (file)
@@ -152,6 +152,8 @@ This should only be called after matching against `ruby-here-doc-beg-re'."
       (define-key map (kbd "M-C-b") 'ruby-backward-sexp)
       (define-key map (kbd "M-C-f") 'ruby-forward-sexp)
       (define-key map (kbd "M-C-q") 'ruby-indent-exp))
+    (when ruby-use-smie
+      (define-key map (kbd "M-C-d") 'smie-down-list))
     (define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
     (define-key map (kbd "M-C-n") 'ruby-end-of-block)
     (define-key map (kbd "C-c {") 'ruby-toggle-block)
@@ -327,10 +329,10 @@ explicitly declared in magic comment."
 
 (defun ruby-smie--args-separator-p (pos)
   (and
+   (< pos (line-end-position))
    (or (eq (char-syntax (preceding-char)) '?w)
        (and (memq (preceding-char) '(?! ??))
             (eq (char-syntax (char-before (1- (point)))) '?w)))
-   (< pos (point-max))
    (memq (char-syntax (char-after pos)) '(?w ?\"))))
 
 (defun ruby-smie--forward-id ()
@@ -440,20 +442,39 @@ explicitly declared in magic comment."
     (`(:elem . args) (if (looking-at "\\s\"") 0))
     ;; (`(:after . ",") (smie-rule-separator kind))
     (`(:after . ";")
-     (if (smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
-                             "while" "until" "unless"
-                             "if" "then" "elsif" "else" "when"
-                             "rescue" "ensure")
-         (smie-rule-parent ruby-indent-level)
-       ;; For (invalid) code between switch and case.
-       ;; (if (smie-parent-p "switch") 4)
-       0))
+     (cond
+      ((smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
+                           "while" "until" "unless"
+                           "if" "then" "elsif" "else" "when"
+                           "rescue" "ensure")
+       (smie-rule-parent ruby-indent-level))
+      ((and (smie-rule-parent-p "{")
+            (save-excursion
+              (goto-char (1+ (cadr (smie-indent--parent))))
+              (ruby-smie--opening-pipe-p)
+              (forward-char -1)
+              ;; Can't delegate to `smie-rule-parent' because it
+              ;; short-circuits to `current-column' when the parent
+              ;; token is of paren syntax class and not hanging.
+              (cons 'column (+ (smie-indent-virtual)
+                               ruby-indent-level)))))
+      ;; For (invalid) code between switch and case.
+      ;; (if (smie-parent-p "switch") 4)
+      (t 0)))
     (`(:before . ,(or `"(" `"[" `"{"))
-     ;; Treat purely syntactic block-constructs as being part of their parent,
-     ;; when the opening statement is hanging.
-     (when (smie-rule-hanging-p)
-       (smie-backward-sexp 'halfsexp) (smie-indent-virtual)))
+     (cond
+      ((and (equal token "{")
+            (not (smie-rule-prev-p "(" "{" "[" "," "=>")))
+       ;; Curly block opener.
+       (smie-rule-parent))
+      ((smie-rule-hanging-p)
+       ;; Treat purely syntactic block-constructs as being part of their parent,
+       ;; when the opening statement is hanging.
+       (let ((state (smie-backward-sexp 'halfsexp)))
+         (when (eq t (car state)) (goto-char (cadr state))))
+       (cons 'column  (smie-indent-virtual)))))
     (`(:after . ,(or "=" "iuwu-mod")) 2)
+    (`(:after . " @ ") (smie-rule-parent))
     (`(:before . "do") (smie-rule-parent))
     (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0)
     (`(:before . ,(or `"when"))
index 9a8a61eb062623ce6b87ce536efcfb3a947fd022..609a4e2d007478c40c51ad9242a573130f41b6cc 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-21  Dmitry Gutov  <dgutov@yandex.ru>
+
+       * indent/ruby.rb: New examples for indentation of blocks.  Example
+       of hash inside parens that inflooped before the present commit.
+
 2013-10-17  Barry O'Reilly  <gundaetiapo@gmail.com>
 
        * test/automated/timer-tests.el: New file.  Tests that (sit-for 0)
index ef89ebc1aa767d7d9b7c61f7fb72793ac11cc8a1..56966ebb8c04589997512dbcdef58672c9334012 100644 (file)
@@ -40,6 +40,11 @@ foo = {                         # ruby-deep-indent-disabled
   a: b
 }
 
+foo({
+     a: b,
+     c: d
+   })
+
 foo = [                         # ruby-deep-indent-disabled
   1
 ]
@@ -165,6 +170,18 @@ method? arg1,
 method! arg1,
         arg2
 
+it "is a method call with block" do |asd|
+  foo
+end
+
+it("is too!") {
+  bar
+}
+
+and_this_one(has) { |block, parameters|
+  tee
+}
+
 # Examples below still fail with `ruby-use-smie' on:
 
 foo +
@@ -192,11 +209,3 @@ method :foo,
 
 method (a + b),
        c
-
-it "is a method call with block" do
-  foo
-end
-
-it("is too!") {
-  bar
-}