summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtksourceview/vim/gtksourcevimvisual.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/gtksourceview/vim/gtksourcevimvisual.c b/gtksourceview/vim/gtksourcevimvisual.c
index a6f81050..bfbe99b8 100644
--- a/gtksourceview/vim/gtksourcevimvisual.c
+++ b/gtksourceview/vim/gtksourcevimvisual.c
@@ -32,6 +32,7 @@
#include "gtksourcevimmotion.h"
#include "gtksourcevimreplace.h"
#include "gtksourcevimvisual.h"
+#include "gtksourcevimregisters.h"
typedef gboolean (*KeyHandler) (GtkSourceVimVisual *self,
guint keyval,
@@ -449,6 +450,48 @@ gtk_source_vim_visual_begin_insert (GtkSourceVimVisual *self)
}
static gboolean
+gtk_source_vim_visual_put (GtkSourceVimVisual *self,
+ gboolean clipboard)
+{
+ GtkSourceVimRegisters *registers;
+ GtkSourceBuffer *buffer;
+ const char *replace_content;
+ const char *selection_content;
+ GtkTextIter start;
+ GtkTextIter end;
+
+ g_assert (GTK_SOURCE_IS_VIM_VISUAL (self));
+
+ buffer = gtk_source_vim_state_get_buffer (GTK_SOURCE_VIM_STATE (self), NULL, NULL);
+
+ if (clipboard)
+ {
+ registers = GTK_SOURCE_VIM_REGISTERS (gtk_source_vim_state_get_registers (GTK_SOURCE_VIM_STATE (self)));
+ replace_content = gtk_source_vim_registers_get (registers, "+");
+ }
+ else
+ {
+ replace_content = gtk_source_vim_state_get_current_register_value (GTK_SOURCE_VIM_STATE (self));
+ }
+
+ gtk_source_vim_visual_get_bounds (self, &start, &end);
+ gtk_text_iter_forward_char (&start);
+ selection_content = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (buffer), &start, &end, FALSE);
+
+ gtk_text_buffer_begin_user_action (GTK_TEXT_BUFFER (buffer));
+ gtk_text_buffer_delete_selection (GTK_TEXT_BUFFER (buffer), TRUE, TRUE);
+ gtk_text_buffer_insert_at_cursor (GTK_TEXT_BUFFER (buffer), replace_content, strlen (replace_content));
+ gtk_source_vim_state_set_current_register_value (GTK_SOURCE_VIM_STATE (self), selection_content);
+ gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
+
+ gtk_source_vim_state_pop (GTK_SOURCE_VIM_STATE (self));
+
+ gtk_source_vim_visual_clear (self);
+
+ return TRUE;
+}
+
+static gboolean
gtk_source_vim_visual_replace (GtkSourceVimVisual *self)
{
g_assert (GTK_SOURCE_IS_VIM_VISUAL (self));
@@ -620,6 +663,9 @@ key_handler_initial (GtkSourceVimVisual *self,
case GDK_KEY_r:
return gtk_source_vim_visual_replace (self);
+ case GDK_KEY_p:
+ return gtk_source_vim_visual_put (self, FALSE);
+
case GDK_KEY_greater:
return gtk_source_vim_visual_begin_command (self, "indent", FALSE);
@@ -857,6 +903,21 @@ gtk_source_vim_visual_handle_keypress (GtkSourceVimState *state,
return TRUE;
}
+ /* Now handle our commands */
+ if ((mods & GDK_CONTROL_MASK) != 0)
+ {
+ switch (keyval)
+ {
+ case GDK_KEY_V:
+ /* For the terminal users out there */
+ gtk_source_vim_visual_put (GTK_SOURCE_VIM_VISUAL (state), TRUE);
+ return TRUE;
+
+ default:
+ break;
+ }
+ }
+
return self->handler (self, keyval, keycode, mods, string);
}