Split filetype PHP/HTML into PHP and HTML.

git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@779 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Enrico Tröger 2006-09-01 17:07:49 +00:00
parent 6ad79f7610
commit b1b4a4e157
13 changed files with 206 additions and 60 deletions

View File

@ -2,6 +2,10 @@
* src/document.c, src/dialogs.c, src/prefs.c, src/callbacks.c,
src/interface.c, geany.glade: Fixed some typos.
* src/filetypes.c, src/highlighting.c, src/keybindings.c,
src/sci_cb.c, data/filetypes.html, data/filetype_extensions.conf,
src/callbacks.c, src/msgwindow.c:
Split filetype PHP/HTML into PHP and HTML.
2006-09-01 Frank Lanitz <frank@frank.uvena.de>

9
TODO
View File

@ -5,19 +5,20 @@ TODO List:
Geany 0.8 or later:
o fix problems when loading global.tags and other tags files are
already loaded
o Go to xxx - definable command
o documentation: list and explain filetype modes
o user-definable auto completion structs
o documentation: preferences
o save build includes & arguments
o separate filetype for HTML
o user-definable auto completion structs
o save build includes & arguments (->project management)
o don't override Scintilla keybindings by default
o allow use of custom global tags files
o common default highlighting all in one config file
o project management
o (DBUS)
o (startup notification)
o (indent wrapped lines - Scintilla issue)
o (inverting highlighting by selection - Scintilla issue)
o (project management)
o (folder tree in the sidebar)
o (improved Windows support)

View File

@ -12,7 +12,7 @@ Fortran=*.f;*.f77;*.f90;*.f95;*.for;*.ftn;
Ferite=*.fe;
CAML=*.ml;*.mli;
Perl=*.pl;*.perl;*.pm;
PHP=*.php;*.php3;*.php4;*.php5;*.html;*.htm;
PHP=*.php;*.php3;*.php4;*.php5;*.phtml;
Python=*.py;*.pyw;
Ruby=*.rb;*.rhtml;
Tcl=*.tcl;*.tk;*.wish;
@ -20,6 +20,7 @@ Sh=*.sh;configure;configure.in;configure.in.in;configure.ac;*.ksh;*.zsh;
Make=*.mak;*.mk;Makefile*;makefile*;
XML=*.xml;*.sgml;
Docbook=*.docbook;
HTML=*.htm;*.html;*.shtml;*.hta;*.htd;*.htt;*.cfm;
CSS=*.css;
SQL=*.sql;
LaTeX=*.tex;*.sty;*.idx;
@ -27,3 +28,4 @@ O-Matrix=*.oms;
Conf=*.conf;*.ini;config;*rc;*.cfg;
Diff=*.diff;*.patch;
None=*;

31
data/filetypes.html Normal file
View File

@ -0,0 +1,31 @@
# For complete documentation of this file, please see Geany's main documentation
[styling]
# styling for PHP/HTML is done in filetypes.xml
[settings]
# the following characters are these which a "word" can contains, see documentation
wordchars=_#&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
# if only single comment char is supported like # in this file, leave comment_close blank
# these comments are used for PHP, the comments used in HTML are in filetypes.xml
comment_open=<!--
comment_close=-->
# set to false if a comment character/string should start at column 0 of a line, true uses any
# indention of the line, e.g. setting to true causes the following on pressing CTRL+d
#command_example();
# setting to false would generate this
# command_example();
# This setting works only for single line comments
comment_use_indent=true
[build_settings]
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
# use a syntax checker and ignore the formatted output
compiler=tidy %f >/dev/null
# the file will be opened with the default browser which can be set in the preferences dialog
run_cmd=builtin

View File

