From 0294b246f6e6697022068265e74c9b66795fae42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sat, 19 Dec 2020 14:25:13 +0100 Subject: [PATCH] core: add buffer local variable "completion_default_template" (evaluated) (closes #1600) 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 | 1 + src/gui/gui-completion.c | 48 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 09c7f86dd..3a840e056 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -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) diff --git a/src/gui/gui-completion.c b/src/gui/gui-completion.c index 88f9de1dc..6d02fba43 100644 --- a/src/gui/gui-completion.c +++ b/src/gui/gui-completion.c @@ -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); }