375
380
ft->comment_close = NULL;
376
381
ft->group = GEANY_FILETYPE_GROUP_MISC;
384
ft = filetypes[GEANY_FILETYPES_TXT2TAGS];
386
ft->name = g_strdup("Txt2tags");
387
filetype_make_title(ft, TITLE_SOURCE_FILE);
388
ft->extension = g_strdup("t2t");
389
ft->pattern = utils_strv_new("*.t2t", "*.txt2tags", NULL);
390
ft->comment_open = NULL;
391
ft->comment_close = NULL;
392
ft->group = GEANY_FILETYPE_GROUP_MISC;
395
ft = filetypes[GEANY_FILETYPES_ABC];
397
ft->name = g_strdup("Abc");
398
filetype_make_title(ft, TITLE_SOURCE_FILE);
399
ft->extension = g_strdup("abc");
400
ft->pattern = utils_strv_new("*.abc", "*.abp", NULL);
401
ft->comment_open = NULL;
402
ft->comment_close = NULL;
403
ft->group = GEANY_FILETYPE_GROUP_MISC;
379
406
ft = filetypes[GEANY_FILETYPES_SH];
478
505
ft->comment_close = NULL;
479
506
ft->group = GEANY_FILETYPE_GROUP_COMPILED;
509
ft = filetypes[GEANY_FILETYPES_VERILOG];
511
ft->name = g_strdup("Verilog");
512
filetype_make_title(ft, TITLE_SOURCE_FILE);
513
ft->extension = g_strdup("v");
514
ft->pattern = utils_strv_new("*.v", "*.verilog", NULL);
515
ft->comment_open = g_strdup("/*");
516
ft->comment_close = g_strdup("*/");
517
ft->group = GEANY_FILETYPE_GROUP_COMPILED;
482
520
ft = filetypes[GEANY_FILETYPES_DIFF];
696
static void add_custom_filetype(const gchar *filename)
698
gchar *fn = utils_strdupa(strstr(filename, ".") + 1);
699
gchar *dot = g_strrstr(fn, ".conf");
702
g_return_if_fail(dot);
706
if (g_hash_table_lookup(filetypes_hash, fn))
710
ft->name = g_strdup(fn);
711
filetype_make_title(ft, TITLE_FILE);
712
ft->pattern = g_new0(gchar*, 1);
713
ft->group = GEANY_FILETYPE_GROUP_CUSTOM;
714
ft->priv->custom = TRUE;
716
geany_debug("Added filetype %s (%d).", ft->name, ft->id);
720
static void init_custom_filetypes(const gchar *path)
723
const gchar *filename;
725
g_return_if_fail(path);
727
dir = g_dir_open(path, 0, NULL);
731
foreach_dir(filename, dir)
733
const gchar prefix[] = "filetypes.";
735
if (g_str_has_prefix(filename, prefix) &&
736
g_str_has_suffix(filename + strlen(prefix), ".conf"))
738
add_custom_filetype(filename);
659
745
/* Create the filetypes array and fill it with the known filetypes. */
660
746
void filetypes_init_types()
739
827
create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_SCRIPT, _("_Scripting Languages"));
740
828
create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_MARKUP, _("_Markup Languages"));
741
829
create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_MISC, _("M_iscellaneous Languages"));
830
create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_CUSTOM, _("_Custom Filetypes"));
743
832
/* Append all filetypes to the filetype menu */
744
833
foreach_slist(node, filetypes_by_title)
746
835
GeanyFiletype *ft = node->data;
748
if (ft->id != GEANY_FILETYPES_NONE)
837
if (ft->group != GEANY_FILETYPE_GROUP_NONE)
749
838
create_radio_menu_item(group_menus[ft->group], ft);
840
create_radio_menu_item(filetype_menu, ft);
751
create_radio_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_NONE]);
755
845
void filetypes_init()
757
847
filetypes_init_types();
758
849
create_set_filetype_menu();
759
850
setup_config_file_menus();
1160
1248
filetypes[ft_id]->context_action_cmd = result;
1251
result = utils_get_setting_string(configh, "settings", "tag_parser", NULL);
1253
result = utils_get_setting_string(config, "settings", "tag_parser", NULL);
1256
ft->lang = tm_source_file_get_named_lang(result);
1258
geany_debug("Cannot find tag parser '%s' for custom filetype '%s'.", result, ft->name);
1262
result = utils_get_setting_string(configh, "settings", "lexer_filetype", NULL);
1264
result = utils_get_setting_string(config, "settings", "lexer_filetype", NULL);
1267
ft->lexer_filetype = filetypes_lookup_by_name(result);
1268
if (!ft->lexer_filetype)
1269
geany_debug("Cannot find lexer filetype '%s' for custom filetype '%s'.", result, ft->name);
1163
1273
/* read build settings */
1164
result = g_key_file_get_string(configh, "build_settings", "compiler", NULL);
1165
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "compiler", NULL);
1166
if (G_LIKELY(result != NULL))
1168
filetypes[ft_id]->programs->compiler = result;
1169
filetypes[ft_id]->actions->can_compile = TRUE;
1172
result = g_key_file_get_string(configh, "build_settings", "linker", NULL);
1173
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "linker", NULL);
1176
filetypes[ft_id]->programs->linker = result;
1177
filetypes[ft_id]->actions->can_link = TRUE;
1180
result = g_key_file_get_string(configh, "build_settings", "run_cmd", NULL);
1181
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "run_cmd", NULL);
1182
if (G_LIKELY(result != NULL))
1184
filetypes[ft_id]->programs->run_cmd = result;
1185
filetypes[ft_id]->actions->can_exec = TRUE;
1188
result = g_key_file_get_string(configh, "build_settings", "run_cmd2", NULL);
1189
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "run_cmd2", NULL);
1192
filetypes[ft_id]->programs->run_cmd2 = result;
1193
filetypes[ft_id]->actions->can_exec = TRUE;
1196
result = g_key_file_get_string(configh, "build_settings", "error_regex", NULL);
1197
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "error_regex", NULL);
1200
set_error_regex(ft, result);
1274
build_load_menu(config, GEANY_BCS_FT, (gpointer)ft);
1275
build_load_menu(configh, GEANY_BCS_HOME_FT, (gpointer)ft);
1205
1279
/* simple wrapper function to print file errors in DEBUG mode */
1206
1280
static void load_system_keyfile(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags,
1207
G_GNUC_UNUSED GError **just_for_compatibility)
1209
1283
GError *error = NULL;
1210
1284
gboolean done = g_key_file_load_from_file(key_file, file, flags, &error);
1211
if (G_UNLIKELY(! done) && G_UNLIKELY(error != NULL))
1213
geany_debug("Failed to open %s (%s)", file, error->message);
1288
if (!done && !ft->priv->custom)
1289
geany_debug("Failed to open %s (%s)", file, error->message);
1214
1291
g_error_free(error);
1285
1368
gchar *conf_prefix = g_strconcat(app->configdir,
1286
1369
G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", NULL);
1289
for (i = 1; i < GEANY_MAX_BUILT_IN_FILETYPES; i++)
1372
for (i = 1; i < filetypes_array->len; i++)
1291
struct build_programs *bp = filetypes[i]->programs;
1292
1374
GKeyFile *config_home;
1293
1375
gchar *fname, *ext, *data;
1298
ext = filetypes_get_conf_extension(i);
1299
fname = g_strconcat(conf_prefix, ext, NULL);
1302
config_home = g_key_file_new();
1303
g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
1305
if (NZV(bp->compiler))
1306
g_key_file_set_string(config_home, "build_settings", "compiler", bp->compiler);
1307
if (NZV(bp->linker))
1308
g_key_file_set_string(config_home, "build_settings", "linker", bp->linker);
1309
if (NZV(bp->run_cmd))
1310
g_key_file_set_string(config_home, "build_settings", "run_cmd", bp->run_cmd);
1311
if (NZV(bp->run_cmd2))
1312
g_key_file_set_string(config_home, "build_settings", "run_cmd2", bp->run_cmd2);
1314
data = g_key_file_to_data(config_home, NULL, NULL);
1315
utils_write_file(fname, data);
1317
g_key_file_free(config_home);
1377
if (filetypes[i]->home_save_needed)
1379
ext = filetypes_get_conf_extension(i);
1380
fname = g_strconcat(conf_prefix, ext, NULL);
1382
config_home = g_key_file_new();
1383
g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
1384
build_save_menu(config_home, (gpointer)(filetypes[i]), GEANY_BCS_HOME_FT);
1385
data = g_key_file_to_data(config_home, NULL, NULL);
1386
utils_write_file(fname, data);
1388
g_key_file_free(config_home);
1320
1392
g_free(conf_prefix);
1422
1495
gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
1423
1496
gchar **filename, gint *line)
1503
regmatch_t pmatch[3];
1507
doc = document_get_current();
1509
ft = doc->file_type;
1511
tmp = build_get_regex(build_info.grp, ft, NULL);
1425
1515
#ifndef HAVE_REGCOMP
1426
if (!NZV(ft->error_regex_string))
1427
1517
geany_debug("No regex support - maybe you should configure with --enable-gnu-regex!");
1430
regex_t *regex = &ft->priv->error_regex;
1431
regmatch_t pmatch[3];
1520
regex = &ft->priv->error_regex;
1433
1522
*filename = NULL;
1436
if (!NZV(ft->error_regex_string))
1439
if (!ft->priv->error_regex_compiled)
1440
compile_regex(ft, regex);
1528
if (!ft->priv->error_regex_compiled || regstr != ft->priv->last_string)
1530
compile_regex(ft, regex, regstr);
1531
ft->priv->last_string = regstr;
1441
1533
if (!ft->priv->error_regex_compiled) /* regex error */
1500
1591
gboolean userset =
1501
1592
g_key_file_has_key(userconfig, "Extensions", filetypes[i]->name, NULL);
1502
list = g_key_file_get_string_list(
1593
gchar **list = g_key_file_get_string_list(
1503
1594
(userset) ? userconfig : sysconfig, "Extensions", filetypes[i]->name, &len, NULL);
1504
1596
if (G_LIKELY(list) && G_LIKELY(len > 0))
1506
1598
g_strfreev(filetypes[i]->pattern);
1507
1599
filetypes[i]->pattern = list;
1509
else g_strfreev(list);
1512
1605
g_free(sysconfigfile);
1513
1606
g_free(userconfigfile);
1514
1607
g_key_file_free(sysconfig);
1515
1608
g_key_file_free(userconfig);
1612
GeanyDocument *doc = documents[i];
1613
if (doc->file_type->id != GEANY_FILETYPES_NONE)
1615
document_set_filetype(doc, filetypes_detect_from_document(doc));
1528
1629
return (idx >= 0 && idx < (gint) filetypes_array->len) ? filetypes[idx] : NULL;
1633
void filetypes_reload(void)
1636
GeanyDocument *current_doc;
1638
/* save possibly changed commands before re-reading them */
1639
filetypes_save_commands();
1641
/* reload filetype configs */
1642
for (i = 0; i < filetypes_array->len; i++)
1644
/* filetypes_load_config() will skip not loaded filetypes */
1645
filetypes_load_config(i, TRUE);
1647
/* update document styling */
1648
current_doc = document_get_current();
1651
if (current_doc != documents[i])
1652
document_reload_config(documents[i]);
1654
/* process the current document at last */
1655
document_reload_config(current_doc);