]> jfr.im git - irc/weechat/weechat.git/commitdiff
core: add buffer local variable "completion_default_template" (evaluated) (closes...
authorSébastien Helleu <redacted>
Sat, 19 Dec 2020 13:25:13 +0000 (14:25 +0100)
committerSébastien Helleu <redacted>
Sat, 19 Dec 2020 13:25:13 +0000 (14:25 +0100)
When this local variable is set, it overrides the value of option
"weechat.completion.default_template".

It is evaluated, that means the global default template can be used to append
some custom completion. For example:

  /buffer set localvar_set_completion_default_template ${weechat.completion.default_template}|%(my_completion)

ChangeLog.adoc
src/gui/gui-completion.c

index 09c7f86ddb5e1beb200f3119cb5e633e10f127d8..3a840e0563b89da8bfa2eea77c44876a199925c5 100644 (file)
@@ -20,6 +20,7 @@ https://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
 
 New features::
 
+  * core: add buffer local variable "completion_default_template" (evaluated) to override the value of option "weechat.completion.default_template" (issue #1600)
   * core: add option "recreate" in command /filter
   * core: add evaluation of conditions in evaluation of expressions with "eval_cond:" (issue #1582)
   * trigger: add variable "${tg_trigger_name}" in command trigger evaluated strings (issue #1580)
index 88f9de1dc7f91b5cd91dd58e1b64a69dd8e692cc..6d02fba432b1bbf1ed3412dbf6d50dd066905fa2 100644 (file)
@@ -36,6 +36,7 @@
 #include "../core/wee-arraylist.h"
 #include "../core/wee-completion.h"
 #include "../core/wee-config.h"
+#include "../core/wee-eval.h"
 #include "../core/wee-hashtable.h"
 #include "../core/wee-hdata.h"
 #include "../core/wee-hook.h"
@@ -1337,6 +1338,46 @@ gui_completion_command (struct t_gui_completion *completion)
     gui_completion_complete (completion);
 }
 
+/*
+ * Gets default completion template: from buffer local variable
+ * "completion_default_template" if defined, or the value of option
+ * "weechat.completion.default_template".
+ *
+ * Note: result must be freed after use.
+ */
+
+char *
+gui_completion_get_default_template(struct t_gui_completion *completion)
+{
+    const char *ptr_default_template;
+    char *value;
+    struct t_hashtable *pointers;
+
+    /* search buffer local variable "completion_default_template" */
+    ptr_default_template = hashtable_get (
+        completion->buffer->local_variables,
+        "completion_default_template");
+
+    if (!ptr_default_template)
+    {
+        /* return the global default completion template */
+        ptr_default_template = CONFIG_STRING(config_completion_default_template);
+        return strdup ((ptr_default_template) ? ptr_default_template : "");
+    }
+
+    /* evaluate the buffer local variable */
+    pointers = hashtable_new (32,
+                              WEECHAT_HASHTABLE_STRING,
+                              WEECHAT_HASHTABLE_POINTER,
+                              NULL, NULL);
+    hashtable_set (pointers, "buffer", completion->buffer);
+    value = eval_expression (ptr_default_template, pointers, NULL, NULL);
+    if (pointers)
+        hashtable_free (pointers);
+
+    return (value) ? value : strdup ("");
+}
+
 /*
  * Auto-completes: nick, filename or channel.
  */
@@ -1344,6 +1385,8 @@ gui_completion_command (struct t_gui_completion *completion)
 void
 gui_completion_auto (struct t_gui_completion *completion)
 {
+    char *default_completion;
+
     /* filename completion */
     if ((completion->base_word[0] == '/')
         || (completion->base_word[0] == '~'))
@@ -1358,10 +1401,13 @@ gui_completion_auto (struct t_gui_completion *completion)
     /* use default template completion */
     if (completion->list->size == 0)
     {
+        default_completion = gui_completion_get_default_template (completion);
         gui_completion_build_list_template (
             completion,
-            CONFIG_STRING(config_completion_default_template),
+            (default_completion) ? default_completion : "",
             NULL);
+        if (default_completion)
+            free (default_completion);
     }
     gui_completion_complete (completion);
 }