[gtksourceview/wip/chergert/vim] go to line number command and add test
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/chergert/vim] go to line number command and add test
- Date: Mon, 8 Nov 2021 21:48:00 +0000 (UTC)
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]