@@ -154,6 +154,7 @@ should_dedent(mirb_buffer *buf, char last_char)
154154{
155155const char *line = mirb_buffer_current_line(buf);
156156size_t col = buf->cursor_col;
157+size_t line_len = buf->lines[buf->cursor_line].len;
157158158159/* Check for '}' - dedent immediately when typed at line start */
159160if (last_char == '}') {
@@ -162,21 +163,39 @@ should_dedent(mirb_buffer *buf, char last_char)
162163 }
163164 }
164165165-/* Check for 'end' - dedent when 'd' completes "end" */
166-if (last_char == 'd' && col >= 3) {
167-/* Check if we just completed "end" */
168-if (line[col - 3] == 'e' && line[col - 2] == 'n' && line[col - 1] == 'd') {
169-/* Verify only whitespace before "end" */
170-if (col == 3 || line_is_blank_before(line, col - 3)) {
171-/* Verify "end" is not part of a longer word */
172-if (col == buf->lines[buf->cursor_line].len ||
173-line[col] == ' ' || line[col] == '\t' || line[col] == '\0' ||
174-line[col] == '\n' || line[col] == '.' || line[col] == ')') {
175-return TRUE;
176- }
177- }
166+/* Helper macro: check keyword completion */
167+#define CHECK_KEYWORD(keyword, len, trigger_char) \
168+ if (last_char == trigger_char && col >= len) { \
169+ if (strncmp(line + col - len, keyword, len) == 0) { \
170+ if (col == len || line_is_blank_before(line, col - len)) { \
171+ if (col == line_len || \
172+ line[col] == ' ' || line[col] == '\t' || line[col] == '\0' || \
173+ line[col] == '\n' || line[col] == '.' || line[col] == ')') { \
174+ return TRUE; \
175+ } \
176+ } \
177+ } \
178178 }
179- }
179+180+/* Check for 'end' - dedent when 'd' completes "end" */
181+CHECK_KEYWORD("end", 3, 'd');
182+183+/* Check for 'else' - dedent when 'e' completes "else" */
184+CHECK_KEYWORD("else", 4, 'e');
185+186+/* Check for 'elsif' - dedent when 'f' completes "elsif" */
187+CHECK_KEYWORD("elsif", 5, 'f');
188+189+/* Check for 'when' - dedent when 'n' completes "when" */
190+CHECK_KEYWORD("when", 4, 'n');
191+192+/* Check for 'rescue' - dedent when 'e' completes "rescue" */
193+CHECK_KEYWORD("rescue", 6, 'e');
194+195+/* Check for 'ensure' - dedent when 'e' completes "ensure" */
196+CHECK_KEYWORD("ensure", 6, 'e');
197+198+#undef CHECK_KEYWORD
180199181200return FALSE;
182201}