diff --git a/ChangeLog b/ChangeLog index e3d5482916..5b1ae043ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Dec 3 12:43:35 2012 Nobuyoshi Nakada + + * misc/ruby-mode.el (ruby-block-end-re, ruby-delimiter) + (ruby-mode-syntax-table, ruby-parse-partial, ruby-beginning-of-indent): + merge from Emacs. + + * misc/ruby-mode.el (ruby-calculate-indent): fix indentation of + argument lines in parentheses. [Bug #5140] + Mon Dec 3 07:52:41 2012 Eric Hodel * lib/rdoc/parser.rb: Improved modeline support. Patch by nobu. diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index d3e2e51d02..dcaa396a2e 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -104,7 +104,7 @@ (regexp-opt (append ruby-modifier-beg-keywords ruby-block-op-keywords)) "Regexp to match hanging block modifiers.") -(defconst ruby-block-end-re "\\") +(defconst ruby-block-end-re "\\_") (defconst ruby-here-doc-beg-re "\\(<\\)<\\(-\\)?\\(\\([a-zA-Z0-9_]+\\)\\|[\"]\\([^\"]+\\)[\"]\\|[']\\([^']+\\)[']\\)") @@ -132,9 +132,9 @@ (concat "-?\\([\"']\\|\\)" contents "\\1")))))) (defconst ruby-delimiter - (concat "[?$/%(){}#\"'`.:]\\|<<\\|\\[\\|\\]\\|\\<\\(" + (concat "[?$/%(){}#\"'`.:]\\|<<\\|\\[\\|\\]\\|\\_<\\(" ruby-block-beg-re - "\\)\\>\\|" ruby-block-end-re + "\\)\\_>\\|" ruby-block-end-re "\\|^=begin\\|" ruby-here-doc-beg-re) ) @@ -190,6 +190,7 @@ (modify-syntax-entry ?$ "." ruby-mode-syntax-table) (modify-syntax-entry ?? "_" ruby-mode-syntax-table) (modify-syntax-entry ?_ "_" ruby-mode-syntax-table) + (modify-syntax-entry ?: "_" ruby-mode-syntax-table) (modify-syntax-entry ?< "." ruby-mode-syntax-table) (modify-syntax-entry ?> "." ruby-mode-syntax-table) (modify-syntax-entry ?& "." ruby-mode-syntax-table) @@ -601,7 +602,7 @@ Also ignores spaces after parenthesis when 'space." (setq nest (cons (cons nil pnt) nest)) (setq depth (1+ depth)))) (goto-char (match-end 0))) - ((looking-at (concat "\\<\\(" ruby-block-beg-re "\\)\\>")) + ((looking-at (concat "\\_<\\(" ruby-block-beg-re "\\)\\_>")) (and (save-match-data (or (not (looking-at (concat "do" ruby-keyword-end-re))) @@ -731,6 +732,9 @@ Also ignores spaces after parenthesis when 'space." (cond ((and (eq deep t) (eq (car (nth 1 state)) paren)) (skip-syntax-backward " ") (setq indent (1- (current-column)))) + ((eq deep 'space) + (goto-char (cdr (nth 1 state))) + (setq indent (1+ (current-column)))) ((let ((s (ruby-parse-region (point) ruby-indent-point))) (and (nth 2 s) (> (nth 2 s) 0) (or (goto-char (cdr (nth 1 s))) t))) @@ -890,12 +894,12 @@ Also ignores spaces after parenthesis when 'space." With argument, do this that many times. Returns t unless search stops due to end of buffer." (interactive "p") - (and (re-search-backward (concat "^\\(" ruby-block-beg-re "\\)\\b") + (and (re-search-backward (concat "^\\(" ruby-block-beg-re "\\)\\_>") nil 'move (or arg 1)) (progn (beginning-of-line) t))) (defun ruby-beginning-of-indent () - (and (re-search-backward (concat "^\\(" ruby-indent-beg-re "\\)\\b") + (and (re-search-backward (concat "^\\(" ruby-indent-beg-re "\\)\\_>") nil 'move) (progn (beginning-of-line) @@ -1373,7 +1377,7 @@ buffer position `limit' or the end of the buffer." 1 font-lock-function-name-face) ;; keywords (cons (concat - "\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(defined\\?\\|" + "\\(^\\|[^_:.@$]\\|\\.\\.\\)\\_<\\(defined\\?\\|" (regexp-opt '("alias" "and" @@ -1418,7 +1422,7 @@ buffer position `limit' or the end of the buffer." ;; here-doc beginnings (list ruby-here-doc-beg-re 0 'font-lock-string-face) ;; variables - '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\>" + '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\_<\\(nil\\|self\\|true\\|false\\)\\>" 2 font-lock-variable-name-face) ;; variables '("\\(\\$\\([^a-zA-Z0-9 \n]\\|[0-9]\\)\\)\\W" @@ -1434,7 +1438,7 @@ buffer position `limit' or the end of the buffer." '("\\(^\\|[[ \t\n<+(,=]\\)\\(%[xrqQwW]?\\([^<[{(a-zA-Z0-9 \n]\\)[^\n\\\\]*\\(\\\\.[^\n\\\\]*\\)*\\(\\3\\)\\)" (2 font-lock-string-face)) ;; constants - '("\\(^\\|[^_]\\)\\b\\([A-Z]+\\(\\w\\|_\\)*\\)" + '("\\(^\\|[^_]\\)\\_<\\([A-Z]+\\(\\w\\|_\\)*\\)" 2 font-lock-type-face) ;; symbols '("\\(^\\|[^:]\\)\\(:\\([-+~]@?\\|[/%&|^`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|![~=]?\\|\\[\\]=?\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b_*\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)" diff --git a/test/misc/test_ruby_mode.rb b/test/misc/test_ruby_mode.rb index d654cdc34b..e011ece1cf 100644 --- a/test/misc/test_ruby_mode.rb +++ b/test/misc/test_ruby_mode.rb @@ -165,5 +165,17 @@ class TestRubyMode | end |') end + + def test_spread_arguments + assert_indent(' + |foo(1, + | 2, + | 3) + |', ' + |foo(1, + | 2, + | 3) + |') + end end end if TestRubyMode::EMACS