aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/ruby-mode.el
diff options
context:
space:
mode:
authorDmitry Gutov2013-10-21 07:50:06 +0400
committerDmitry Gutov2013-10-21 07:50:06 +0400
commit8c1ae48154e4c6935da3120362ea535f0dddfec5 (patch)
treed8c450d065eeb0820bbcd4ddd7f9233b73a1af69 /lisp/progmodes/ruby-mode.el
parenta9f8deecce02a4acdb5259297878799b69d56a21 (diff)
downloademacs-8c1ae48154e4c6935da3120362ea535f0dddfec5.tar.gz
emacs-8c1ae48154e4c6935da3120362ea535f0dddfec5.zip
* 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.
Diffstat (limited to 'lisp/progmodes/ruby-mode.el')
-rw-r--r--lisp/progmodes/ruby-mode.el47
1 files changed, 34 insertions, 13 deletions
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'."
152 (define-key map (kbd "M-C-b") 'ruby-backward-sexp) 152 (define-key map (kbd "M-C-b") 'ruby-backward-sexp)
153 (define-key map (kbd "M-C-f") 'ruby-forward-sexp) 153 (define-key map (kbd "M-C-f") 'ruby-forward-sexp)
154 (define-key map (kbd "M-C-q") 'ruby-indent-exp)) 154 (define-key map (kbd "M-C-q") 'ruby-indent-exp))
155 (when ruby-use-smie
156 (define-key map (kbd "M-C-d") 'smie-down-list))
155 (define-key map (kbd "M-C-p") 'ruby-beginning-of-block) 157 (define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
156 (define-key map (kbd "M-C-n") 'ruby-end-of-block) 158 (define-key map (kbd "M-C-n") 'ruby-end-of-block)
157 (define-key map (kbd "C-c {") 'ruby-toggle-block) 159 (define-key map (kbd "C-c {") 'ruby-toggle-block)
@@ -327,10 +329,10 @@ explicitly declared in magic comment."
327 329
328(defun ruby-smie--args-separator-p (pos) 330(defun ruby-smie--args-separator-p (pos)
329 (and 331 (and
332 (< pos (line-end-position))
330 (or (eq (char-syntax (preceding-char)) '?w) 333 (or (eq (char-syntax (preceding-char)) '?w)
331 (and (memq (preceding-char) '(?! ??)) 334 (and (memq (preceding-char) '(?! ??))
332 (eq (char-syntax (char-before (1- (point)))) '?w))) 335 (eq (char-syntax (char-before (1- (point)))) '?w)))
333 (< pos (point-max))
334 (memq (char-syntax (char-after pos)) '(?w ?\")))) 336 (memq (char-syntax (char-after pos)) '(?w ?\"))))
335 337
336(defun ruby-smie--forward-id () 338(defun ruby-smie--forward-id ()
@@ -440,20 +442,39 @@ explicitly declared in magic comment."
440 (`(:elem . args) (if (looking-at "\\s\"") 0)) 442 (`(:elem . args) (if (looking-at "\\s\"") 0))
441 ;; (`(:after . ",") (smie-rule-separator kind)) 443 ;; (`(:after . ",") (smie-rule-separator kind))
442 (`(:after . ";") 444 (`(:after . ";")
443 (if (smie-rule-parent-p "def" "begin" "do" "class" "module" "for" 445 (cond
444 "while" "until" "unless" 446 ((smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
445 "if" "then" "elsif" "else" "when" 447 "while" "until" "unless"
446 "rescue" "ensure") 448 "if" "then" "elsif" "else" "when"
447 (smie-rule-parent ruby-indent-level) 449 "rescue" "ensure")
448 ;; For (invalid) code between switch and case. 450 (smie-rule-parent ruby-indent-level))
449 ;; (if (smie-parent-p "switch") 4) 451 ((and (smie-rule-parent-p "{")
450 0)) 452 (save-excursion
453 (goto-char (1+ (cadr (smie-indent--parent))))
454 (ruby-smie--opening-pipe-p)
455 (forward-char -1)
456 ;; Can't delegate to `smie-rule-parent' because it
457 ;; short-circuits to `current-column' when the parent
458 ;; token is of paren syntax class and not hanging.
459 (cons 'column (+ (smie-indent-virtual)
460 ruby-indent-level)))))
461 ;; For (invalid) code between switch and case.
462 ;; (if (smie-parent-p "switch") 4)
463 (t 0)))
451 (`(:before . ,(or `"(" `"[" `"{")) 464 (`(:before . ,(or `"(" `"[" `"{"))
452 ;; Treat purely syntactic block-constructs as being part of their parent, 465 (cond
453 ;; when the opening statement is hanging. 466 ((and (equal token "{")
454 (when (smie-rule-hanging-p) 467 (not (smie-rule-prev-p "(" "{" "[" "," "=>")))
455 (smie-backward-sexp 'halfsexp) (smie-indent-virtual))) 468 ;; Curly block opener.
469 (smie-rule-parent))
470 ((smie-rule-hanging-p)
471 ;; Treat purely syntactic block-constructs as being part of their parent,
472 ;; when the opening statement is hanging.
473 (let ((state (smie-backward-sexp 'halfsexp)))
474 (when (eq t (car state)) (goto-char (cadr state))))
475 (cons 'column (smie-indent-virtual)))))
456 (`(:after . ,(or "=" "iuwu-mod")) 2) 476 (`(:after . ,(or "=" "iuwu-mod")) 2)
477 (`(:after . " @ ") (smie-rule-parent))
457 (`(:before . "do") (smie-rule-parent)) 478 (`(:before . "do") (smie-rule-parent))
458 (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0) 479 (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0)
459 (`(:before . ,(or `"when")) 480 (`(:before . ,(or `"when"))