static gboolean gb_vim_jump_to_line (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (IDE_IS_EDITOR_VIEW (active_widget)) { GtkSourceView *source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); GtkTextBuffer *buffer; gboolean extend_selection; gint line; if (!int32_parse (&line, options, 0, G_MAXINT32, "line number", error)) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); extend_selection = gtk_text_buffer_get_has_selection (buffer); ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), line); if (line == 0) { GtkTextIter iter; /* * Zero is not a valid line number, and IdeSourceView treats * that as a move to the end of the buffer. Instead, we want * line 1 to be like vi/vim. */ gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_select_range (buffer, &iter, &iter); gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (source_view), gtk_text_buffer_get_insert (buffer), 0.0, FALSE, 0.0, 0.0); } else { g_signal_emit_by_name (source_view, "movement", IDE_SOURCE_VIEW_MOVEMENT_NTH_LINE, extend_selection, TRUE, TRUE); } ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), 0); g_signal_emit_by_name (source_view, "save-insert-mark"); return TRUE; } else return gb_vim_set_source_view_error (error); }
static void ide_lsp_completion_provider_activate_proposal (IdeCompletionProvider *provider, IdeCompletionContext *context, IdeCompletionProposal *proposal, const GdkEventKey *key) { g_autoptr(IdeSnippet) snippet = NULL; GtkTextBuffer *buffer; GtkTextView *view; GtkTextIter begin, end; g_assert (IDE_IS_COMPLETION_PROVIDER (provider)); g_assert (IDE_IS_COMPLETION_CONTEXT (context)); g_assert (IDE_IS_LSP_COMPLETION_ITEM (proposal)); buffer = ide_completion_context_get_buffer (context); view = ide_completion_context_get_view (context); snippet = ide_lsp_completion_item_get_snippet (IDE_LSP_COMPLETION_ITEM (proposal)); gtk_text_buffer_begin_user_action (buffer); if (ide_completion_context_get_bounds (context, &begin, &end)) gtk_text_buffer_delete (buffer, &begin, &end); ide_source_view_push_snippet (IDE_SOURCE_VIEW (view), snippet, &begin); gtk_text_buffer_end_user_action (buffer); }
static gboolean gb_vim_jump_to_line (GtkSourceView *source_view, const gchar *command, const gchar *options, GError **error) { GtkTextBuffer *buffer; gboolean extend_selection; gint line; if (!IDE_IS_SOURCE_VIEW (source_view)) return TRUE; if (!int32_parse (&line, options, 0, G_MAXINT32, "line number", error)) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); extend_selection = gtk_text_buffer_get_has_selection (buffer); ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), line); g_signal_emit_by_name (source_view, "movement", IDE_SOURCE_VIEW_MOVEMENT_NTH_LINE, extend_selection, TRUE, TRUE); g_signal_emit_by_name (source_view, "save-insert-mark"); return TRUE; }
static void gbp_spell_navigator_select_misspelled_word (GbpSpellNavigator *self) { GtkTextTag *tag; GtkTextIter begin; GtkTextIter end; g_assert (GBP_IS_SPELL_NAVIGATOR (self)); if (self->view == NULL) return; if (self->buffer != NULL && NULL != (tag = get_misspelled_tag (self))) { gtk_text_buffer_get_iter_at_mark (self->buffer, &begin, self->start_boundary); gtk_text_buffer_get_iter_at_mark (self->buffer, &end, self->end_boundary); gtk_text_buffer_remove_tag (self->buffer, tag, &begin, &end); gtk_text_buffer_get_iter_at_mark (self->buffer, &begin, self->word_start); gtk_text_buffer_get_iter_at_mark (self->buffer, &end, self->word_end); gtk_text_buffer_apply_tag (self->buffer, tag, &begin, &end); gtk_widget_queue_draw (GTK_WIDGET (self->view)); ide_source_view_scroll_to_mark (IDE_SOURCE_VIEW (self->view), self->word_start, 0.25, TRUE, 1.0, 0.0, TRUE); } }
static void gbp_retab_editor_page_addin_action (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbpRetabEditorPageAddin *self = user_data; IdeSourceView *source_view; GtkTextBuffer *buffer; IdeCompletion *completion; guint tab_width; gint start_line; gint end_line; gint indent; GtkTextIter begin; GtkTextIter end; gboolean editable; gboolean to_spaces; g_assert (GBP_IS_RETAB_EDITOR_PAGE_ADDIN (self)); g_assert (G_IS_SIMPLE_ACTION (action)); buffer = GTK_TEXT_BUFFER (ide_editor_page_get_buffer (self->editor_view)); source_view = ide_editor_page_get_view (self->editor_view); g_assert (IDE_IS_SOURCE_VIEW (source_view)); editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (source_view)); completion = ide_source_view_get_completion (IDE_SOURCE_VIEW (source_view)); tab_width = gtk_source_view_get_tab_width(GTK_SOURCE_VIEW (source_view)); to_spaces = gtk_source_view_get_insert_spaces_instead_of_tabs(GTK_SOURCE_VIEW (source_view)); if (!editable) return; gtk_text_buffer_get_selection_bounds (buffer, &begin, &end); gtk_text_iter_order (&begin, &end); if (!gtk_text_iter_equal (&begin, &end) && gtk_text_iter_starts_line (&end)) gtk_text_iter_backward_char (&end); start_line = gtk_text_iter_get_line (&begin); end_line = gtk_text_iter_get_line (&end); ide_completion_block_interactive (completion); gtk_text_buffer_begin_user_action (buffer); for (gint line = start_line; line <= end_line; ++line) { indent = get_buffer_range_indent (buffer, line, to_spaces); if (indent > 0) gbp_retab_editor_page_addin_retab (buffer, line, tab_width, indent, to_spaces); } gtk_text_buffer_end_user_action (buffer); ide_completion_unblock_interactive (completion); }