[gnome-builder/wip/vim] vim: implement <Control>u in insert mode.
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/vim] vim: implement <Control>u in insert mode.
- Date: Tue, 30 Sep 2014 01:02:08 +0000 (UTC)
commit fd76e6eb20caf5fdc548b26f9b52d35cf77bebdc
Author: Christian Hergert <christian hergert me>
Date: Mon Sep 29 18:01:45 2014 -0700
vim: implement <Control>u in insert mode.
This will delete text up to the current cursor position. If the cursor
is on position 0, it will remove the newline.
src/editor/gb-editor-vim.c | 60 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 57 insertions(+), 3 deletions(-)
---
diff --git a/src/editor/gb-editor-vim.c b/src/editor/gb-editor-vim.c
index 9efb886..1731fee 100644
--- a/src/editor/gb-editor-vim.c
+++ b/src/editor/gb-editor-vim.c
@@ -642,14 +642,49 @@ gb_editor_vim_delete_to_line_end (GbEditorVim *vim)
insert = gtk_text_buffer_get_insert (buffer);
gtk_text_buffer_get_iter_at_mark (buffer, &begin, insert);
gtk_text_iter_assign (&end, &begin);
-
+
/*
* Move forward to the end of the line, excluding the \n.
*/
while (!gtk_text_iter_ends_line (&end))
if (!gtk_text_iter_forward_char (&end))
break;
-
+
+ gtk_text_buffer_begin_user_action (buffer);
+ gtk_text_buffer_delete (buffer, &begin, &end);
+ gtk_text_buffer_end_user_action (buffer);
+
+ vim->priv->target_line_offset = gb_editor_vim_get_line_offset (vim);
+}
+
+static void
+gb_editor_vim_delete_to_line_start (GbEditorVim *vim)
+{
+ GtkTextBuffer *buffer;
+ GtkTextMark *insert;
+ GtkTextIter begin;
+ GtkTextIter end;
+
+ g_return_if_fail (GB_IS_EDITOR_VIM (vim));
+
+ buffer = gtk_text_view_get_buffer (vim->priv->text_view);
+ insert = gtk_text_buffer_get_insert (buffer);
+ gtk_text_buffer_get_iter_at_mark (buffer, &begin, insert);
+ gtk_text_iter_assign (&end, &begin);
+
+ /*
+ * Move backward to the start of the line. If we are at the start of a line
+ * already, we actually just want to remove the \n.
+ */
+ if (!gtk_text_iter_starts_line (&begin))
+ {
+ while (!gtk_text_iter_starts_line (&begin))
+ if (!gtk_text_iter_backward_char (&begin))
+ break;
+ }
+ else
+ gtk_text_iter_backward_char (&begin);
+
gtk_text_buffer_begin_user_action (buffer);
gtk_text_buffer_delete (buffer, &begin, &end);
gtk_text_buffer_end_user_action (buffer);
@@ -877,10 +912,29 @@ static gboolean
gb_editor_vim_handle_insert (GbEditorVim *vim,
GdkEventKey *event)
{
- if (event->keyval == GDK_KEY_Escape)
+ switch (event->keyval)
{
+ case GDK_KEY_Escape:
+ /*
+ * Escape back into NORMAL mode.
+ */
gb_editor_vim_set_mode (vim, GB_EDITOR_VIM_NORMAL);
return TRUE;
+
+ case GDK_KEY_u:
+ /*
+ * Delete everything before the cursor upon <Control>U.
+ */
+ if ((event->state & GDK_CONTROL_MASK) != 0)
+ {
+ gb_editor_vim_delete_to_line_start (vim);
+ return TRUE;
+ }
+
+ break;
+
+ default:
+ break;
}
return FALSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]