Revision: 808 http://svn.sourceforge.net/geany/?rev=808&view=rev Author: eht16 Date: 2006-09-10 04:47:26 -0700 (Sun, 10 Sep 2006)
Log Message: ----------- Added comment toggle functionality to easily comment and uncomment a line with one shortcut (default Ctrl+B) (closes #1552184).
Modified Paths: -------------- trunk/ChangeLog trunk/src/callbacks.c trunk/src/keybindings.c trunk/src/keybindings.h trunk/src/sci_cb.c trunk/src/sci_cb.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/ChangeLog 2006-09-10 11:47:26 UTC (rev 808) @@ -1,3 +1,10 @@ +2006-09-10 Enrico Tröger enrico.troeger@uvena.de + + * src/sci_cb.c, src/keybindings.c, src/callbacks.c: + Added comment toggle functionality to easily comment and uncomment a + line with one shortcut (default Ctrl+B) (closes #1552184). + + 2006-09-09 Nick Treleaven nick.treleaven@btinternet.com
* src/document.c, src/ui_utils.c:
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/src/callbacks.c 2006-09-10 11:47:26 UTC (rev 808) @@ -2455,7 +2455,7 @@ { gint idx = document_get_cur_idx(); if (idx == -1 || ! doc_list[idx].is_valid) return; - sci_cb_do_comment(idx); + sci_cb_do_comment(idx, -1); }
@@ -2465,7 +2465,7 @@ { gint idx = document_get_cur_idx(); if (idx == -1 || ! doc_list[idx].is_valid) return; - sci_cb_do_uncomment(idx); + sci_cb_do_uncomment(idx, -1); }
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/src/keybindings.c 2006-09-10 11:47:26 UTC (rev 808) @@ -87,6 +87,7 @@ static void cb_func_toggle_sidebar(void); static void cb_func_edit_duplicateline(void); static void cb_func_edit_commentline(void); +static void cb_func_edit_commentlinetoggle(void); static void cb_func_edit_uncommentline(void); static void cb_func_edit_increaseindent(void); static void cb_func_edit_decreaseindent(void); @@ -197,6 +198,8 @@ GDK_Page_Down, GDK_CONTROL_MASK, "switch_tabright", _("Switch to right document")); keys[GEANY_KEYS_EDIT_DUPLICATELINE] = fill(cb_func_edit_duplicateline, GDK_g, GDK_CONTROL_MASK, "edit_duplicateline", _("Duplicate line or selection")); + keys[GEANY_KEYS_EDIT_COMMENTLINETOGGLE] = fill(cb_func_edit_commentlinetoggle, + GDK_b, GDK_CONTROL_MASK, "edit_commentlinetoggle", _("Toggle line commentation")); keys[GEANY_KEYS_EDIT_COMMENTLINE] = fill(cb_func_edit_commentline, GDK_d, GDK_CONTROL_MASK, "edit_commentline", _("Comment line")); keys[GEANY_KEYS_EDIT_UNCOMMENTLINE] = fill(cb_func_edit_uncommentline, @@ -716,6 +719,13 @@ on_menu_duplicate_line1_activate(NULL, NULL); }
+static void cb_func_edit_commentlinetoggle(void) +{ + gint idx = document_get_cur_idx(); + if (idx == -1 || ! doc_list[idx].is_valid) return; + sci_cb_do_comment_toggle(idx); +} + static void cb_func_edit_commentline(void) { on_menu_comment_line1_activate(NULL, NULL);
Modified: trunk/src/keybindings.h =================================================================== --- trunk/src/keybindings.h 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/src/keybindings.h 2006-09-10 11:47:26 UTC (rev 808) @@ -83,6 +83,7 @@ GEANY_KEYS_SWITCH_TABLEFT, GEANY_KEYS_SWITCH_TABRIGHT, GEANY_KEYS_EDIT_DUPLICATELINE, + GEANY_KEYS_EDIT_COMMENTLINETOGGLE, GEANY_KEYS_EDIT_COMMENTLINE, GEANY_KEYS_EDIT_UNCOMMENTLINE, GEANY_KEYS_EDIT_INCREASEINDENT,
Modified: trunk/src/sci_cb.c =================================================================== --- trunk/src/sci_cb.c 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/src/sci_cb.c 2006-09-10 11:47:26 UTC (rev 808) @@ -1013,7 +1013,6 @@ }
- void sci_cb_auto_table(ScintillaObject *sci, gint pos) { gchar *table; @@ -1046,31 +1045,98 @@ }
-void sci_cb_do_uncomment(gint idx) +static void real_comment_multiline(gint idx, gint line_start, gint last_line) { + gchar *eol, *str_begin, *str_end; + gint line_len; + + if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return; + + eol = utils_get_eol_char(idx); + str_begin = g_strdup_printf("%s%s", doc_list[idx].file_type->comment_open, eol); + str_end = g_strdup_printf("%s%s", doc_list[idx].file_type->comment_close, eol); + + // insert the comment strings + sci_insert_text(doc_list[idx].sci, line_start, str_begin); + line_len = sci_get_position_from_line(doc_list[idx].sci, last_line + 2); + sci_insert_text(doc_list[idx].sci, line_len, str_end); + + g_free(str_begin); + g_free(str_end); +} + + +static void real_uncomment_multiline(gint idx) +{ + // find the beginning of the multi line comment + gint pos, line, len, x; + gchar *linebuf; + + if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return; + + // remove comment open chars + pos = document_find_text(idx, doc_list[idx].file_type->comment_open, 0, TRUE); + SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); + + // check whether the line is empty and can be deleted + line = sci_get_line_from_position(doc_list[idx].sci, pos); + len = sci_get_line_length(doc_list[idx].sci, line); + linebuf = g_malloc(len + 1); + sci_get_line(doc_list[idx].sci, line, linebuf); + linebuf[len] = '\0'; + x = 0; + while (linebuf[x] != '\0' && isspace(linebuf[x])) x++; + if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0); + g_free(linebuf); + + // remove comment close chars + pos = document_find_text(idx, doc_list[idx].file_type->comment_close, 0, FALSE); + SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); + + // check whether the line is empty and can be deleted + line = sci_get_line_from_position(doc_list[idx].sci, pos); + len = sci_get_line_length(doc_list[idx].sci, line); + linebuf = g_malloc(len + 1); + sci_get_line(doc_list[idx].sci, line, linebuf); + linebuf[len] = '\0'; + x = 0; + while (linebuf[x] != '\0' && isspace(linebuf[x])) x++; + if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0); + g_free(linebuf); +} + + +void sci_cb_do_uncomment(gint idx, gint line) +{ gint first_line, last_line; gint x, i, line_start, line_len; gint sel_start, sel_end; gsize co_len; - gchar sel[64], *co, *cc; + gchar sel[256], *co, *cc; gboolean break_loop = FALSE, single_line = FALSE; filetype *ft;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
- sel_start = sci_get_selection_start(doc_list[idx].sci); - sel_end = sci_get_selection_end(doc_list[idx].sci); + if (line < 0) + { // use selection or current line + sel_start = sci_get_selection_start(doc_list[idx].sci); + sel_end = sci_get_selection_end(doc_list[idx].sci);
+ first_line = sci_get_line_from_position(doc_list[idx].sci, sel_start); + // Find the last line with chars selected (not EOL char) + last_line = sci_get_line_from_position(doc_list[idx].sci, sel_end - 1); + last_line = MAX(first_line, last_line); + } + else + { + first_line = last_line = line; + sel_start = sel_end = sci_get_position_from_line(doc_list[idx].sci, line); + } + ft = doc_list[idx].file_type;
- first_line = sci_get_line_from_position(doc_list[idx].sci, - sci_get_selection_start(doc_list[idx].sci)); - // Find the last line with chars selected (not EOL char) - last_line = sci_get_line_from_position(doc_list[idx].sci, - sci_get_selection_end(doc_list[idx].sci) - 1); - last_line = MAX(first_line, last_line); - - // hack for detection of HTML vs PHP code, if non-PHP set filetype to XML + // detection of HTML vs PHP code, if non-PHP set filetype to XML line_start = sci_get_position_from_line(doc_list[idx].sci, first_line); if (ft->id == GEANY_FILETYPES_PHP) { @@ -1094,9 +1160,9 @@ line_len = sci_get_line_length(doc_list[idx].sci, i); x = 0;
- //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(63, (line_len - 1)), line_len); - sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 63), (line_start + line_len - 1)), sel); - sel[MIN(63, (line_len - 1))] = '\0'; + //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len); + sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel); + sel[MIN(255, (line_len - 1))] = '\0';
while (isspace(sel[x])) x++;
@@ -1106,7 +1172,7 @@ // use single line comment if (cc == NULL || strlen(cc) == 0) { - guint i; + guint j;
single_line = TRUE;
@@ -1120,7 +1186,7 @@ }
SSM(doc_list[idx].sci, SCI_GOTOPOS, line_start + x + co_len, 0); - for (i = 0; i < co_len; i++) SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); + for (j = 0; j < co_len; j++) SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); } // use multi line comment else @@ -1149,39 +1215,7 @@ } if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) { - // find the beginning of the multi line comment - gint pos, line, len, x; - gchar *linebuf; - - // remove comment open chars - pos = document_find_text(idx, co, 0, TRUE); - SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); - - // check whether the line is empty and can be deleted - line = sci_get_line_from_position(doc_list[idx].sci, pos); - len = sci_get_line_length(doc_list[idx].sci, line); - linebuf = g_malloc(len + 1); - sci_get_line(doc_list[idx].sci, line, linebuf); - linebuf[len] = '\0'; - x = 0; - while (linebuf[x] != '\0' && isspace(linebuf[x])) x++; - if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0); - g_free(linebuf); - - // remove comment close chars - pos = document_find_text(idx, cc, 0, FALSE); - SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0); - - // check whether the line is empty and can be deleted - line = sci_get_line_from_position(doc_list[idx].sci, pos); - len = sci_get_line_length(doc_list[idx].sci, line); - linebuf = g_malloc(len + 1); - sci_get_line(doc_list[idx].sci, line, linebuf); - linebuf[len] = '\0'; - x = 0; - while (linebuf[x] != '\0' && isspace(linebuf[x])) x++; - if (x == len) SSM(doc_list[idx].sci, SCI_LINEDELETE, 0, 0); - g_free(linebuf); + real_uncomment_multiline(idx); }
// break because we are already on the last line @@ -1192,28 +1226,33 @@ } SSM(doc_list[idx].sci, SCI_ENDUNDOACTION, 0, 0);
- // restore selection - if (single_line) + // restore selection if there is one + if (sel_start < sel_end) { - sci_set_selection_start(doc_list[idx].sci, sel_start - co_len); - sci_set_selection_end(doc_list[idx].sci, sel_end - ((i - first_line) * co_len)); + if (single_line) + { + sci_set_selection_start(doc_list[idx].sci, sel_start - co_len); + sci_set_selection_end(doc_list[idx].sci, sel_end - ((i - first_line) * co_len)); + } + else + { + gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; + sci_set_selection_start(doc_list[idx].sci, sel_start - co_len - eol_len); + sci_set_selection_end(doc_list[idx].sci, sel_end - co_len - eol_len); + } } - else - { - gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; - sci_set_selection_start(doc_list[idx].sci, sel_start - co_len - eol_len); - sci_set_selection_end(doc_list[idx].sci, sel_end - co_len - eol_len); - } }
-void sci_cb_do_comment(gint idx) +void sci_cb_do_comment_toggle(gint idx) { gint first_line, last_line; gint x, i, line_start, line_len; gint sel_start, sel_end, co_len; - gchar sel[64], *co, *cc; + gint count_commented = 0, count_uncommented = 0; + gchar sel[256], *co, *cc; gboolean break_loop = FALSE, single_line = FALSE; + gboolean first_line_was_comment = FALSE; filetype *ft;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return; @@ -1230,7 +1269,7 @@ sci_get_selection_end(doc_list[idx].sci) - 1); last_line = MAX(first_line, last_line);
- // hack for detection of HTML vs PHP code, if non-PHP set filetype to XML + // detection of HTML vs PHP code, if non-PHP set filetype to XML line_start = sci_get_position_from_line(doc_list[idx].sci, first_line); if (ft->id == GEANY_FILETYPES_PHP) { @@ -1246,17 +1285,15 @@ co_len = strlen(co); if (co_len == 0) return;
- SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0); - for (i = first_line; (i <= last_line) && (! break_loop); i++) { line_start = sci_get_position_from_line(doc_list[idx].sci, i); line_len = sci_get_line_length(doc_list[idx].sci, i); x = 0;
- //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(63, (line_len - 1)), line_len); - sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 63), (line_start + line_len - 1)), sel); - sel[MIN(63, (line_len - 1))] = '\0'; + //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len); + sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel); + sel[MIN(255, (line_len - 1))] = '\0';
while (isspace(sel[x])) x++;
@@ -1266,20 +1303,196 @@ // use single line comment if (cc == NULL || strlen(cc) == 0) { - /* disabled because of #1521714, it makes sense to double(or triple, ...) comment - * if someone think it is not that good we could introduce a config option for it gboolean do_continue = FALSE; + single_line = TRUE; + switch (co_len) { - case 1: if (sel[x] == co[0]) do_continue = TRUE; break; - case 2: if (sel[x] == co[0] && sel[x+1] == co[1]) do_continue = TRUE; break; - case 3: if (sel[x] == co[0] && sel[x+1] == co[1] && sel[x+2] == co[2]) - do_continue = TRUE; break; + case 1: + if (sel[x] == co[0]) + { + do_continue = TRUE; + sci_cb_do_uncomment(idx, i); + count_uncommented++; + } + break; + case 2: + if (sel[x] == co[0] && sel[x+1] == co[1]) + { + do_continue = TRUE; + sci_cb_do_uncomment(idx, i); + count_uncommented++; + } + break; + case 3: + if (sel[x] == co[0] && sel[x+1] == co[1] && sel[x+2] == co[2]) + { + do_continue = TRUE; + sci_cb_do_uncomment(idx, i); + count_uncommented++; + } + break; default: return; } + if (do_continue && i == first_line) first_line_was_comment = TRUE; if (do_continue) continue; - */ + + // we are still here, so the above lines were not already comments, so comment it + sci_cb_do_comment(idx, i); + count_commented++; + } + // use multi line comment + else + { + gint style_comment; + gint lexer = SSM(doc_list[idx].sci, SCI_GETLEXER, 0, 0); + + // skip lines which are already comments + switch (lexer) + { // I will list only those lexers which support multi line comments + case SCLEX_XML: + case SCLEX_HTML: + { + if (sci_get_style_at(doc_list[idx].sci, line_start) >= 118 && + sci_get_style_at(doc_list[idx].sci, line_start) <= 127) + style_comment = SCE_HPHP_COMMENT; + else style_comment = SCE_H_COMMENT; + break; + } + case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break; + case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break; + case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break; + case SCLEX_CPP: + case SCLEX_PASCAL: + default: style_comment = SCE_C_COMMENT; + } + if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) + { + real_uncomment_multiline(idx); + count_uncommented++; + } + else + { + real_comment_multiline(idx, line_start, last_line); + count_commented++; + } + + // break because we are already on the last line + break_loop = TRUE; + break; + } + } + } + + // restore selection if there is one + if (sel_start < sel_end) + { + if (single_line) + { + gint a = (first_line_was_comment) ? - co_len : co_len; + gint line_start; + + // don't modify sel_start when the selection starts within indentation + line_start = sci_get_position_from_line(doc_list[idx].sci, + sci_get_line_from_position(doc_list[idx].sci, sel_start)); + sci_cb_get_indent(doc_list[idx].sci, sel_start, TRUE); + if ((sel_start - line_start) <= strlen(indent)) + a = 0; + + sci_set_selection_start(doc_list[idx].sci, sel_start + a); + sci_set_selection_end(doc_list[idx].sci, sel_end + + (count_commented * co_len) - (count_uncommented * co_len)); + } + else + { + gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; + if (count_uncommented > 0) + { + sci_set_selection_start(doc_list[idx].sci, sel_start - co_len - eol_len); + sci_set_selection_end(doc_list[idx].sci, sel_end - co_len - eol_len); + } + else + { + sci_set_selection_start(doc_list[idx].sci, sel_start + co_len + eol_len); + sci_set_selection_end(doc_list[idx].sci, sel_end + co_len + eol_len); + } + } + } + else if (count_uncommented > 0) + { + gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; + sci_set_current_position(doc_list[idx].sci, sel_start - co_len - eol_len); + } +} + + +void sci_cb_do_comment(gint idx, gint line) +{ + gint first_line, last_line; + gint x, i, line_start, line_len; + gint sel_start, sel_end, co_len; + gchar sel[256], *co, *cc; + gboolean break_loop = FALSE, single_line = FALSE; + filetype *ft; + + if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return; + + if (line < 0) + { // use selection or current line + sel_start = sci_get_selection_start(doc_list[idx].sci); + sel_end = sci_get_selection_end(doc_list[idx].sci); + + first_line = sci_get_line_from_position(doc_list[idx].sci, sel_start); + // Find the last line with chars selected (not EOL char) + last_line = sci_get_line_from_position(doc_list[idx].sci, sel_end - 1); + last_line = MAX(first_line, last_line); + } + else + { + first_line = last_line = line; + sel_start = sel_end = sci_get_position_from_line(doc_list[idx].sci, line); + } + + ft = doc_list[idx].file_type; + + // detection of HTML vs PHP code, if non-PHP set filetype to XML + line_start = sci_get_position_from_line(doc_list[idx].sci, first_line); + if (ft->id == GEANY_FILETYPES_PHP) + { + if (sci_get_style_at(doc_list[idx].sci, line_start) < 118 || + sci_get_style_at(doc_list[idx].sci, line_start) > 127) + ft = filetypes[GEANY_FILETYPES_XML]; + } + + co = ft->comment_open; + cc = ft->comment_close; + if (co == NULL) return; + + co_len = strlen(co); + if (co_len == 0) return; + + SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0); + + for (i = first_line; (i <= last_line) && (! break_loop); i++) + { + line_start = sci_get_position_from_line(doc_list[idx].sci, i); + line_len = sci_get_line_length(doc_list[idx].sci, i); + x = 0; + + //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(256, (line_len - 1)), line_len); + sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 256), (line_start + line_len - 1)), sel); + sel[MIN(256, (line_len - 1))] = '\0'; + + while (isspace(sel[x])) x++; + + // to skip blank lines + if (x < line_len && sel[x] != '\0') + { + // use single line comment + if (cc == NULL || strlen(cc) == 0) + { single_line = TRUE; + if (ft->comment_use_indent) sci_insert_text(doc_list[idx].sci, line_start + x, co); else @@ -1288,9 +1501,6 @@ // use multi line comment else { - gchar *eol = utils_get_eol_char(idx); - gchar *str_begin = g_strdup_printf("%s%s", co, eol); - gchar *str_end = g_strdup_printf("%s%s", cc, eol); gint style_comment; gint lexer = SSM(doc_list[idx].sci, SCI_GETLEXER, 0, 0);
@@ -1315,14 +1525,8 @@ } if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) continue;
- // insert the comment strings - sci_insert_text(doc_list[idx].sci, line_start, str_begin); - line_len = sci_get_position_from_line(doc_list[idx].sci, last_line + 2); - sci_insert_text(doc_list[idx].sci, line_len, str_end); + real_comment_multiline(idx, line_start, last_line);
- g_free(str_begin); - g_free(str_end); - // break because we are already on the last line break_loop = TRUE; break; @@ -1331,19 +1535,21 @@ } SSM(doc_list[idx].sci, SCI_ENDUNDOACTION, 0, 0);
- // restore selection - if (single_line) + // restore selection if there is one + if (sel_start < sel_end) { - sci_set_selection_start(doc_list[idx].sci, sel_start + co_len); - sci_set_selection_end(doc_list[idx].sci, sel_end + ((i - first_line) * co_len)); + if (single_line) + { + sci_set_selection_start(doc_list[idx].sci, sel_start + co_len); + sci_set_selection_end(doc_list[idx].sci, sel_end + ((i - first_line) * co_len)); + } + else + { + gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; + sci_set_selection_start(doc_list[idx].sci, sel_start + co_len + eol_len); + sci_set_selection_end(doc_list[idx].sci, sel_end + co_len + eol_len); + } } - else - { - gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1; - sci_set_selection_start(doc_list[idx].sci, sel_start + co_len + eol_len); - sci_set_selection_end(doc_list[idx].sci, sel_end + co_len + eol_len); - } - }
Modified: trunk/src/sci_cb.h =================================================================== --- trunk/src/sci_cb.h 2006-09-09 14:36:15 UTC (rev 807) +++ trunk/src/sci_cb.h 2006-09-10 11:47:26 UTC (rev 808) @@ -69,10 +69,12 @@
gboolean sci_cb_show_calltip(gint idx, gint pos);
-void sci_cb_do_comment(gint idx); +void sci_cb_do_comment_toggle(gint idx);
-void sci_cb_do_uncomment(gint idx); +void sci_cb_do_comment(gint idx, gint line);
+void sci_cb_do_uncomment(gint idx, gint line); + void sci_cb_highlight_braces(ScintillaObject *sci, gint cur_pos);
void sci_cb_auto_multiline(ScintillaObject *sci, gint pos);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.