@ -1716,6 +1716,12 @@ on_build_execute_activate (GtkMenuItem *menuitem,
msgwin_status_add(_("Failed to execute the view program"));
}
}
else if (doc_list[idx].file_type->id == GEANY_FILETYPES_HTML)
{
gchar *uri = g_strconcat("file:///", g_path_skip_root(doc_list[idx].file_name), NULL);
utils_start_browser(uri);
g_free(uri);
}
else
{
// save the file only if the run command uses it

View File

@ -60,8 +60,8 @@ enum
FILETYPE_UID_D, // 21
FILETYPE_UID_FORTRAN, // 22
FILETYPE_UID_DIFF, // 23
FILETYPE_UID_FERITE // 24
//FILETYPE_UID_HTML, // 25
FILETYPE_UID_FERITE, // 24
FILETYPE_UID_HTML // 25
};
@ -100,9 +100,9 @@ filetype *filetypes_get_from_uid(gint uid)
case FILETYPE_UID_ALL: return filetypes[GEANY_FILETYPES_ALL];
case FILETYPE_UID_D: return filetypes[GEANY_FILETYPES_D];
case FILETYPE_UID_FORTRAN: return filetypes[GEANY_FILETYPES_FORTRAN];
case FILETYPE_UID_DIFF: return filetypes[GEANY_FILETYPES_DIFF];
case FILETYPE_UID_DIFF: return filetypes[GEANY_FILETYPES_DIFF];
case FILETYPE_UID_FERITE: return filetypes[GEANY_FILETYPES_FERITE];
//case FILETYPE_UID_HTML: return filetypes[GEANY_FILETYPES_HTML];
case FILETYPE_UID_HTML: return filetypes[GEANY_FILETYPES_HTML];
default: return NULL;
}
}
@ -322,16 +322,15 @@ void filetypes_init_types(void)
filetypes[GEANY_FILETYPES_PHP]->lang = 6;
filetypes[GEANY_FILETYPES_PHP]->name = g_strdup("PHP");
filetypes[GEANY_FILETYPES_PHP]->has_tags = TRUE;
filetypes[GEANY_FILETYPES_PHP]->title = g_strdup(_("PHP / HTML source file"));
filetypes[GEANY_FILETYPES_PHP]->title = g_strdup(_("PHP source file"));
filetypes[GEANY_FILETYPES_PHP]->extension = g_strdup("php");
filetypes[GEANY_FILETYPES_PHP]->pattern = g_new0(gchar*, 7);
filetypes[GEANY_FILETYPES_PHP]->pattern = g_new0(gchar*, 6);
filetypes[GEANY_FILETYPES_PHP]->pattern[0] = g_strdup("*.php");
filetypes[GEANY_FILETYPES_PHP]->pattern[1] = g_strdup("*.php3");
filetypes[GEANY_FILETYPES_PHP]->pattern[2] = g_strdup("*.php4");
filetypes[GEANY_FILETYPES_PHP]->pattern[3] = g_strdup("*.php5");
filetypes[GEANY_FILETYPES_PHP]->pattern[4] = g_strdup("*.html");
filetypes[GEANY_FILETYPES_PHP]->pattern[5] = g_strdup("*.htm");
filetypes[GEANY_FILETYPES_PHP]->pattern[6] = NULL;
filetypes[GEANY_FILETYPES_PHP]->pattern[4] = g_strdup("*.phtml");
filetypes[GEANY_FILETYPES_PHP]->pattern[5] = NULL;
filetypes[GEANY_FILETYPES_PHP]->style_func_ptr = styleset_php;
filetypes[GEANY_FILETYPES_PHP]->comment_open = g_strdup("//");
filetypes[GEANY_FILETYPES_PHP]->comment_close = NULL;
@ -504,6 +503,32 @@ void filetypes_init_types(void)
filetypes_init_build_programs(filetypes[GEANY_FILETYPES_DOCBOOK]);
filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_DOCBOOK]->title, filetypes[GEANY_FILETYPES_DOCBOOK]);
#define HTML
filetypes[GEANY_FILETYPES_HTML] = g_new0(filetype, 1);
filetypes[GEANY_FILETYPES_HTML]->id = GEANY_FILETYPES_HTML;
filetypes[GEANY_FILETYPES_HTML]->uid = FILETYPE_UID_HTML;
filetypes[GEANY_FILETYPES_HTML]->item = NULL;
filetypes[GEANY_FILETYPES_HTML]->lang = -2;
filetypes[GEANY_FILETYPES_HTML]->name = g_strdup("HTML");
filetypes[GEANY_FILETYPES_HTML]->has_tags = FALSE;
filetypes[GEANY_FILETYPES_HTML]->title = g_strdup(_("HTML source file"));
filetypes[GEANY_FILETYPES_HTML]->extension = g_strdup("html");
filetypes[GEANY_FILETYPES_HTML]->pattern = g_new0(gchar*, 8);
filetypes[GEANY_FILETYPES_HTML]->pattern[0] = g_strdup("*.htm");
filetypes[GEANY_FILETYPES_HTML]->pattern[1] = g_strdup("*.html");
filetypes[GEANY_FILETYPES_HTML]->pattern[2] = g_strdup("*.shtml");
filetypes[GEANY_FILETYPES_HTML]->pattern[3] = g_strdup("*.hta");
filetypes[GEANY_FILETYPES_HTML]->pattern[4] = g_strdup("*.htd");
filetypes[GEANY_FILETYPES_HTML]->pattern[5] = g_strdup("*.htt");
filetypes[GEANY_FILETYPES_HTML]->pattern[6] = g_strdup("*.cfm");
filetypes[GEANY_FILETYPES_HTML]->pattern[7] = NULL;
filetypes[GEANY_FILETYPES_HTML]->style_func_ptr = styleset_html;
filetypes[GEANY_FILETYPES_HTML]->comment_open = g_strdup("<!--");
filetypes[GEANY_FILETYPES_HTML]->comment_close = g_strdup("-->");
filetypes_init_build_programs(filetypes[GEANY_FILETYPES_HTML]);
filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_HTML]->title, filetypes[GEANY_FILETYPES_HTML]);
filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_HTML]->title, filetypes[GEANY_FILETYPES_HTML]);
#define CSS
filetypes[GEANY_FILETYPES_CSS] = g_new0(filetype, 1);
filetypes[GEANY_FILETYPES_CSS]->id = GEANY_FILETYPES_CSS;

