[gnome-builder/wip/libide] libide: implement jump to unmatched brace or paren



commit e2e934a33eabcdc636e2f108885f1f36a0681338
Author: Christian Hergert <christian hergert me>
Date:   Sat Mar 7 15:42:10 2015 -0800

    libide: implement jump to unmatched brace or paren
    
    This allows you to quickly jump to the beginning or end of the current
    stop or parameter list.

 libide/ide-source-view-movements.c |   94 ++++++++++++++++++++++++++++++++++++
 libide/ide-source-view.h           |    6 ++
 2 files changed, 100 insertions(+), 0 deletions(-)
---
diff --git a/libide/ide-source-view-movements.c b/libide/ide-source-view-movements.c
index 643d600..18e61ba 100644
--- a/libide/ide-source-view-movements.c
+++ b/libide/ide-source-view-movements.c
@@ -1040,6 +1040,80 @@ ide_source_view_movements_line_percentage (Movement *mv)
   ide_source_view_movements_first_nonspace_char (mv);
 }
 
+static void
+ide_source_view_movements_previous_unmatched (Movement *mv,
+                                              gunichar  target,
+                                              gunichar  opposite)
+{
+  guint count = 1;
+
+  g_assert (mv);
+  g_assert (target);
+  g_assert (opposite);
+
+  do
+    {
+      gunichar ch;
+
+      if (!gtk_text_iter_backward_char (&mv->insert))
+        return;
+
+      ch = gtk_text_iter_get_char (&mv->insert);
+
+      if (ch == target)
+        count--;
+      else if (ch == opposite)
+        count++;
+
+      if (!count)
+        {
+          if (!mv->exclusive)
+            gtk_text_iter_forward_char (&mv->insert);
+          return;
+        }
+    }
+  while (TRUE);
+
+  g_assert_not_reached ();
+}
+
+static void
+ide_source_view_movements_next_unmatched (Movement *mv,
+                                          gunichar  target,
+                                          gunichar  opposite)
+{
+  guint count = 1;
+
+  g_assert (mv);
+  g_assert (target);
+  g_assert (opposite);
+
+  do
+    {
+      gunichar ch;
+
+      if (!gtk_text_iter_forward_char (&mv->insert))
+        return;
+
+      ch = gtk_text_iter_get_char (&mv->insert);
+
+      if (ch == target)
+        count--;
+      else if (ch == opposite)
+        count++;
+
+      if (!count)
+        {
+          if (!mv->exclusive)
+            gtk_text_iter_forward_char (&mv->insert);
+          return;
+        }
+    }
+  while (TRUE);
+
+  g_assert_not_reached ();
+}
+
 void
 _ide_source_view_apply_movement (IdeSourceView         *self,
                                  IdeSourceViewMovement  movement,
@@ -1259,6 +1333,26 @@ _ide_source_view_apply_movement (IdeSourceView         *self,
       ide_source_view_movements_scroll_center (&mv);
       break;
 
+    case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_BRACE:
+      for (i = MAX (1, mv.count); i > 0; i--)
+        ide_source_view_movements_previous_unmatched (&mv, '{', '}');
+      break;
+
+    case IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_BRACE:
+      for (i = MAX (1, mv.count); i > 0; i--)
+        ide_source_view_movements_next_unmatched (&mv, '}', '{');
+      break;
+
+    case IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_PAREN:
+      for (i = MAX (1, mv.count); i > 0; i--)
+        ide_source_view_movements_previous_unmatched (&mv, '(', ')');
+      break;
+
+    case IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_PAREN:
+      for (i = MAX (1, mv.count); i > 0; i--)
+        ide_source_view_movements_next_unmatched (&mv, ')', '(');
+      break;
+
     default:
       g_return_if_reached ();
     }
diff --git a/libide/ide-source-view.h b/libide/ide-source-view.h
index 5b1e4c2..fda3d42 100644
--- a/libide/ide-source-view.h
+++ b/libide/ide-source-view.h
@@ -180,6 +180,12 @@ typedef enum
   IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_TOP,
   IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_CENTER,
   IDE_SOURCE_VIEW_MOVEMENT_SCROLL_SCREEN_BOTTOM,
+
+  IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_BRACE,
+  IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_BRACE,
+
+  IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_UNMATCHED_PAREN,
+  IDE_SOURCE_VIEW_MOVEMENT_NEXT_UNMATCHED_PAREN,
 } IdeSourceViewMovement;
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (IdeSourceView, g_object_unref)


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