From: Dmitry Gutov Date: Mon, 21 Oct 2013 03:50:06 +0000 (+0400) Subject: * lisp/progmodes/ruby-mode.el (ruby-mode-map): Add binding for X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1200 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=8c1ae48154e4c6935da3120362ea535f0dddfec5;p=emacs.git * lisp/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. (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. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ecb5ef0e70e..c57ac41171c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2013-10-21 Dmitry Gutov + + * 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 Allow comma separated lists after Java "implements". diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index a29540ad3a3..6abc525f705 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -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")) diff --git a/test/ChangeLog b/test/ChangeLog index 9a8a61eb062..609a4e2d007 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2013-10-21 Dmitry Gutov + + * 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 * test/automated/timer-tests.el: New file. Tests that (sit-for 0) diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb index ef89ebc1aa7..56966ebb8c0 100644 --- a/test/indent/ruby.rb +++ b/test/indent/ruby.rb @@ -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 -}