diff options
| author | Dmitry Gutov | 2012-09-09 03:32:25 +0400 |
|---|---|---|
| committer | Dmitry Gutov | 2012-09-09 03:32:25 +0400 |
| commit | c3268831411fd68ce4f6f84ecda5eda2814a59a8 (patch) | |
| tree | 73bf19e8bfbead6b975c923d0df4d7d44ae4a7bf /lisp/progmodes/ruby-mode.el | |
| parent | 9d7f18633a3f36de96bb42d856355c5ce12f2b5d (diff) | |
| download | emacs-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.el | 93 |
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. | ||
| 1153 | The block must begin on the current line or above it and end after the point. | ||
| 1154 | If 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)) |