SF.net SVN: geany: [1521] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri May 11 11:58:57 UTC 2007
Revision: 1521
http://svn.sourceforge.net/geany/?rev=1521&view=rev
Author: ntrel
Date: 2007-05-11 04:58:56 -0700 (Fri, 11 May 2007)
Log Message:
-----------
Load global tag files stored in ~/.geany/tags when needed.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/highlighting.c
trunk/src/highlighting.h
trunk/src/symbols.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-05-11 11:42:00 UTC (rev 1520)
+++ trunk/ChangeLog 2007-05-11 11:58:56 UTC (rev 1521)
@@ -2,6 +2,8 @@
* src/utils.c, src/utils.h, src/search.c:
Move search_get_file_list() to utils.c.
+ * src/highlighting.c, src/highlighting.h, src/symbols.c:
+ Load global tag files stored in ~/.geany/tags when needed.
2007-05-10 Nick Treleaven <nick.treleaven at btinternet.com>
Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c 2007-05-11 11:42:00 UTC (rev 1520)
+++ trunk/src/highlighting.c 2007-05-11 11:58:56 UTC (rev 1521)
@@ -423,7 +423,7 @@
}
-void styleset_common(ScintillaObject *sci, gint style_bits)
+static void styleset_common(ScintillaObject *sci, gint style_bits, filetype_id ft_id)
{
static gboolean common_style_set_valid = FALSE;
@@ -436,6 +436,10 @@
common_style_set_valid = TRUE;
}
+ // load global tags file for autocompletion, calltips, etc.
+ if (ft_id < GEANY_FILETYPES_ALL)
+ symbols_global_tags_loaded(ft_id);
+
SSM(sci, SCI_STYLECLEARALL, 0, 0);
// caret colour and width
@@ -699,15 +703,14 @@
g_key_file_free(config);
g_key_file_free(config_home);
-
- // load global tags file for C autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_C);
}
void styleset_c(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_C;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_C].styling == NULL) styleset_c_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_C].wordchars);
@@ -759,15 +762,14 @@
g_key_file_free(config);
g_key_file_free(config_home);
-
- // load global tags file for C autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_CPP);
}
void styleset_cpp(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_CPP;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_CPP].styling == NULL) styleset_cpp_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_CPP].wordchars);
@@ -826,9 +828,6 @@
&style_sets[GEANY_FILETYPES_PASCAL].wordchars);
filetypes_get_config(config, config_home, GEANY_FILETYPES_PASCAL);
- // load global tags file for PASCAL autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_PASCAL);
-
g_key_file_free(config);
g_key_file_free(config_home);
}
@@ -836,7 +835,9 @@
void styleset_pascal(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_PASCAL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_PASCAL].styling == NULL) styleset_pascal_init();
SSM (sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_PASCAL].wordchars);
@@ -893,7 +894,9 @@
void styleset_makefile(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_MAKE;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_MAKE].styling == NULL) styleset_makefile_init();
SSM (sci, SCI_SETLEXER, SCLEX_MAKEFILE, 0);
@@ -939,7 +942,9 @@
void styleset_diff(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_DIFF;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_DIFF].styling == NULL) styleset_diff_init();
SSM (sci, SCI_SETLEXER, SCLEX_DIFF, 0);
@@ -979,9 +984,6 @@
&style_sets[GEANY_FILETYPES_LATEX].wordchars);
filetypes_get_config(config, config_home, GEANY_FILETYPES_LATEX);
- // load global tags file for LaTeX autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_LATEX);
-
g_key_file_free(config);
g_key_file_free(config_home);
}
@@ -989,7 +991,9 @@
void styleset_latex(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_LATEX;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_LATEX].styling == NULL) styleset_latex_init();
SSM (sci, SCI_SETLEXER, SCLEX_LATEX, 0);
@@ -1020,9 +1024,6 @@
&style_sets[GEANY_FILETYPES_PHP].wordchars);
filetypes_get_config(config, config_home, GEANY_FILETYPES_PHP);
- // load global tags file for PHP autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_PHP);
-
g_key_file_free(config);
g_key_file_free(config_home);
}
@@ -1030,7 +1031,9 @@
void styleset_php(ScintillaObject *sci)
{
- styleset_common(sci, 7);
+ const filetype_id ft_id = GEANY_FILETYPES_PHP;
+
+ styleset_common(sci, 7, ft_id);
// PHP doesn't have its own styling, so check wordchars to see if init was run
if (style_sets[GEANY_FILETYPES_PHP].wordchars == NULL) styleset_php_init();
@@ -1060,9 +1063,6 @@
&style_sets[GEANY_FILETYPES_HTML].wordchars);
filetypes_get_config(config, config_home, GEANY_FILETYPES_HTML);
- // load global tags file for HTML entities autocompletion
- symbols_global_tags_loaded(GEANY_FILETYPES_HTML);
-
g_key_file_free(config);
g_key_file_free(config_home);
}
@@ -1070,7 +1070,9 @@
void styleset_html(ScintillaObject *sci)
{
- styleset_common(sci, 7);
+ const filetype_id ft_id = GEANY_FILETYPES_HTML;
+
+ styleset_common(sci, 7, ft_id);
// HTML doesn't have its own styling, so check wordchars to see if init was run
if (style_sets[GEANY_FILETYPES_HTML].wordchars == NULL) styleset_html_init();
@@ -1427,7 +1429,9 @@
void styleset_java(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_JAVA;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_JAVA].styling == NULL) styleset_java_init();
SSM (sci, SCI_SETLEXER, SCLEX_CPP, 0);
@@ -1527,7 +1531,9 @@
void styleset_perl(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_PERL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_PERL].styling == NULL) styleset_perl_init();
SSM (sci, SCI_SETLEXER, SCLEX_PERL, 0);
@@ -1611,7 +1617,9 @@
void styleset_python(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_PYTHON;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_PYTHON].styling == NULL) styleset_python_init();
SSM (sci, SCI_SETLEXER, SCLEX_PYTHON, 0);
@@ -1697,7 +1705,9 @@
void styleset_ruby(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_RUBY;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_RUBY].styling == NULL) styleset_ruby_init();
SSM (sci, SCI_SETLEXER, SCLEX_RUBY, 0);
@@ -1777,7 +1787,9 @@
void styleset_sh(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_SH;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_SH].styling == NULL) styleset_sh_init();
SSM (sci, SCI_SETLEXER, SCLEX_BASH, 0);
@@ -1806,8 +1818,10 @@
void styleset_xml(ScintillaObject *sci)
{
- styleset_common(sci, 7);
+ const filetype_id ft_id = SCLEX_XML;
+ styleset_common(sci, 7, ft_id);
+
SSM (sci, SCI_SETLEXER, SCLEX_XML, 0);
// use the same colouring for HTML; XML and so on
@@ -1926,7 +1940,9 @@
void styleset_docbook(ScintillaObject *sci)
{
- styleset_common(sci, 7);
+ const filetype_id ft_id = GEANY_FILETYPES_DOCBOOK;
+
+ styleset_common(sci, 7, ft_id);
if (style_sets[GEANY_FILETYPES_DOCBOOK].styling == NULL) styleset_docbook_init();
SSM (sci, SCI_SETLEXER, SCLEX_XML, 0);
@@ -1979,6 +1995,8 @@
void styleset_none(ScintillaObject *sci)
{
+ const filetype_id ft_id = GEANY_FILETYPES_ALL;
+
SSM(sci, SCI_SETLEXER, SCLEX_NULL, 0);
if (style_sets[GEANY_FILETYPES_ALL].styling == NULL)
@@ -1986,7 +2004,7 @@
set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_ALL, GCS_DEFAULT);
- styleset_common(sci, 5);
+ styleset_common(sci, 5, ft_id);
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) common_style_set.wordchars);
}
@@ -2057,7 +2075,9 @@
void styleset_css(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_CSS;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_CSS].styling == NULL) styleset_css_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_CSS].wordchars);
@@ -2117,7 +2137,9 @@
void styleset_conf(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_CONF;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_CONF].styling == NULL) styleset_conf_init();
SSM (sci, SCI_SETLEXER, SCLEX_PROPERTIES, 0);
@@ -2178,7 +2200,9 @@
void styleset_asm(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_ASM;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_ASM].styling == NULL) styleset_asm_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_ASM].wordchars);
@@ -2252,7 +2276,9 @@
void styleset_fortran(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_FORTRAN;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_FORTRAN].styling == NULL) styleset_fortran_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_FORTRAN].wordchars);
@@ -2350,7 +2376,9 @@
void styleset_sql(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_SQL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_SQL].styling == NULL) styleset_sql_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_SQL].wordchars);
@@ -2421,7 +2449,9 @@
void styleset_haskell(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_HASKELL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_HASKELL].styling == NULL) styleset_haskell_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_HASKELL].wordchars);
@@ -2496,7 +2526,9 @@
void styleset_caml(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_CAML;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_CAML].styling == NULL) styleset_caml_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_CAML].wordchars);
@@ -2566,7 +2598,9 @@
void styleset_oms(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_OMS;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_OMS].styling == NULL) styleset_oms_init();
SSM (sci, SCI_SETLEXER, SCLEX_OMS, 0);
@@ -2637,7 +2671,9 @@
void styleset_tcl(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_TCL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_TCL].styling == NULL) styleset_tcl_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_TCL].wordchars);
@@ -2727,7 +2763,9 @@
void styleset_d(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_D;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_D].styling == NULL) styleset_d_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_D].wordchars);
@@ -2789,7 +2827,9 @@
void styleset_ferite(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_FERITE;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_FERITE].styling == NULL) styleset_ferite_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_FERITE].wordchars);
@@ -2874,7 +2914,9 @@
void styleset_vhdl(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_VHDL;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_VHDL].styling == NULL) styleset_vhdl_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_VHDL].wordchars);
@@ -2939,7 +2981,9 @@
void styleset_js(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_JS;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_JS].styling == NULL) styleset_js_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_JS].wordchars);
@@ -3034,7 +3078,9 @@
void styleset_lua(ScintillaObject *sci)
{
- styleset_common(sci, 5);
+ const filetype_id ft_id = GEANY_FILETYPES_LUA;
+
+ styleset_common(sci, 5, ft_id);
if (style_sets[GEANY_FILETYPES_LUA].styling == NULL) styleset_lua_init();
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_LUA].wordchars);
Modified: trunk/src/highlighting.h
===================================================================
--- trunk/src/highlighting.h 2007-05-11 11:42:00 UTC (rev 1520)
+++ trunk/src/highlighting.h 2007-05-11 11:58:56 UTC (rev 1521)
@@ -35,8 +35,6 @@
void styleset_free_styles(void);
-void styleset_common(ScintillaObject *sci, gint style_bits);
-
void styleset_c(ScintillaObject *sci);
void styleset_cpp(ScintillaObject *sci);
Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c 2007-05-11 11:42:00 UTC (rev 1520)
+++ trunk/src/symbols.c 2007-05-11 11:58:56 UTC (rev 1521)
@@ -76,8 +76,11 @@
{FALSE, "latex.tags"}
};
+static gchar *user_tags_dir;
+
static void html_tags_loaded();
+static void load_user_tags(filetype_id ft_id);
// Ensure that the global tags file for the file_type_idx filetype is loaded.
@@ -88,6 +91,8 @@
if (app->ignore_global_tags) return;
+ load_user_tags(file_type_idx);
+
switch (file_type_idx)
{
case GEANY_FILETYPES_PHP:
@@ -824,3 +829,83 @@
}
gtk_widget_destroy(dialog);
}
+
+
+/* Fills a hash table with filetype keys that hold a linked list of filenames. */
+static GHashTable *get_tagfile_hash(const GSList *file_list)
+{
+ const GSList *node;
+ GHashTable *hash = g_hash_table_new(NULL, NULL);
+
+ for (node = file_list; node != NULL; node = g_slist_next(node))
+ {
+ GList *fnames;
+ gchar *fname = node->data;
+ gchar *utf8_fname = utils_get_utf8_from_locale(fname);
+ filetype *ft = detect_global_tags_filetype(utf8_fname);
+
+ g_free(utf8_fname);
+
+ if (FILETYPE_ID(ft) < GEANY_FILETYPES_ALL)
+ {
+ fnames = g_hash_table_lookup(hash, ft); // may be NULL
+ fnames = g_list_append(fnames, fname);
+ g_hash_table_insert(hash, ft, fnames);
+ }
+ else
+ geany_debug("Unknown filetype for file '%s'.", fname);
+ }
+ return hash;
+}
+
+
+static GHashTable *init_user_tags()
+{
+ GSList *file_list;
+ GHashTable *lang_hash;
+
+ user_tags_dir = g_strconcat(app->configdir, G_DIR_SEPARATOR_S, "tags", NULL);
+ file_list = utils_get_file_list(user_tags_dir, NULL, NULL);
+ lang_hash = get_tagfile_hash(file_list);
+
+ // don't need to delete list contents because they are now used for hash contents
+ g_slist_free(file_list);
+ return lang_hash;
+}
+
+
+static void load_user_tags(filetype_id ft_id)
+{
+ static guchar tags_loaded[GEANY_FILETYPES_ALL] = {0};
+ static GHashTable *lang_hash = NULL;
+ GList *fnames;
+ const GList *node;
+ const filetype *ft = filetypes[ft_id];
+
+ g_return_if_fail(ft_id < GEANY_FILETYPES_ALL);
+
+ if (tags_loaded[ft_id])
+ return;
+ tags_loaded[ft_id] = TRUE; // prevent reloading
+
+ if (lang_hash == NULL)
+ lang_hash = init_user_tags();
+
+ fnames = g_hash_table_lookup(lang_hash, ft);
+
+ for (node = fnames; node != NULL; node = g_list_next(node))
+ {
+ const gint tm_lang = ft->lang;
+ gchar *fname;
+
+ fname = g_strconcat(user_tags_dir, G_DIR_SEPARATOR_S, node->data, NULL);
+ tm_workspace_load_global_tags(fname, tm_lang);
+ geany_debug("Loaded %s (%s).", fname, ft->name);
+ g_free(fname);
+ }
+ g_list_foreach(fnames, (GFunc) g_free, NULL);
+ g_list_free(fnames);
+ g_hash_table_remove(lang_hash, (gpointer) ft);
+}
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list