aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/ruby-mode.el
diff options
context:
space:
mode:
authorDmitry Gutov2012-09-09 03:32:25 +0400
committerDmitry Gutov2012-09-09 03:32:25 +0400
commitc3268831411fd68ce4f6f84ecda5eda2814a59a8 (patch)
tree73bf19e8bfbead6b975c923d0df4d7d44ae4a7bf /lisp/progmodes/ruby-mode.el
parent9d7f18633a3f36de96bb42d856355c5ce12f2b5d (diff)
downloademacs-c3268831411fd68ce4f6f84ecda5eda2814a59a8.tar.gz
emacs-c3268831411fd68ce4f6f84ecda5eda2814a59a8.zip
* lisp/progmodes/ruby-mode.el (ruby-toggle-block): Guess the current block,
not just expect to be at its beginning. Adjust callees. Succeed when do-end block has no space before the pipe character. (ruby-brace-to-do-end): When the original block is one-liner, convert to multiline. Reindent the result. * test/automated/ruby-mode-tests.el: (ruby-toggle-block-to-multiline): New test. (ruby-should-indent-buffer, ruby-toggle-block-to-do-end) (ruby-toggle-block-to-brace): Use buffer-string.
Diffstat (limited to 'lisp/progmodes/ruby-mode.el')
-rw-r--r--lisp/progmodes/ruby-mode.el93
1 files changed, 56 insertions, 37 deletions
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 947c12560a1..77ec8084ea2 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -1107,46 +1107,65 @@ See `add-log-current-defun-function'."
1107 (if mlist (concat mlist mname) mname) 1107 (if mlist (concat mlist mname) mname)
1108 mlist))))) 1108 mlist)))))
1109 1109
1110(defun ruby-brace-to-do-end () 1110(defun ruby-brace-to-do-end (orig end)
1111 (when (looking-at "{") 1111 (let (beg-marker end-marker)
1112 (let ((orig (point)) (end (progn (ruby-forward-sexp) (point)))) 1112 (goto-char end)
1113 (when (eq (char-before) ?\}) 1113 (when (eq (char-before) ?\})
1114 (delete-char -1) 1114 (delete-char -1)
1115 (if (eq (char-syntax (char-before)) ?w) 1115 (skip-chars-backward " \t")
1116 (insert " ")) 1116 (when (not (bolp))
1117 (insert "end") 1117 (insert "\n"))
1118 (if (eq (char-syntax (char-after)) ?w) 1118 (insert "end")
1119 (insert " ")) 1119 (setq end-marker (point-marker))
1120 (goto-char orig) 1120 (when (and (not (eobp)) (eq (char-syntax (char-after)) ?w))
1121 (delete-char 1) 1121 (insert " "))
1122 (if (eq (char-syntax (char-before)) ?w) 1122 (goto-char orig)
1123 (insert " ")) 1123 (delete-char 1)
1124 (insert "do") 1124 (when (eq (char-syntax (char-before)) ?w)
1125 (when (looking-at "\\sw\\||") 1125 (insert " "))
1126 (insert " ") 1126 (insert "do")
1127 (backward-char)) 1127 (setq beg-marker (point-marker))
1128 t)))) 1128 (when (looking-at "\\(\\s \\)*|")
1129 1129 (unless (match-beginning 1)
1130(defun ruby-do-end-to-brace () 1130 (insert " "))
1131 (when (and (or (bolp) 1131 (goto-char (1+ (match-end 0)))
1132 (not (memq (char-syntax (char-before)) '(?w ?_)))) 1132 (search-forward "|"))
1133 (looking-at "\\<do\\(\\s \\|$\\)")) 1133 (unless (looking-at "\\s *$")
1134 (let ((orig (point)) (end (progn (ruby-forward-sexp) (point)))) 1134 (insert "\n"))
1135 (backward-char 3) 1135 (indent-region beg-marker end-marker)
1136 (when (looking-at ruby-block-end-re) 1136 (goto-char beg-marker)
1137 (delete-char 3) 1137 t)))
1138 (insert "}") 1138
1139 (goto-char orig) 1139(defun ruby-do-end-to-brace (orig end)
1140 (delete-char 2) 1140 (goto-char (- end 3))
1141 (insert "{") 1141 (when (looking-at ruby-block-end-re)
1142 (if (looking-at "\\s +|") 1142 (delete-char 3)
1143 (delete-char (- (match-end 0) (match-beginning 0) 1))) 1143 (insert "}")
1144 t)))) 1144 (goto-char orig)
1145 (delete-char 2)
1146 (insert "{")
1147 (if (looking-at "\\s +|")
1148 (delete-char (- (match-end 0) (match-beginning 0) 1)))
1149 t))
1145 1150
1146(defun ruby-toggle-block () 1151(defun ruby-toggle-block ()
1152 "Toggle block type from do-end to braces or back.
1153The block must begin on the current line or above it and end after the point.
1154If the result is do-end block, it will always be multiline."
1147 (interactive) 1155 (interactive)
1148 (or (ruby-brace-to-do-end) 1156 (let ((start (point)) beg end)
1149 (ruby-do-end-to-brace))) 1157 (end-of-line)
1158 (unless
1159 (if (and (re-search-backward "\\({\\)\\|\\_<do\\(\\s \\|$\\||\\)")
1160 (progn
1161 (setq beg (point))
1162 (save-match-data (ruby-forward-sexp))
1163 (setq end (point))
1164 (> end start)))
1165 (if (match-beginning 1)
1166 (ruby-brace-to-do-end beg end)
1167 (ruby-do-end-to-brace beg end)))
1168 (goto-char start))))
1150 1169
1151(declare-function ruby-syntax-propertize-heredoc "ruby-mode" (limit)) 1170(declare-function ruby-syntax-propertize-heredoc "ruby-mode" (limit))
1152(declare-function ruby-syntax-enclosing-percent-literal "ruby-mode" (limit)) 1171(declare-function ruby-syntax-enclosing-percent-literal "ruby-mode" (limit))