[gnome-builder/wip/vim] vim: make move to start handle whitespace lines closer to VIM



commit cdba80cba8b0513eacb6d5d994228a7945c8ab1c
Author: Christian Hergert <christian hergert me>
Date:   Wed Oct 1 15:50:18 2014 -0700

    vim: make move to start handle whitespace lines closer to VIM
    
    In pariticular, fallback to using the line0 position. Also, don't allow
    us to move past the current cursor position.

 src/editor/gb-editor-vim.c |   34 ++++++++++++++++++++++++----------
 1 files changed, 24 insertions(+), 10 deletions(-)
---
diff --git a/src/editor/gb-editor-vim.c b/src/editor/gb-editor-vim.c
index 249812f..1c42ca8 100644
--- a/src/editor/gb-editor-vim.c
+++ b/src/editor/gb-editor-vim.c
@@ -292,7 +292,7 @@ gb_editor_vim_select_range (GbEditorVim *vim,
 }
 
 static void
-gb_editor_vim_move_line_start (GbEditorVim *vim)
+gb_editor_vim_move_line0 (GbEditorVim *vim)
 {
   GtkTextBuffer *buffer;
   GtkTextIter iter;
@@ -304,13 +304,7 @@ gb_editor_vim_move_line_start (GbEditorVim *vim)
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (vim->priv->text_view));
   has_selection = gb_editor_vim_get_selection_bounds (vim, &iter, &selection);
 
-  gtk_text_buffer_get_iter_at_line (buffer, &iter,
-                                    gtk_text_iter_get_line (&iter));
-
-  while (!gtk_text_iter_ends_line (&iter) &&
-         g_unichar_isspace (gtk_text_iter_get_char (&iter)))
-    if (!gtk_text_iter_forward_char (&iter))
-      break;
+  gtk_text_iter_set_line_offset (&iter, 0);
 
   if (has_selection)
     gb_editor_vim_select_range (vim, &iter, &selection);
@@ -321,19 +315,39 @@ gb_editor_vim_move_line_start (GbEditorVim *vim)
 }
 
 static void
-gb_editor_vim_move_line0 (GbEditorVim *vim)
+gb_editor_vim_move_line_start (GbEditorVim *vim)
 {
   GtkTextBuffer *buffer;
   GtkTextIter iter;
+  GtkTextIter original;
   GtkTextIter selection;
   gboolean has_selection;
+  guint line;
 
   g_assert (GB_IS_EDITOR_VIM (vim));
 
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (vim->priv->text_view));
   has_selection = gb_editor_vim_get_selection_bounds (vim, &iter, &selection);
+  line = gtk_text_iter_get_line (&iter);
+  gtk_text_iter_assign (&original, &iter);
 
-  gtk_text_iter_set_line_offset (&iter, 0);
+  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)))
+    if (!gtk_text_iter_forward_char (&iter))
+      break;
+
+  /*
+   * If we failed to find a non-whitespace character or ended up at the
+   * same place we already were, just use the 0 index position.
+   */
+  if (g_unichar_isspace (gtk_text_iter_get_char (&iter)) ||
+      gtk_text_iter_equal (&iter, &original))
+    {
+      gb_editor_vim_move_line0 (vim);
+      return;
+    }
 
   if (has_selection)
     gb_editor_vim_select_range (vim, &iter, &selection);


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