From 21e5d80ab1505442c96e11075f09d98bcaa211ba Mon Sep 17 00:00:00 2001
From: Přemysl Eric Janouch <p@janouch.name>
Date: Sun, 18 Sep 2022 02:40:53 +0200
Subject: xC: improve Readline completion

The autocomplete for /set used to be extremely annoying,
and menu-complete-display-prefix also prevents mistaken highlights.

One downside is that using plain Tab in channels no longer
just inserts the last-talking nickname, one needs to press it twice.
---
 NEWS |  3 +++
 xC.c | 12 ++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/NEWS b/NEWS
index dcf8c54..3c0adfc 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,9 @@
 
  * xC: unsolicited JOINs will no longer automatically activate the buffer
 
+ * xC: made Readline insert the longest common completion prefix first,
+   and prevented the possible-completions command from duplicating the prompt
+
  * xC: normalized editline's history behaviour, making it a viable frontend
 
  * xC: various bugfixes
diff --git a/xC.c b/xC.c
index e6ece0d..211f3e0 100644
--- a/xC.c
+++ b/xC.c
@@ -14434,6 +14434,15 @@ app_readline_completion (const char *text, int start, int end)
 	return make_input_completions (g_ctx, rl_line_buffer, start, end);
 }
 
+static void
+app_readline_display_matches (char **matches, int len, int longest)
+{
+	struct app_context *ctx = g_ctx;
+	CALL (ctx->input, hide);
+	rl_display_match_list (matches, len, longest);
+	CALL (ctx->input, show);
+}
+
 static int
 app_readline_init (void)
 {
@@ -14458,7 +14467,10 @@ app_readline_init (void)
 	rl_bind_key (RETURN, rl_named_function ("send-line"));
 	CALL_ (self, bind_control, 'j', "send-line");
 
+	rl_completion_display_matches_hook = app_readline_display_matches;
+
 	rl_variable_bind ("completion-ignore-case", "on");
+	rl_variable_bind ("menu-complete-display-prefix", "on");
 	rl_bind_key (TAB, rl_named_function ("menu-complete"));
 	if (key_btab)
 		CALL_ (self, bind, key_btab, "menu-complete-backward");
-- 
cgit v1.2.3-70-g09d2