static gboolean gb_vim_command_search (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { GtkSourceView *source_view; GtkTextBuffer *buffer; const gchar *search_begin = NULL; const gchar *search_end = NULL; const gchar *replace_begin = NULL; const gchar *replace_end = NULL; gchar *search_text = NULL; gchar *replace_text = NULL; gunichar separator; gboolean confirm_replace = FALSE; g_assert (GTK_IS_WIDGET (active_widget)); g_assert (g_str_has_prefix (command, "%s") || g_str_has_prefix (command, "s")); if (IDE_IS_EDITOR_VIEW (active_widget)) source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); else return gb_vim_set_source_view_error (error); if (*command == '%') command++; command++; separator = g_utf8_get_char (command); if (!separator) goto invalid_request; search_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { search_end = command; break; } } if (!search_end) goto invalid_request; replace_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { replace_end = command; break; } } if (!replace_end) goto invalid_request; command = g_utf8_next_char (command); if (*command) { for (; *command; command++) { switch (*command) { case 'c': confirm_replace = TRUE; break; case 'g': break; /* what other options are supported? */ default: break; } } } search_text = g_strndup (search_begin, search_end - search_begin); replace_text = g_strndup (replace_begin, replace_end - replace_begin); if (confirm_replace) { GVariant *variant; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY); g_variant_builder_add (&builder, "s", search_text); g_variant_builder_add (&builder, "s", replace_text); variant = g_variant_builder_end (&builder); ide_widget_action (GTK_WIDGET (IDE_EDITOR_VIEW (active_widget)->frame1), "frame", "replace-confirm", variant); return TRUE; } buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); if (gtk_text_buffer_get_has_selection (buffer)) { GtkTextIter begin; GtkTextIter end; gtk_text_buffer_get_selection_bounds (buffer, &begin, &end); gtk_text_iter_order (&begin, &end); gb_vim_do_search_and_replace (buffer, &begin, &end, search_text, replace_text, FALSE); } else gb_vim_do_search_and_replace (buffer, NULL, NULL, search_text, replace_text, TRUE); g_free (search_text); g_free (replace_text); return TRUE; invalid_request: g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Invalid search and replace request")); return FALSE; }
static gboolean gb_vim_command_search (GtkSourceView *source_view, const gchar *command, const gchar *options, GError **error) { GtkTextBuffer *buffer; const gchar *search_begin = NULL; const gchar *search_end = NULL; const gchar *replace_begin = NULL; const gchar *replace_end = NULL; gchar *search_text = NULL; gchar *replace_text = NULL; gunichar separator; g_assert (g_str_has_prefix (command, "%s") || g_str_has_prefix (command, "s")); if (*command == '%') command++; command++; separator = g_utf8_get_char (command); if (!separator) goto invalid_request; search_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { search_end = command; break; } } if (!search_end) goto invalid_request; replace_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { replace_end = command; break; } } if (!replace_end) goto invalid_request; command = g_utf8_next_char (command); if (*command) { for (; *command; command++) { switch (*command) { case 'g': break; /* what other options are supported? */ default: break; } } } search_text = g_strndup (search_begin, search_end - search_begin); replace_text = g_strndup (replace_begin, replace_end - replace_begin); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); if (gtk_text_buffer_get_has_selection (buffer)) { GtkTextIter begin; GtkTextIter end; gtk_text_buffer_get_selection_bounds (buffer, &begin, &end); gtk_text_iter_order (&begin, &end); gb_vim_do_search_and_replace (buffer, &begin, &end, search_text, replace_text, FALSE); } else gb_vim_do_search_and_replace (buffer, NULL, NULL, search_text, replace_text, TRUE); g_free (search_text); g_free (replace_text); return TRUE; invalid_request: g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Invalid search and replace request")); return FALSE; }