SF.net SVN: geany:[4809] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Thu Apr 8 13:54:09 UTC 2010
Revision: 4809
http://geany.svn.sourceforge.net/geany/?rev=4809&view=rev
Author: ntrel
Date: 2010-04-08 13:54:08 +0000 (Thu, 08 Apr 2010)
Log Message:
-----------
Refactor snippets_complete_constructs().
Remove an unnecessary TODO.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/editor.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2010-04-07 21:09:56 UTC (rev 4808)
+++ trunk/ChangeLog 2010-04-08 13:54:08 UTC (rev 4809)
@@ -1,3 +1,10 @@
+2010-04-08 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/editor.c:
+ Refactor snippets_complete_constructs().
+ Remove an unnecessary TODO.
+
+
2010-04-07 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* doc/geany.txt, doc/geany.html:
Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c 2010-04-07 21:09:56 UTC (rev 4808)
+++ trunk/src/editor.c 2010-04-08 13:54:08 UTC (rev 4809)
@@ -2044,7 +2044,7 @@
* ac_complete_constructs. Any hints to improve this are welcome. */
static GString *snippets_global_pattern = NULL;
-void snippets_replace_specials(gpointer key, gpointer value, gpointer user_data)
+static void snippets_replace_specials(gpointer key, gpointer value, gpointer user_data)
{
gchar *needle;
@@ -2094,7 +2094,7 @@
sci_set_current_position(sci, pos, FALSE);
}
-/* TODO: Fix \\t inside comment*/
+
/** Inserts text, replacing \\t tab chars with the correct indent width, and \\n newline
* chars with the correct line ending string.
* @param editor The editor to operate on.
@@ -2197,43 +2197,17 @@
}
-static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, const gchar *word)
+static gssize snippets_make_replacements(GeanyEditor *editor, GString *pattern,
+ gsize indent_size)
{
- ScintillaObject *sci = editor->sci;
- gchar *str, *whitespace;
- GString *pattern;
- gint i, str_len, tmp_pos, whitespace_len, nl_count = 0;
gssize cur_index = -1;
- gint ft_id = FILETYPE_ID(editor->document->file_type);
+ gchar *whitespace;
+ gint i, tmp_pos, whitespace_len, nl_count = 0;
GHashTable *specials;
GList *temp_list = NULL;
- const GeanyIndentPrefs *iprefs;
- gsize indent_size;
+ const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
gint cursor_steps, old_cursor = 0;
- str = g_strdup(word);
- g_strstrip(str);
- pattern = g_string_new(snippets_find_completion_by_name(filetypes[ft_id]->name, str));
- if (pattern == NULL || pattern->len == 0)
- {
- g_free(str);
- g_string_free(pattern, TRUE);
- return FALSE;
- }
-
- iprefs = editor_get_indent_prefs(editor);
- read_indent(editor, pos);
- indent_size = strlen(indent);
-
- /* remove the typed word, it will be added again by the used auto completion
- * (not really necessary but this makes the auto completion more flexible,
- * e.g. with a completion like hi=hello, so typing "hi<TAB>" will result in "hello") */
- str_len = strlen(str);
- sci_set_selection_start(sci, pos - str_len);
- sci_set_selection_end(sci, pos);
- sci_replace_sel(sci, "");
- pos -= str_len; /* pos has changed while deleting */
-
/* replace 'special' completions */
specials = g_hash_table_lookup(snippet_hash, "Special");
if (G_LIKELY(specials != NULL))
@@ -2286,7 +2260,7 @@
/* modify cursor_steps to take indentation count and type into account */
/* We're saving the relative offset to each cursor position in a simple
- * linked list, including intendations between them. */
+ * linked list, including indentations between them. */
if (i++ > 0)
{
cursor_steps += (nl_count * indent_size);
@@ -2303,6 +2277,7 @@
utils_string_replace_all(pattern, "%newline%", editor_get_eol_char(editor));
utils_string_replace_all(pattern, "%ws%", whitespace);
g_free(whitespace);
+
/* We put the cursor positions for the most recent
* parsed snippet first, followed by any remaining positions */
i = 0;
@@ -2322,13 +2297,48 @@
if (cur_index < 0)
cur_index = pattern->len;
+ return cur_index;
+}
+
+
+static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, const gchar *word)
+{
+ ScintillaObject *sci = editor->sci;
+ gchar *str;
+ GString *pattern;
+ gssize cur_index = -1;
+ gint str_len;
+ gint ft_id = FILETYPE_ID(editor->document->file_type);
+
+ str = g_strdup(word);
+ g_strstrip(str);
+ pattern = g_string_new(snippets_find_completion_by_name(filetypes[ft_id]->name, str));
+ if (pattern == NULL || pattern->len == 0)
+ {
+ g_free(str);
+ g_string_free(pattern, TRUE);
+ return FALSE;
+ }
+
+ read_indent(editor, pos);
+
+ /* remove the typed word, it will be added again by the used auto completion
+ * (not really necessary but this makes the auto completion more flexible,
+ * e.g. with a completion like hi=hello, so typing "hi<TAB>" will result in "hello") */
+ str_len = strlen(str);
+ sci_set_selection_start(sci, pos - str_len);
+ sci_set_selection_end(sci, pos);
+ sci_replace_sel(sci, "");
+ pos -= str_len; /* pos has changed while deleting */
+
+ cur_index = snippets_make_replacements(editor, pattern, strlen(indent));
+
/* finally insert the text and set the cursor */
editor_insert_text_block(editor, pattern->str, pos, cur_index, -1, FALSE);
sci_scroll_caret(sci);
g_free(str);
g_string_free(pattern, TRUE);
-
return TRUE;
}
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