GitHub

@@ -154,6 +154,7 @@ should_dedent(mirb_buffer *buf, char last_char)

154154

{

155155

const char *line = mirb_buffer_current_line(buf);

156156

size_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 */

159160

if (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

180199181200

return FALSE;

182201

}

Read the original on github.com ↗