[gtksourceview/wip/chergert/vim: 302/363] wire up text objects to ci/ca strokes
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/chergert/vim: 302/363] wire up text objects to ci/ca strokes
- Date: Mon, 8 Nov 2021 19:53:54 +0000 (UTC)
commit 908c62d376905d6d9e62fe5ef206df53932ead95
Author: Christian Hergert <chergert redhat com>
Date: Fri Nov 5 00:07:49 2021 -0700
wire up text objects to ci/ca strokes
gtksourceview/vim/gtk-source-vim-normal.c | 94 ++++++++++++++++++++++++++++++-
1 file changed, 92 insertions(+), 2 deletions(-)
---
diff --git a/gtksourceview/vim/gtk-source-vim-normal.c b/gtksourceview/vim/gtk-source-vim-normal.c
index c27047fd..6e374bb6 100644
--- a/gtksourceview/vim/gtk-source-vim-normal.c
+++ b/gtksourceview/vim/gtk-source-vim-normal.c
@@ -31,6 +31,7 @@
#include "gtk-source-vim-motion.h"
#include "gtk-source-vim-normal.h"
#include "gtk-source-vim-replace.h"
+#include "gtk-source-vim-text-object.h"
#include "gtk-source-vim-visual.h"
#define REPLAY(_block) do { _block; } while (--self->count > 0);
@@ -176,6 +177,28 @@ gtk_source_vim_normal_begin_change (GtkSourceVimNormal *self,
return ret;
}
+static GtkSourceVimState *
+gtk_source_vim_normal_begin_insert_text_object (GtkSourceVimNormal *self,
+ GtkSourceVimState *text_object)
+{
+ GtkSourceVimState *ret;
+ int count;
+
+ g_assert (GTK_SOURCE_IS_VIM_NORMAL (self));
+ g_assert (GTK_SOURCE_IS_VIM_TEXT_OBJECT (text_object));
+
+ count = self->count;
+
+ ret = gtk_source_vim_insert_new ();
+ gtk_source_vim_state_set_parent (text_object, ret);
+ gtk_source_vim_insert_set_text_object (GTK_SOURCE_VIM_INSERT (ret),
+ GTK_SOURCE_VIM_TEXT_OBJECT (text_object));
+ gtk_source_vim_state_set_count (ret, count);
+ gtk_source_vim_state_push (GTK_SOURCE_VIM_STATE (self), ret);
+
+ return ret;
+}
+
G_GNUC_NULL_TERMINATED
static GtkSourceVimState *
gtk_source_vim_normal_begin_insert (GtkSourceVimNormal *self,
@@ -648,6 +671,8 @@ key_handler_c_with_modifier (GtkSourceVimNormal *self,
GdkModifierType mods,
const char *string)
{
+ GtkSourceVimState *text_object = NULL;
+
g_assert (GTK_SOURCE_IS_VIM_NORMAL (self));
/* This should be a TextObject and we might need a "motion or
@@ -657,37 +682,102 @@ key_handler_c_with_modifier (GtkSourceVimNormal *self,
switch (keyval)
{
case GDK_KEY_w:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_word ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_word ();
+ break;
+
case GDK_KEY_W:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_WORD ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_WORD ();
+ break;
+
case GDK_KEY_p:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_paragraph ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_paragraph ();
+ break;
+
case GDK_KEY_s:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_sentence ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_sentence ();
break;
- case GDK_KEY_bracketleft:
case GDK_KEY_bracketright:
+ case GDK_KEY_bracketleft:
+ /* TODO: this needs to use separate mechanisms for [ vs ] */
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_block_bracket ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_block_bracket ();
break;
case GDK_KEY_braceleft:
case GDK_KEY_braceright:
- case GDK_KEY_B:
+ /* TODO: this needs to use separate mechanisms for { vs } */
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_block_brace ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_block_brace ();
break;
case GDK_KEY_less:
case GDK_KEY_greater:
+ /* TODO: this needs to use separate mechanisms for < vs > */
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_block_brace ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_block_brace ();
break;
case GDK_KEY_apostrophe:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_quote_single ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_quote_single ();
+ break;
+
case GDK_KEY_quotedbl:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_quote_double ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_quote_double ();
+ break;
+
+ case GDK_KEY_grave:
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_quote_grave ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_quote_grave ();
break;
case GDK_KEY_parenleft:
case GDK_KEY_parenright:
case GDK_KEY_b:
+ /* TODO: this needs to use separate mechanisms for ( vs ) */
+ if (self->change_modifier == CHANGE_A)
+ text_object = gtk_source_vim_text_object_new_a_block_paren ();
+ else
+ text_object = gtk_source_vim_text_object_new_inner_block_paren ();
break;
default:
break;
}
+ if (text_object != NULL)
+ {
+ gtk_source_vim_normal_begin_insert_text_object (self, text_object);
+ gtk_source_vim_normal_clear (self);
+ return TRUE;
+ }
+
return gtk_source_vim_normal_bail (self);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]