View File

@ -52,9 +52,7 @@ enum
GEANY_FILETYPES_MAKE,
GEANY_FILETYPES_XML,
GEANY_FILETYPES_DOCBOOK,
/*
GEANY_FILETYPES_HTML,
*/
GEANY_FILETYPES_CSS,
GEANY_FILETYPES_SQL,
GEANY_FILETYPES_LATEX,

View File

@ -864,7 +864,7 @@ static void styleset_php_init(void)
types[GEANY_FILETYPES_PHP] = g_new(style_set, 1);
types[GEANY_FILETYPES_PHP]->keywords = NULL;
styleset_get_wordchars(config, config_home, GEANY_FILETYPES_PHP, GEANY_WORDCHARS"$");
styleset_get_wordchars(config, config_home, GEANY_FILETYPES_PHP, GEANY_WORDCHARS);
filetypes_get_config(config, config_home, GEANY_FILETYPES_PHP);
// load global tags file for PHP autocompletion
@ -876,14 +876,6 @@ static void styleset_php_init(void)
global_php_tags_loaded = TRUE;
g_free(file);
}
// load global tags file for HTML entities autocompletion
if (! app->ignore_global_tags && ! global_html_tags_loaded)
{
gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "html_entities.tags", NULL);
html_entities = utils_read_file_in_array(file);
global_html_tags_loaded = TRUE;
g_free(file);
}
g_key_file_free(config);
g_key_file_free(config_home);
@ -903,13 +895,62 @@ void styleset_php(ScintillaObject *sci)
SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
// use the same colouring for HTML; XML and so on
// use the same colouring as for XML
styleset_markup(sci);
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_PHP]->wordchars);
}
static void styleset_html_init(void)
{
GKeyFile *config = g_key_file_new();
GKeyFile *config_home = g_key_file_new();
gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.html", NULL);
gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.html", NULL);
styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
types[GEANY_FILETYPES_HTML] = g_new(style_set, 1);
types[GEANY_FILETYPES_HTML]->keywords = NULL;
styleset_get_wordchars(config, config_home, GEANY_FILETYPES_HTML, GEANY_WORDCHARS);
filetypes_get_config(config, config_home, GEANY_FILETYPES_HTML);
// load global tags file for HTML entities autocompletion
if (! app->ignore_global_tags && ! global_html_tags_loaded)
{
gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "html_entities.tags", NULL);
html_entities = utils_read_file_in_array(file);
global_html_tags_loaded = TRUE;
g_free(file);
}
g_key_file_free(config);
g_key_file_free(config_home);
g_free(f0);
g_free(f);
}
void styleset_html(ScintillaObject *sci)
{
if (types[GEANY_FILETYPES_HTML] == NULL) styleset_html_init();
styleset_common(sci, 7);
SSM(sci, SCI_SETLEXER, SCLEX_HTML, 0);
SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
// use the same colouring for HTML; XML and so on
styleset_markup(sci);
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_HTML]->wordchars);
}
static void styleset_markup_init(void)
{
GKeyFile *config = g_key_file_new();

View File

@ -54,6 +54,8 @@ void styleset_latex(ScintillaObject *sci);
void styleset_php(ScintillaObject *sci);
void styleset_html(ScintillaObject *sci);
void styleset_java(ScintillaObject *sci);
void styleset_pascal(ScintillaObject *sci);

View File

@ -735,7 +735,7 @@ static void cb_func_edit_calltip(void)
{
gint idx = document_get_cur_idx();
if (idx == -1 || ! doc_list[idx].is_valid) return;
sci_cb_show_calltip(doc_list[idx].sci, -1, idx);
sci_cb_show_calltip(idx, -1);
}
static void cb_func_edit_macrolist(void)

View File

@ -435,7 +435,15 @@ void msgwin_parse_compiler_error_line(const gchar *string, gchar **filename, gin
}
break;
}
case GEANY_FILETYPES_HTML:
{
// line 78 column 7 - Warning: <table> missing '>' for end of tag
pattern = " ";
field_min_len = 4;
field_idx_line = 1;
field_idx_file = -1;
break;
}
default: return;
}
@ -457,6 +465,15 @@ void msgwin_parse_compiler_error_line(const gchar *string, gchar **filename, gin
return;
}
// let's stop here if there is no filename in the error message
if (field_idx_file == -1)
{
// we have no filename in the error message, so take the current one and hope it's correct
*filename = g_strdup(doc_list[document_get_cur_idx()].file_name);
g_strfreev(fields);
return;
}
// skip some characters at the beginning of the filename, at the moment only "./"
// can be extended if other "trash" is known
if (strncmp(fields[field_idx_file], "./", 2) == 0) skip_dot_slash = 2;

