[gtksourceview/wip/chergert/vim: 302/363] wire up text objects to ci/ca strokes




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]