[geany/geany-plugins] e0a21a: vimode: Allow browsing ex command history using arrows
Jiří Techet
git-noreply at xxxxx
Fri May 3 15:15:58 UTC 2019
Branch: refs/heads/master
Author: Jiří Techet <techet at gmail.com>
Committer: Jiří Techet <techet at gmail.com>
Date: Fri, 03 May 2019 15:15:58 UTC
Commit: e0a21aadf17f1e3ffb4547c4edfcf11e0480b98a
https://github.com/geany/geany-plugins/commit/e0a21aadf17f1e3ffb4547c4edfcf11e0480b98a
Log Message:
-----------
vimode: Allow browsing ex command history using arrows
The history is created only for the Geany session and unlike vim, isn't
persisted after Geany re-launch.
Modified Paths:
--------------
vimode/src/excmd-prompt.c
Modified: vimode/src/excmd-prompt.c
63 lines changed, 62 insertions(+), 1 deletions(-)
===================================================================
@@ -34,6 +34,8 @@
static GtkWidget *prompt;
static GtkWidget *entry;
static CmdContext *ctx;
+static GList *history;
+static gint history_pos;
static void close_prompt()
@@ -57,11 +59,66 @@ static gboolean on_prompt_key_press_event(GtkWidget *widget, GdkEventKey *event,
case GDK_KEY_Return:
case GDK_KEY_KP_Enter:
case GDK_KEY_ISO_Enter:
- excmd_perform(ctx, gtk_entry_get_text(GTK_ENTRY(entry)));
+ {
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
+ GList *link = g_list_find_custom(history, text, (GCompareFunc)g_strcmp0);
+
+ if (link)
+ {
+ g_free(link->data);
+ history = g_list_remove_link(history, link);
+ }
+ if (g_strcmp0(text, ":") != 0)
+ history = g_list_prepend(history, g_strdup(text));
+
+ excmd_perform(ctx, text);
close_prompt();
+
+ return TRUE;
+ }
+
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_uparrow:
+ {
+ gint history_len = g_list_length(history);
+
+ if (history_pos == -1 && history_len > 0)
+ history_pos = 0;
+ else if (history_pos + 1 < history_len)
+ history_pos++;
+
+ if (history_pos != -1 && history_pos < history_len)
+ {
+ gchar *val = g_list_nth_data(history, history_pos);
+ gtk_entry_set_text(GTK_ENTRY(entry), val);
+ gtk_editable_set_position(GTK_EDITABLE(entry), strlen(val));
+ }
+
return TRUE;
+ }
+
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_downarrow:
+ {
+ const gchar *val;
+
+ if (history_pos == -1)
+ return TRUE;
+
+ history_pos--;
+
+ val = history_pos == -1 ? ":" : g_list_nth_data(history, history_pos);
+ gtk_entry_set_text(GTK_ENTRY(entry), val);
+ gtk_editable_set_position(GTK_EDITABLE(entry), strlen(val));
+
+ return TRUE;
+ }
}
+ history_pos = -1;
+
return FALSE;
}
@@ -87,6 +144,8 @@ void ex_prompt_init(GtkWidget *parent_window, CmdContext *c)
ctx = c;
+ history = NULL;
+
/* prompt */
prompt = g_object_new(GTK_TYPE_WINDOW,
"decorated", FALSE,
@@ -128,6 +187,7 @@ static void position_prompt(void)
void ex_prompt_show(const gchar *val)
{
+ history_pos = -1;
gtk_widget_show(prompt);
position_prompt();
gtk_entry_set_text(GTK_ENTRY(entry), val);
@@ -138,4 +198,5 @@ void ex_prompt_show(const gchar *val)
void ex_prompt_cleanup(void)
{
gtk_widget_destroy(prompt);
+ g_list_free_full(history, g_free);
}
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list