View File

@ -155,7 +155,7 @@ void on_editor_notification(GtkWidget *editor, gint scn, gpointer lscn, gpointer
}
case '(':
{ // show calltips
sci_cb_show_calltip(sci, pos, idx);
sci_cb_show_calltip(idx, pos);
break;
}
case ')':
@ -171,19 +171,19 @@ void on_editor_notification(GtkWidget *editor, gint scn, gpointer lscn, gpointer
}
case ' ':
{ // if and for autocompletion
if (app->pref_editor_auto_complete_constructs) sci_cb_auto_forif(sci, pos, idx);
if (app->pref_editor_auto_complete_constructs) sci_cb_auto_forif(idx, pos);
break;
}
case '[':
case '{':
{ // Tex auto-closing
sci_cb_auto_close_bracket(sci, pos, nt->ch); // Tex auto-closing
sci_cb_show_calltip(sci, pos, idx);
sci_cb_show_calltip(idx, pos);
break;
}
case '}':
{ // closing bracket handling
if (doc_list[idx].use_auto_indention) sci_cb_close_block(sci, pos - 1);
if (doc_list[idx].use_auto_indention) sci_cb_close_block(idx, pos - 1);
break;
}
default: sci_cb_start_auto_complete(idx, pos, FALSE);
@ -274,7 +274,7 @@ static void on_new_line_added(ScintillaObject *sci, gint idx)
}
// " * " auto completion in multiline C/C++ comments
sci_cb_auto_multiline(sci, pos);
if (app->pref_editor_auto_complete_constructs) sci_cb_auto_latex(sci, pos, idx);
if (app->pref_editor_auto_complete_constructs) sci_cb_auto_latex(idx, pos);
}
@ -372,22 +372,29 @@ static gint brace_match(ScintillaObject *sci, gint pos)
}
void sci_cb_close_block(ScintillaObject *sci, gint pos)
void sci_cb_close_block(gint idx, gint pos)
{
gint x = 0, cnt = 0;
gint start_brace = brace_match(sci, pos);
gint line = sci_get_line_from_position(sci, pos);
gint line_start = sci_get_position_from_line(sci, line);
gint line_len = sci_get_line_length(sci, line);
// set eol_char_len to 0 if on last line, because there is no EOL char
gint eol_char_len = (line == (SSM(sci, SCI_GETLINECOUNT, 0, 0) - 1)) ? 0 :
utils_get_eol_char_len(document_find_by_sci(sci));
gint lexer = SSM(sci, SCI_GETLEXER, 0, 0);
gint start_brace, line, line_start, line_len, eol_char_len, lexer;
gchar *text, *line_buf;
ScintillaObject *sci;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
sci = doc_list[idx].sci;
lexer = SSM(sci, SCI_GETLEXER, 0, 0);
if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL && lexer != SCLEX_BASH)
return;
start_brace = brace_match(sci, pos);
line = sci_get_line_from_position(sci, pos);
line_start = sci_get_position_from_line(sci, line);
line_len = sci_get_line_length(sci, line);
// set eol_char_len to 0 if on last line, because there is no EOL char
eol_char_len = (line == (SSM(sci, SCI_GETLINECOUNT, 0, 0) - 1)) ? 0 :
utils_get_eol_char_len(document_find_by_sci(sci));
// check that the line is empty, to not kill text in the line
line_buf = g_malloc(line_len + 1);
sci_get_line(sci, line, line_buf);
@ -440,19 +447,20 @@ void sci_cb_find_current_word(ScintillaObject *sci, gint pos, gchar *word, size_
}
gboolean sci_cb_show_calltip(ScintillaObject *sci, gint pos, gint idx)
gboolean sci_cb_show_calltip(gint idx, gint pos)
{
gint orig_pos = pos; //the position for the calltip
gint orig_pos = pos; // the position for the calltip
gint lexer;
gint style;
gchar word[GEANY_MAX_WORD_LENGTH];
TMTag *tag;
const GPtrArray *tags;
ScintillaObject *sci;
if (sci == NULL) return FALSE;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return FALSE;
sci = doc_list[idx].sci;
lexer = SSM(sci, SCI_GETLEXER, 0, 0);
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return FALSE;
word[0] = '\0';
if (pos == -1)
@ -571,7 +579,7 @@ gboolean sci_cb_start_auto_complete(gint idx, gint pos, gboolean force)
ScintillaObject *sci;
gboolean ret = FALSE;
if (idx < 0 || ! doc_list[idx].is_valid || doc_list[idx].sci == NULL) return FALSE;
if (idx < 0 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return FALSE;
sci = doc_list[idx].sci;
line = sci_get_line_from_position(sci, pos);
@ -612,8 +620,13 @@ gboolean sci_cb_start_auto_complete(gint idx, gint pos, gboolean force)
}
void sci_cb_auto_latex(ScintillaObject *sci, gint pos, gint idx)
void sci_cb_auto_latex(gint idx, gint pos)
{
ScintillaObject *sci;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
sci = doc_list[idx].sci;
if (sci_get_char_at(sci, pos - 2) == '}')
{
gchar *eol, *buf, *construct;
@ -685,23 +698,29 @@ void sci_cb_auto_latex(ScintillaObject *sci, gint pos, gint idx)
}
void sci_cb_auto_forif(ScintillaObject *sci, gint pos, gint idx)
void sci_cb_auto_forif(gint idx, gint pos)
{
static gchar buf[16];
gchar *eol;
gchar *construct;
gint lexer, style;
gint i;
ScintillaObject *sci;
if (sci == NULL || idx == -1 || ! doc_list[idx].is_valid) return;
if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
sci = doc_list[idx].sci;
lexer = SSM(sci, SCI_GETLEXER, 0, 0);
style = SSM(sci, SCI_GETSTYLEAT, pos - 2, 0);
// only for C, C++, Java, Perl and PHP
if (lexer != SCLEX_CPP &&
lexer != SCLEX_HTML &&
lexer != SCLEX_PERL)
if (doc_list[idx].file_type->id != GEANY_FILETYPES_PHP &&
doc_list[idx].file_type->id != GEANY_FILETYPES_C &&
doc_list[idx].file_type->id != GEANY_FILETYPES_D &&
doc_list[idx].file_type->id != GEANY_FILETYPES_CPP &&
doc_list[idx].file_type->id != GEANY_FILETYPES_PERL &&
doc_list[idx].file_type->id != GEANY_FILETYPES_JAVA &&
doc_list[idx].file_type->id != GEANY_FILETYPES_FERITE)
return;
// return, if we are in a comment, or when SCLEX_HTML but not in PHP
@ -713,9 +732,9 @@ void sci_cb_auto_forif(ScintillaObject *sci, gint pos, gint idx)
style == SCE_C_STRING ||
style == SCE_C_CHARACTER ||
style == SCE_C_PREPROCESSOR)) return;
if (lexer == SCLEX_HTML && ! (style >= 118 && style <= 127)) return;
//if (lexer == SCLEX_HTML && ! (style >= 118 && style <= 127)) return;
if (lexer == SCLEX_HTML && (
if (doc_list[idx].file_type->id == GEANY_FILETYPES_PHP && (
style == SCE_HPHP_SIMPLESTRING ||
style == SCE_HPHP_HSTRING ||
style == SCE_HPHP_COMMENTLINE ||

View File

@ -35,18 +35,18 @@
gchar **html_entities;
// callback func called by all editors when a signals arises
// callback func called by all editors when a signal arises
void on_editor_notification(GtkWidget* editor, gint scn, gpointer lscn, gpointer user_data);
gboolean sci_cb_start_auto_complete(gint idx, gint pos, gboolean force);
void sci_cb_get_indent(ScintillaObject *sci, gint pos, gboolean use_this_line);
void sci_cb_close_block(ScintillaObject *sci, gint pos);
void sci_cb_close_block(gint idx, gint pos);
void sci_cb_auto_forif(ScintillaObject *sci, gint pos, gint idx);
void sci_cb_auto_forif(gint idx, gint pos);
void sci_cb_auto_latex(ScintillaObject *sci, gint pos, gint idx);
void sci_cb_auto_latex(gint idx, gint pos);
void sci_cb_show_macro_list(ScintillaObject *sci);
@ -54,7 +54,7 @@ gboolean sci_cb_handle_xml(ScintillaObject *sci, gchar ch);
void sci_cb_find_current_word(ScintillaObject *sci, gint pos, gchar *word, size_t wordlen);
gboolean sci_cb_show_calltip(ScintillaObject *sci, gint pos, gint idx);
gboolean sci_cb_show_calltip(gint idx, gint pos);
void sci_cb_do_comment(gint idx);