[gtksourceview/wip/chergert/vim] go to line number command and add test



commit 61e28a9acb6513be9250c36975dae547f665e400
Author: Christian Hergert <chergert redhat com>
Date:   Mon Nov 8 13:45:27 2021 -0800

    go to line number command and add test

 gtksourceview/vim/gtk-source-vim-command.c | 55 ++++++++++++++++++++++++++++++
 testsuite/test-vim-input.c                 |  8 +++++
 2 files changed, 63 insertions(+)
---
diff --git a/gtksourceview/vim/gtk-source-vim-command.c b/gtksourceview/vim/gtk-source-vim-command.c
index e7eb4ef8..ea0b61d1 100644
--- a/gtksourceview/vim/gtk-source-vim-command.c
+++ b/gtksourceview/vim/gtk-source-vim-command.c
@@ -65,6 +65,20 @@ static GParamSpec *properties[N_PROPS];
 static GHashTable *commands;
 static GPtrArray *commands_sorted;
 
+static inline gboolean
+parse_number (const char *str,
+              int        *number)
+{
+       gint64 out_num;
+
+       if (str == NULL)
+               return FALSE;
+       else if (!g_ascii_string_to_signed (str, 10, 0, G_MAXINT, &out_num, NULL))
+               return FALSE;
+       *number = out_num;
+       return TRUE;
+}
+
 static void
 gtk_source_vim_command_format (GtkSourceVimCommand *self)
 {
@@ -717,6 +731,37 @@ gtk_source_vim_command_search_reverse (GtkSourceVimCommand *self)
        }
 }
 
+static void
+gtk_source_vim_command_line_number (GtkSourceVimCommand *self)
+{
+       int line;
+
+       g_assert (GTK_SOURCE_IS_VIM_COMMAND (self));
+
+       if (parse_number (self->options, &line))
+       {
+               GtkSourceView *view;
+               GtkTextBuffer *buffer;
+               GtkTextIter iter;
+
+               if (line > 0)
+                       line--;
+
+               view = gtk_source_vim_state_get_view (GTK_SOURCE_VIM_STATE (self));
+               buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+               gtk_text_buffer_get_iter_at_line (buffer, &iter, line);
+
+               while (!gtk_text_iter_ends_line (&iter) &&
+                      g_unichar_isspace (gtk_text_iter_get_char (&iter)))
+                       gtk_text_iter_forward_char (&iter);
+
+               gtk_text_buffer_select_range (buffer, &iter, &iter);
+               gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (view), &iter, 0.25, TRUE, 1.0, 0.0);
+
+               self->ignore_mark = TRUE;
+       }
+}
+
 static void
 gtk_source_vim_command_append_command (GtkSourceVimState *state,
                                        GString           *string)
@@ -987,6 +1032,7 @@ gtk_source_vim_command_class_init (GtkSourceVimCommandClass *klass)
        ADD_COMMAND ("replace-one",    gtk_source_vim_command_replace_one);
        ADD_COMMAND ("indent",         gtk_source_vim_command_indent);
        ADD_COMMAND ("unindent",       gtk_source_vim_command_unindent);
+       ADD_COMMAND ("line-number",    gtk_source_vim_command_line_number);
        ADD_COMMAND ("format",         gtk_source_vim_command_format);
        ADD_COMMAND ("search",         gtk_source_vim_command_search);
        ADD_COMMAND ("search-reverse", gtk_source_vim_command_search_reverse);
@@ -1111,6 +1157,7 @@ gtk_source_vim_command_new_parsed (GtkSourceVimState *current,
        GtkSourceVimCommandClass *klass;
        GtkTextIter begin;
        GtkTextIter end;
+       int number;
 
        g_return_val_if_fail (command_line != NULL, NULL);
        g_return_val_if_fail (GTK_SOURCE_IS_VIM_STATE (current), NULL);
@@ -1166,6 +1213,14 @@ gtk_source_vim_command_new_parsed (GtkSourceVimState *current,
                        goto finish;
        }
 
+       if (parse_number (command_line, &number))
+       {
+               ret = GTK_SOURCE_VIM_COMMAND (gtk_source_vim_command_new ("line-number"));
+               ret->options = g_strdup (command_line);
+
+               goto finish;
+       }
+
        if (*command_line == 's')
        {
                ret = GTK_SOURCE_VIM_COMMAND (gtk_source_vim_command_new ("search-and-replace"));
diff --git a/testsuite/test-vim-input.c b/testsuite/test-vim-input.c
index 756ce1d7..19ec096a 100644
--- a/testsuite/test-vim-input.c
+++ b/testsuite/test-vim-input.c
@@ -64,6 +64,12 @@ run_test (const char *text,
                        string[2] = 0;
                        keyval = GDK_KEY_Escape;
                }
+               else if (ch == '\n')
+               {
+                       string[0] = '\n';
+                       string[1] = 0;
+                       keyval = GDK_KEY_Return;
+               }
                else
                {
                        keyval = gdk_unicode_to_keyval (ch);
@@ -105,6 +111,8 @@ test_motion (void)
        run_test ("1\n2\n3\n42", "vjjjx", "2");
        run_test ("1\n2\n3\n42", "vjjjVx", "");
        run_test ("1\n2\n3\n42", "jmzjjd'z", "1\n");
+       run_test ("1\n2\n3\n4\n5", "4Gd1G", "5");
+       run_test ("1\n2\n3\n4\n5", ":4\nd1G", "5");
 
 #if 0
        /* somehow VIM ignores \n before 4. */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]