summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2009-04-11 14:49:34 +0200
committerSebastien Helleu <flashcode@flashtux.org>2009-04-11 14:49:34 +0200
commitacb57723343d61cc287a260333c28d802d6ea70f (patch)
tree6d154d5b7b2e1fcdc3b0702e9a5693d342e710a6 /src/core
parent8ac00cdac6ba3a2caf9a7b282701e3bb22c988de (diff)
downloadweechat-acb57723343d61cc287a260333c28d802d6ea70f.zip
Add support of many templates for completion of command arguments, rename default completion items
Diffstat (limited to 'src/core')
-rw-r--r--src/core/wee-command.c187
-rw-r--r--src/core/wee-config.c2
-rw-r--r--src/core/wee-hook.c358
-rw-r--r--src/core/wee-hook.h28
-rw-r--r--src/core/wee-proxy.h1
-rw-r--r--src/core/weechat.c2
6 files changed, 427 insertions, 151 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c
index cd11607c3..85f0a9328 100644
--- a/src/core/wee-command.c
+++ b/src/core/wee-command.c
@@ -1753,42 +1753,46 @@ command_key (void *data, struct t_gui_buffer *buffer,
return WEECHAT_RC_OK;
}
- /* reset keys (only with "-yes", for security reason) */
- if (string_strcasecmp (argv[1], "reset") == 0)
+ /* bind a key (or display binding) */
+ if (string_strcasecmp (argv[1], "bind") == 0)
{
- if ((argc >= 3) && (string_strcasecmp (argv[2], "-yes") == 0))
+ if (argc == 3)
{
- gui_keyboard_free_all (&gui_keys, &last_gui_key);
- gui_keyboard_default_bindings ();
- gui_chat_printf (NULL,
- _("Default key bindings restored"));
+ ptr_key = NULL;
+ internal_code = gui_keyboard_get_internal_code (argv[2]);
+ if (internal_code)
+ ptr_key = gui_keyboard_search (NULL, internal_code);
+ if (ptr_key)
+ {
+ gui_chat_printf (NULL, "");
+ gui_chat_printf (NULL, _("Key:"));
+ command_key_display (ptr_key);
+ }
+ else
+ {
+ gui_chat_printf (NULL,
+ _("No key found"));
+ }
+ if (internal_code)
+ free (internal_code);
+ return WEECHAT_RC_OK;
}
- else
+
+ /* bind new key */
+ gui_keyboard_verbose = 1;
+ ptr_key = gui_keyboard_bind (NULL, argv[2], argv_eol[3]);
+ gui_keyboard_verbose = 0;
+ if (!ptr_key)
{
gui_chat_printf (NULL,
- _("%sError: \"-yes\" argument is required for "
- "keys reset (security reason)"),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
+ _("%sError: unable to bind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[2]);
return WEECHAT_RC_ERROR;
}
return WEECHAT_RC_OK;
}
- /* add missing keys */
- if (string_strcasecmp (argv[1], "missing") == 0)
- {
- old_keys_count = gui_keys_count;
- gui_keyboard_verbose = 1;
- gui_keyboard_default_bindings ();
- gui_keyboard_verbose = 0;
- keys_added = (gui_keys_count > old_keys_count) ?
- gui_keys_count - old_keys_count : 0;
- gui_chat_printf (NULL,
- NG_("%d new key added", "%d new keys added", keys_added),
- keys_added);
- return WEECHAT_RC_OK;
- }
-
/* unbind a key */
if (string_strcasecmp (argv[1], "unbind") == 0)
{
@@ -1812,40 +1816,40 @@ command_key (void *data, struct t_gui_buffer *buffer,
return WEECHAT_RC_OK;
}
- /* display a key */
- if (argc == 2)
+ /* reset keys (only with "-yes", for security reason) */
+ if (string_strcasecmp (argv[1], "reset") == 0)
{
- ptr_key = NULL;
- internal_code = gui_keyboard_get_internal_code (argv[1]);
- if (internal_code)
- ptr_key = gui_keyboard_search (NULL, internal_code);
- if (ptr_key)
+ if ((argc >= 3) && (string_strcasecmp (argv[2], "-yes") == 0))
{
- gui_chat_printf (NULL, "");
- gui_chat_printf (NULL, _("Key:"));
- command_key_display (ptr_key);
+ gui_keyboard_free_all (&gui_keys, &last_gui_key);
+ gui_keyboard_default_bindings ();
+ gui_chat_printf (NULL,
+ _("Default key bindings restored"));
}
else
{
gui_chat_printf (NULL,
- _("No key found"));
+ _("%sError: \"-yes\" argument is required for "
+ "keys reset (security reason)"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
+ return WEECHAT_RC_ERROR;
}
- if (internal_code)
- free (internal_code);
return WEECHAT_RC_OK;
}
- /* bind new key */
- gui_keyboard_verbose = 1;
- ptr_key = gui_keyboard_bind (NULL, argv[1], argv_eol[2]);
- gui_keyboard_verbose = 0;
- if (!ptr_key)
+ /* add missing keys */
+ if (string_strcasecmp (argv[1], "missing") == 0)
{
+ old_keys_count = gui_keys_count;
+ gui_keyboard_verbose = 1;
+ gui_keyboard_default_bindings ();
+ gui_keyboard_verbose = 0;
+ keys_added = (gui_keys_count > old_keys_count) ?
+ gui_keys_count - old_keys_count : 0;
gui_chat_printf (NULL,
- _("%sError: unable to bind key \"%s\""),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[1]);
- return WEECHAT_RC_ERROR;
+ NG_("%d new key added", "%d new keys added", keys_added),
+ keys_added);
+ return WEECHAT_RC_OK;
}
return WEECHAT_RC_OK;
@@ -3658,10 +3662,17 @@ command_init ()
" /bar scroll nicklist #weechat y-100%\n"
" scroll to end of nicklist on current buffer:\n"
" /bar scroll nicklist * ye"),
- "add|default|del|set|hide|show|toggle|scroll|list|listfull|"
- "listitems %r name|hidden|priority|conditions|position|"
- "filling_top_bottom|filling_left_right|size|size_max|"
- "color_fg|color_delim|color_bg|separator|items",
+ "add %(bars_names) root|window bottom|top|left|right"
+ " || default"
+ " || del %(bars_names)|-all"
+ " || set %(bars_names) %(bars_options)"
+ " || hide %(bars_names)"
+ " || show %(bars_names)"
+ " || toggle %(bars_names)"
+ " || scroll %(bars_names) %(buffers_plugins_names)|*"
+ " || list"
+ " || listfull"
+ " || listitems",
&command_bar, NULL);
hook_command (NULL, "buffer",
N_("manage buffers"),
@@ -3686,7 +3697,15 @@ command_init ()
" close buffer: /buffer close\n"
" jump to #weechat: /buffer #weechat\n"
" jump to next buffer: /buffer +1"),
- "clear|move|close|list|notify|localvar|set|%b %b",
+ "clear -all|%(buffers_numbers)"
+ " || move %(buffers_numbers)"
+ " || close"
+ " || list"
+ " || notify"
+ " || localvar"
+ " || set"
+ " || %(buffers_names)"
+ " || %(buffers_numbers)",
&command_buffer, NULL);
hook_command (NULL, "command",
N_("launch explicit WeeChat or plugin command"),
@@ -3695,7 +3714,7 @@ command_init ()
"command)\n"
"command: command to execute (a '/' is automatically "
"added if not found at beginning of command)"),
- "%p|" PLUGIN_CORE " %P",
+ "%(plugins_names)|" PLUGIN_CORE " %(plugins_commands)",
&command_command, NULL);
hook_command (NULL, "debug",
N_("control debug for core/plugins"),
@@ -3709,7 +3728,7 @@ command_init ()
"windows: display windows tree\n"
" text: send \"debug\" signal with \"text\" as "
"argument"),
- "%p|core|list|dump|buffer|windows",
+ "%(plugins_names)|core|list|dump|buffer|windows",
&command_debug, NULL);
hook_command (NULL, "filter",
N_("filter messages in buffers, to hide/show them according "
@@ -3745,14 +3764,19 @@ command_init ()
" filter lines containing \"weechat sucks\" on IRC "
"channel #weechat:\n"
" /filter add sucks irc.freenode.#weechat * weechat sucks"),
- "list|enable|disable|toggle|add|rename|del %F %B",
+ "list"
+ " || enable %(filters_names)"
+ " || disable %(filters_names)"
+ " || toggle %(filters_names)"
+ " || add %(filters_names) %(buffers_plugins_names)|*"
+ " || del %(filters_names)|-all",
&command_filter, NULL);
hook_command (NULL, "help",
N_("display help about commands and options"),
N_("[command | option]"),
N_("command: a command name\n"
" option: an option name (use /set to see list)"),
- "%h|%o",
+ "%(commands)|%(config_options)",
&command_help, NULL);
hook_command (NULL, "history",
N_("show buffer command history"),
@@ -3791,14 +3815,18 @@ command_init ()
&command_input, NULL);
hook_command (NULL, "key",
N_("bind/unbind keys"),
- N_("[key [command [args]]] | [unbind key] | [reset -yes] | "
- "[missing]"),
- N_(" key: display or bind this key to a command\n"
- " unbind: unbind a key\n"
- " reset: restore bindings to the default values and "
+ N_("[bind key [command [args]]] | [unbind key] | "
+ "[reset -yes] | [missing]"),
+ N_(" bind: bind a command to a key or display command "
+ "bound to key\n"
+ " unbind: remove a key binding\n"
+ " reset: restore bindings to the default values and "
"delete ALL personal bindings (use carefully!)\n"
- " missing: add missing keys (using default bindings)"),
- "unbind|reset|missing",
+ "missing: add missing keys (using default bindings)"),
+ "bind %(keys_codes) %(commands)"
+ " || unbind %(key_codes)"
+ " || reset"
+ " || missing",
&command_key, NULL);
hook_command (NULL, "layout",
N_("save/apply/reset layout for buffers and windows"),
@@ -3824,7 +3852,12 @@ command_init ()
"all plugins, then autoload plugins)\n"
" unload: unload one or all plugins\n\n"
"Without argument, this command lists loaded plugins."),
- "list|listfull|load|autoload|reload|unload %f|%p",
+ "list %(plugins_names)"
+ " || listfull %(plugins_names)"
+ " || load %(filename)"
+ " || autoload"
+ " || reload %(plugins_names)"
+ " || unload %(plugins_names)",
&command_plugin, NULL);
hook_command (NULL, "proxy",
N_("manage proxies"),
@@ -3854,7 +3887,10 @@ command_init ()
" /proxy add myproxy socks5 sample.host.org 3128 myuser mypass\n"
" delete a proxy:\n"
" /proxy del myproxy"),
- "add|del|set|list %y name|type|ipv6|address|port|username|password",
+ "add %(proxies_names) http|socks4|socks5"
+ " || del %(proxies_names)"
+ " || set %(proxies_names) %(proxies_options)"
+ " || list ",
&command_proxy, NULL);
hook_command (NULL, "quit",
N_("quit WeeChat"),
@@ -3867,7 +3903,7 @@ command_init ()
N_("file: configuration file to reload\n\n"
"Without argument, all files (WeeChat and plugins) are "
"reloaded."),
- "%c|%*",
+ "%(config_files)|%*",
&command_reload, NULL);
hook_command (NULL, "save",
N_("save configuration files to disk"),
@@ -3875,7 +3911,7 @@ command_init ()
N_("file: configuration file to save\n\n"
"Without argument, all files (WeeChat and plugins) are "
"saved."),
- "%c|%*",
+ "%(config_files)|%*",
&command_save, NULL);
hook_command (NULL, "set",
N_("set config options"),
@@ -3890,7 +3926,7 @@ command_init ()
"For all types, you can use null to remove "
"option value (undefined value). This works only "
"for some special plugin variables."),
- "%o %v",
+ "%(config_options) %(config_option_values)",
&command_set, NULL);
hook_command (NULL, "unset",
N_("unset/reset config options"),
@@ -3899,7 +3935,7 @@ command_init ()
"to mass-reset options, use carefully!)\n\n"
"According to option, it's reset (for standard options) "
"or removed (for optional settings, like server values)."),
- "%o",
+ "%(config_options)",
&command_unset, NULL);
hook_command (NULL, "upgrade",
N_("upgrade WeeChat without disconnecting from servers"),
@@ -3909,7 +3945,7 @@ command_init ()
"This command run again a WeeChat binary, so it should "
"have been compiled or installed with a package manager "
"before running this command."),
- "%f",
+ "%(filename)",
&command_upgrade, NULL);
hook_command (NULL, "uptime",
N_("show WeeChat uptime"),
@@ -3967,10 +4003,11 @@ command_init ()
" scroll 2 lines up: /window scroll -2\n"
" scroll 2 days up: /window scroll -2d\n"
" scroll to beginning of current day: /window scroll -d"),
- "list|-1|+1|up|down|left|right|splith|splitv|resize|merge|"
- "page_up|page_down|refresh|scroll_up|scroll|scroll_down|"
- "scroll_top|scroll_bottom|scroll_previous_highlight|"
- "scroll_next_highlight|zoom all",
+ "list|-1|+1|up|down|left|right|splith|splitv|resize|page_up|"
+ "page_down|refresh|scroll_up|scroll|scroll_down|scroll_top|"
+ "scroll_bottom|scroll_previous_highlight|"
+ "scroll_next_highlight|zoom"
+ " || merge all",
&command_window, NULL);
}
diff --git a/src/core/wee-config.c b/src/core/wee-config.c
index 5841516f0..94ccb915b 100644
--- a/src/core/wee-config.c
+++ b/src/core/wee-config.c
@@ -1606,7 +1606,7 @@ config_weechat_init_options ()
"default_template", "string",
N_("default completion template (please see documentation for template "
"codes and values)"),
- NULL, 0, 0, "%n|%(irc_channels)", NULL, 0,
+ NULL, 0, 0, "%(nicks)|%(irc_channels)", NULL, 0,
NULL, NULL, NULL, NULL, NULL, NULL);
config_completion_nick_add_space = config_file_new_option (
weechat_config_file, ptr_section,
diff --git a/src/core/wee-hook.c b/src/core/wee-hook.c
index f5e880488..c6e41d97f 100644
--- a/src/core/wee-hook.c
+++ b/src/core/wee-hook.c
@@ -35,9 +35,11 @@
#include "weechat.h"
#include "wee-hook.h"
#include "wee-infolist.h"
+#include "wee-list.h"
#include "wee-log.h"
#include "wee-network.h"
#include "wee-string.h"
+#include "wee-utf8.h"
#include "wee-util.h"
#include "../gui/gui-buffer.h"
#include "../gui/gui-chat.h"
@@ -322,6 +324,164 @@ hook_search_command (struct t_weechat_plugin *plugin, const char *command)
}
/*
+ * hook_command_build_completion: build variables/arrays that will be used for
+ * completion of commands arguments
+ */
+
+void
+hook_command_build_completion (struct t_hook_command *hook_command)
+{
+ int i, j, k, length, num_items;
+ struct t_weelist *list;
+ char *pos_completion, *pos_double_pipe, *pos_start, *pos_end;
+ char **items, *last_space, *ptr_template;
+
+ /* split templates using "||" as separator */
+ hook_command->cplt_num_templates = 1;
+ pos_completion = hook_command->completion;
+ while ((pos_double_pipe = strstr (pos_completion, "||")) != NULL)
+ {
+ hook_command->cplt_num_templates++;
+ pos_completion = pos_double_pipe + 2;
+ }
+ hook_command->cplt_templates = malloc (hook_command->cplt_num_templates *
+ sizeof (*hook_command->cplt_templates));
+ for (i = 0; i < hook_command->cplt_num_templates; i++)
+ {
+ hook_command->cplt_templates[i] = NULL;
+ }
+ pos_completion = hook_command->completion;
+ i = 0;
+ while (pos_completion)
+ {
+ pos_double_pipe = strstr (pos_completion, "||");
+ if (!pos_double_pipe)
+ pos_double_pipe = pos_completion + strlen (pos_completion);
+ pos_start = pos_completion;
+ pos_end = pos_double_pipe - 1;
+ if (pos_end < pos_start)
+ {
+ hook_command->cplt_templates[i] = strdup ("");
+ }
+ else
+ {
+ while (pos_start[0] == ' ')
+ {
+ pos_start++;
+ }
+ pos_end = pos_double_pipe - 1;
+ while ((pos_end > pos_start) && (pos_end[0] == ' '))
+ {
+ pos_end--;
+ }
+ hook_command->cplt_templates[i] = string_strndup (pos_start,
+ pos_end - pos_start + 1);
+ }
+ i++;
+ if (!pos_double_pipe[0])
+ pos_completion = NULL;
+ else
+ pos_completion = pos_double_pipe + 2;
+ }
+
+ /* for each template, split/count args */
+ hook_command->cplt_templates_static = malloc (hook_command->cplt_num_templates *
+ sizeof (*hook_command->cplt_templates_static));
+ hook_command->cplt_template_num_args = malloc (hook_command->cplt_num_templates *
+ sizeof (*hook_command->cplt_template_num_args));
+ hook_command->cplt_template_args = malloc (hook_command->cplt_num_templates *
+ sizeof (*hook_command->cplt_template_args));
+ hook_command->cplt_template_num_args_concat = 0;
+ for (i = 0; i < hook_command->cplt_num_templates; i++)
+ {
+ /* build static part of template: it's first argument(s) which does not
+ contain "%" or "|" */
+ last_space = NULL;
+ ptr_template = hook_command->cplt_templates[i];
+ while (ptr_template && ptr_template[0])
+ {
+ if (ptr_template[0] == ' ')
+ last_space = ptr_template;
+ else if ((ptr_template[0] == '%') || (ptr_template[0] == '|'))
+ break;
+ ptr_template = utf8_next_char (ptr_template);
+ }
+ if (last_space)
+ {
+ last_space--;
+ while (last_space > hook_command->cplt_templates[i])
+ {
+ if (last_space[0] != ' ')
+ break;
+ }
+ if (last_space < hook_command->cplt_templates[i])
+ last_space = NULL;
+ else
+ last_space++;
+ }
+ if (last_space)
+ hook_command->cplt_templates_static[i] = string_strndup (hook_command->cplt_templates[i],
+ last_space - hook_command->cplt_templates[i]);
+ else
+ hook_command->cplt_templates_static[i] = strdup (hook_command->cplt_templates[i]);
+
+ /* build arguments for each template */
+ hook_command->cplt_template_args[i] = string_explode (hook_command->cplt_templates[i],
+ " ", 0, 0,
+ &(hook_command->cplt_template_num_args[i]));
+ if (hook_command->cplt_template_num_args[i] > hook_command->cplt_template_num_args_concat)
+ hook_command->cplt_template_num_args_concat = hook_command->cplt_template_num_args[i];
+ }
+
+ /* build strings with concatentaion of items from different templates
+ for each argument: these strings will be used when completing argument
+ if we can't find which template to use (for example for first argument)
+ */
+ hook_command->cplt_template_args_concat = malloc (hook_command->cplt_template_num_args_concat *
+ sizeof (*hook_command->cplt_template_args_concat));
+ list = weelist_new ();
+ for (i = 0; i < hook_command->cplt_template_num_args_concat; i++)
+ {
+ /* first compute length */
+ length = 1;
+ for (j = 0; j < hook_command->cplt_num_templates; j++)
+ {
+ if (i < hook_command->cplt_template_num_args[j])
+ length += strlen (hook_command->cplt_template_args[j][i]) + 1;
+ }
+ /* alloc memory */
+ hook_command->cplt_template_args_concat[i] = malloc (length);
+ if (hook_command->cplt_template_args_concat[i])
+ {
+ /* concatene items with "|" as separator */
+ weelist_remove_all (list);
+ hook_command->cplt_template_args_concat[i][0] = '\0';
+ for (j = 0; j < hook_command->cplt_num_templates; j++)
+ {
+ if (i < hook_command->cplt_template_num_args[j])
+ {
+ items = string_explode (hook_command->cplt_template_args[j][i],
+ "|", 0, 0, &num_items);
+ for (k = 0; k < num_items; k++)
+ {
+ if (!weelist_search (list, items[k]))
+ {
+ if (hook_command->cplt_template_args_concat[i][0])
+ strcat (hook_command->cplt_template_args_concat[i], "|");
+ strcat (hook_command->cplt_template_args_concat[i],
+ items[k]);
+ weelist_add (list, items[k], WEECHAT_LIST_POS_END,
+ NULL);
+ }
+ }
+ string_free_exploded (items);
+ }
+ }
+ }
+ }
+}
+
+/*
* hook_command: hook a command
*/
@@ -374,6 +534,16 @@ hook_command (struct t_weechat_plugin *plugin, const char *command,
new_hook_command->completion = (completion) ?
strdup (completion) : strdup ("");
+ /* build completion variables for command */
+ new_hook_command->cplt_num_templates = 0;
+ new_hook_command->cplt_templates = NULL;
+ new_hook_command->cplt_templates_static = NULL;
+ new_hook_command->cplt_template_num_args = NULL;
+ new_hook_command->cplt_template_args = NULL;
+ new_hook_command->cplt_template_num_args_concat = 0;
+ new_hook_command->cplt_template_args_concat = NULL;
+ hook_command_build_completion (new_hook_command);
+
hook_add_to_list (new_hook);
return new_hook;
@@ -1593,6 +1763,7 @@ hook_config_exec (const char *option, const char *value)
struct t_hook *
hook_completion (struct t_weechat_plugin *plugin, const char *completion_item,
+ const char *description,
t_hook_callback_completion *callback, void *callback_data)
{
struct t_hook *new_hook;
@@ -1617,6 +1788,8 @@ hook_completion (struct t_weechat_plugin *plugin, const char *completion_item,
new_hook->hook_data = new_hook_completion;
new_hook_completion->callback = callback;
new_hook_completion->completion_item = strdup (completion_item);
+ new_hook_completion->description =
+ (description) ? strdup (description) : strdup ("");
hook_add_to_list (new_hook);
@@ -1950,6 +2123,8 @@ hook_infolist_get (struct t_weechat_plugin *plugin, const char *infolist_name,
void
unhook (struct t_hook *hook)
{
+ int i;
+
/* invalid hook? */
if (!hook_valid (hook))
return;
@@ -1982,6 +2157,20 @@ unhook (struct t_hook *hook)
free (HOOK_COMMAND(hook, args_description));
if (HOOK_COMMAND(hook, completion))
free (HOOK_COMMAND(hook, completion));
+ if (HOOK_COMMAND(hook, cplt_templates))
+ {
+ for (i = 0; i < HOOK_COMMAND(hook, cplt_num_templates); i++)
+ {
+ if (HOOK_COMMAND(hook, cplt_templates)[i])
+ free (HOOK_COMMAND(hook, cplt_templates)[i]);
+ if (HOOK_COMMAND(hook, cplt_templates_static)[i])
+ free (HOOK_COMMAND(hook, cplt_templates_static)[i]);
+ string_free_exploded (HOOK_COMMAND(hook, cplt_template_args)[i]);
+ }
+ free (HOOK_COMMAND(hook, cplt_templates));
+ }
+ if (HOOK_COMMAND(hook, cplt_template_num_args))
+ free (HOOK_COMMAND(hook, cplt_template_num_args));
break;
case HOOK_TYPE_COMMAND_RUN:
if (HOOK_COMMAND_RUN(hook, command))
@@ -2048,6 +2237,8 @@ unhook (struct t_hook *hook)
case HOOK_TYPE_COMPLETION:
if (HOOK_COMPLETION(hook, completion_item))
free (HOOK_COMPLETION(hook, completion_item));
+ if (HOOK_COMPLETION(hook, description))
+ free (HOOK_COMPLETION(hook, description));
break;
case HOOK_TYPE_MODIFIER:
if (HOOK_MODIFIER(hook, modifier))
@@ -2343,6 +2534,13 @@ hook_add_to_infolist_type (struct t_infolist *infolist,
return 0;
if (!infolist_new_var_string (ptr_item, "completion_item", HOOK_COMPLETION(ptr_hook, completion_item)))
return 0;
+ if (!infolist_new_var_string (ptr_item, "description", HOOK_COMPLETION(ptr_hook, description)))
+ return 0;
+ if (!infolist_new_var_string (ptr_item, "description_nls",
+ (HOOK_COMPLETION(ptr_hook, description)
+ && HOOK_COMPLETION(ptr_hook, description)[0]) ?
+ _(HOOK_COMPLETION(ptr_hook, description)) : ""))
+ return 0;
}
break;
case HOOK_TYPE_MODIFIER:
@@ -2429,7 +2627,7 @@ hook_add_to_infolist (struct t_infolist *infolist,
void
hook_print_log ()
{
- int type;
+ int type, i, j;
struct t_hook *ptr_hook;
struct tm *local_time;
char text_time[1024];
@@ -2441,164 +2639,186 @@ hook_print_log ()
{
log_printf ("");
log_printf ("[hook (addr:0x%lx)]", ptr_hook);
- log_printf (" plugin . . . . . . . . : 0x%lx ('%s')",
+ log_printf (" plugin. . . . . . . . . : 0x%lx ('%s')",
ptr_hook->plugin, plugin_get_name (ptr_hook->plugin));
- log_printf (" deleted. . . . . . . . : %d", ptr_hook->deleted);
- log_printf (" running. . . . . . . . : %d", ptr_hook->running);
- log_printf (" type . . . . . . . . . : %d (%s)",
+ log_printf (" deleted . . . . . . . . : %d", ptr_hook->deleted);
+ log_printf (" running . . . . . . . . : %d", ptr_hook->running);
+ log_printf (" type. . . . . . . . . . : %d (%s)",
ptr_hook->type, hook_type_string[ptr_hook->type]);
- log_printf (" callback_data. . . . . : 0x%lx", ptr_hook->callback_data);
+ log_printf (" callback_data . . . . . : 0x%lx", ptr_hook->callback_data);
switch (ptr_hook->type)
{
case HOOK_TYPE_COMMAND:
if (!ptr_hook->deleted)
{
log_printf (" command data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_COMMAND(ptr_hook, callback));
- log_printf (" command. . . . . . . : '%s'", HOOK_COMMAND(ptr_hook, command));
- log_printf (" description. . . . . : '%s'", HOOK_COMMAND(ptr_hook, description));
- log_printf (" args . . . . . . . . : '%s'", HOOK_COMMAND(ptr_hook, args));
- log_printf (" args_description . . : '%s'", HOOK_COMMAND(ptr_hook, args_description));
- log_printf (" completion . . . . . : '%s'", HOOK_COMMAND(ptr_hook, completion));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_COMMAND(ptr_hook, callback));
+ log_printf (" command . . . . . . . : '%s'", HOOK_COMMAND(ptr_hook, command));
+ log_printf (" description . . . . . : '%s'", HOOK_COMMAND(ptr_hook, description));
+ log_printf (" args. . . . . . . . . : '%s'", HOOK_COMMAND(ptr_hook, args));
+ log_printf (" args_description. . . : '%s'", HOOK_COMMAND(ptr_hook, args_description));
+ log_printf (" completion. . . . . . : '%s'", HOOK_COMMAND(ptr_hook, completion));
+ log_printf (" cplt_num_templates. . : %d", HOOK_COMMAND(ptr_hook, cplt_num_templates));
+ for (i = 0; i < HOOK_COMMAND(ptr_hook, cplt_num_templates); i++)
+ {
+ log_printf (" cplt_templates[%04d] . . . : '%s'",
+ i, HOOK_COMMAND(ptr_hook, cplt_templates)[i]);
+ log_printf (" cplt_templates_static[%04d]: '%s'",
+ i, HOOK_COMMAND(ptr_hook, cplt_templates_static)[i]);
+ log_printf (" num_args. . . . . . : %d",
+ HOOK_COMMAND(ptr_hook, cplt_template_num_args)[i]);
+ for (j = 0; j < HOOK_COMMAND(ptr_hook, cplt_template_num_args)[i]; j++)
+ {
+ log_printf (" args[%04d]. . . . . : '%s'",
+ j, HOOK_COMMAND(ptr_hook, cplt_template_args)[i][j]);
+ }
+ }
+ log_printf (" num_args_concat . . . : %d", HOOK_COMMAND(ptr_hook, cplt_template_num_args_concat));
+ for (i = 0; i < HOOK_COMMAND(ptr_hook, cplt_template_num_args_concat); i++)
+ {
+ log_printf (" args_concat[%04d] . . : '%s'",
+ i, HOOK_COMMAND(ptr_hook, cplt_template_args_concat)[i]);
+ }
}
break;
case HOOK_TYPE_COMMAND_RUN:
if (!ptr_hook->deleted)
{
log_printf (" command_run data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_COMMAND_RUN(ptr_hook, callback));
- log_printf (" command. . . . . . . : '%s'", HOOK_COMMAND_RUN(ptr_hook, command));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_COMMAND_RUN(ptr_hook, callback));
+ log_printf (" command . . . . . . . : '%s'", HOOK_COMMAND_RUN(ptr_hook, command));
}
break;
case HOOK_TYPE_TIMER:
if (!ptr_hook->deleted)
{
log_printf (" timer data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_TIMER(ptr_hook, callback));
- log_printf (" interval . . . . . . : %ld", HOOK_TIMER(ptr_hook, interval));
- log_printf (" align_second . . . . : %d", HOOK_TIMER(ptr_hook, align_second));
- log_printf (" remaining_calls. . . : %d", HOOK_TIMER(ptr_hook, remaining_calls));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_TIMER(ptr_hook, callback));
+ log_printf (" interval. . . . . . . : %ld", HOOK_TIMER(ptr_hook, interval));
+ log_printf (" align_second. . . . . : %d", HOOK_TIMER(ptr_hook, align_second));
+ log_printf (" remaining_calls . . . : %d", HOOK_TIMER(ptr_hook, remaining_calls));
local_time = localtime (&HOOK_TIMER(ptr_hook, last_exec).tv_sec);
strftime (text_time, sizeof (text_time),
"%d/%m/%Y %H:%M:%S", local_time);
- log_printf (" last_exec.tv_sec . . : %ld (%s)",
+ log_printf (" last_exec.tv_sec. . . : %ld (%s)",
HOOK_TIMER(ptr_hook, last_exec.tv_sec),
text_time);
- log_printf (" last_exec.tv_usec. . : %ld", HOOK_TIMER(ptr_hook, last_exec.tv_usec));
+ log_printf (" last_exec.tv_usec . . : %ld", HOOK_TIMER(ptr_hook, last_exec.tv_usec));
local_time = localtime (&HOOK_TIMER(ptr_hook, next_exec).tv_sec);
strftime (text_time, sizeof (text_time),
"%d/%m/%Y %H:%M:%S", local_time);
- log_printf (" next_exec.tv_sec . . : %ld (%s)",
+ log_printf (" next_exec.tv_sec. . . : %ld (%s)",
HOOK_TIMER(ptr_hook, next_exec.tv_sec),
text_time);
- log_printf (" next_exec.tv_usec. . : %ld", HOOK_TIMER(ptr_hook, next_exec.tv_usec));
+ log_printf (" next_exec.tv_usec . . : %ld", HOOK_TIMER(ptr_hook, next_exec.tv_usec));
}
break;
case HOOK_TYPE_FD:
if (!ptr_hook->deleted)
{
log_printf (" fd data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_FD(ptr_hook, callback));
- log_printf (" fd . . . . . . . . . : %d", HOOK_FD(ptr_hook, fd));
- log_printf (" flags. . . . . . . . : %d", HOOK_FD(ptr_hook, flags));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_FD(ptr_hook, callback));
+ log_printf (" fd. . . . . . . . . . : %d", HOOK_FD(ptr_hook, fd));
+ log_printf (" flags . . . . . . . . : %d", HOOK_FD(ptr_hook, flags));
}
break;
case HOOK_TYPE_PROCESS:
if (!ptr_hook->deleted)
{
log_printf (" process data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_PROCESS(ptr_hook, callback));
- log_printf (" command. . . . . . . : '%s'", HOOK_PROCESS(ptr_hook, command));
- log_printf (" timeout. . . . . . . : %d", HOOK_PROCESS(ptr_hook, timeout));
- log_printf (" child_stdout_read. . : %d", HOOK_PROCESS(ptr_hook, child_stdout_read));
- log_printf (" child_stdout_write . : %d", HOOK_PROCESS(ptr_hook, child_stdout_write));
- log_printf (" child_stderr_read. . : %d", HOOK_PROCESS(ptr_hook, child_stderr_read));
- log_printf (" child_stderr_write . : %d", HOOK_PROCESS(ptr_hook, child_stderr_write));
- log_printf (" child_pid. . . . . . : %d", HOOK_PROCESS(ptr_hook, child_pid));
- log_printf (" hook_fd_stdout . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_fd_stdout));
- log_printf (" hook_fd_stderr . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_fd_stderr));
- log_printf (" hook_timer . . . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_timer));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_PROCESS(ptr_hook, callback));
+ log_printf (" command . . . . . . . : '%s'", HOOK_PROCESS(ptr_hook, command));
+ log_printf (" timeout . . . . . . . : %d", HOOK_PROCESS(ptr_hook, timeout));
+ log_printf (" child_stdout_read . . : %d", HOOK_PROCESS(ptr_hook, child_stdout_read));
+ log_printf (" child_stdout_write. . : %d", HOOK_PROCESS(ptr_hook, child_stdout_write));
+ log_printf (" child_stderr_read . . : %d", HOOK_PROCESS(ptr_hook, child_stderr_read));
+ log_printf (" child_stderr_write. . : %d", HOOK_PROCESS(ptr_hook, child_stderr_write));
+ log_printf (" child_pid . . . . . . : %d", HOOK_PROCESS(ptr_hook, child_pid));
+ log_printf (" hook_fd_stdout. . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_fd_stdout));
+ log_printf (" hook_fd_stderr. . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_fd_stderr));
+ log_printf (" hook_timer. . . . . . : 0x%lx", HOOK_PROCESS(ptr_hook, hook_timer));
}
break;
case HOOK_TYPE_CONNECT:
if (!ptr_hook->deleted)
{
log_printf (" connect data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, callback));
- log_printf (" address. . . . . . . : '%s'", HOOK_CONNECT(ptr_hook, address));
- log_printf (" port . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, port));
- log_printf (" sock . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, sock));
- log_printf (" ipv6 . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, ipv6));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, callback));
+ log_printf (" address . . . . . . . : '%s'", HOOK_CONNECT(ptr_hook, address));
+ log_printf (" port. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, port));
+ log_printf (" sock. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, sock));
+ log_printf (" ipv6. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, ipv6));
#ifdef HAVE_GNUTLS
- log_printf (" gnutls_sess. . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, gnutls_sess));
+ log_printf (" gnutls_sess . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, gnutls_sess));
#endif
- log_printf (" local_hostname . . . : '%s'", HOOK_CONNECT(ptr_hook, local_hostname));
- log_printf (" child_read . . . . . : %d", HOOK_CONNECT(ptr_hook, child_read));
- log_printf (" child_write. . . . . : %d", HOOK_CONNECT(ptr_hook, child_write));
- log_printf (" child_pid. . . . . . : %d", HOOK_CONNECT(ptr_hook, child_pid));
- log_printf (" hook_fd. . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, hook_fd));
+ log_printf (" local_hostname. . . . : '%s'", HOOK_CONNECT(ptr_hook, local_hostname));
+ log_printf (" child_read. . . . . . : %d", HOOK_CONNECT(ptr_hook, child_read));
+ log_printf (" child_write . . . . . : %d", HOOK_CONNECT(ptr_hook, child_write));
+ log_printf (" child_pid . . . . . . : %d", HOOK_CONNECT(ptr_hook, child_pid));
+ log_printf (" hook_fd . . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, hook_fd));
}
break;
case HOOK_TYPE_PRINT:
if (!ptr_hook->deleted)
{
log_printf (" print data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, callback));
- log_printf (" buffer . . . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, buffer));
- log_printf (" tags_count . . . . . : %d", HOOK_PRINT(ptr_hook, tags_count));
- log_printf (" tags_array . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, tags_array));
- log_printf (" message. . . . . . . : '%s'", HOOK_PRINT(ptr_hook, message));
- log_printf (" strip_colors . . . . : %d", HOOK_PRINT(ptr_hook, strip_colors));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, callback));
+ log_printf (" buffer. . . . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, buffer));
+ log_printf (" tags_count. . . . . . : %d", HOOK_PRINT(ptr_hook, tags_count));
+ log_printf (" tags_array. . . . . . : 0x%lx", HOOK_PRINT(ptr_hook, tags_array));
+ log_printf (" message . . . . . . . : '%s'", HOOK_PRINT(ptr_hook, message));
+ log_printf (" strip_colors. . . . . : %d", HOOK_PRINT(ptr_hook, strip_colors));
}
break;
case HOOK_TYPE_SIGNAL:
if (!ptr_hook->deleted)
{
log_printf (" signal data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_SIGNAL(ptr_hook, callback));
- log_printf (" signal . . . . . . . : '%s'", HOOK_SIGNAL(ptr_hook, signal));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_SIGNAL(ptr_hook, callback));
+ log_printf (" signal. . . . . . . . : '%s'", HOOK_SIGNAL(ptr_hook, signal));
}
break;
case HOOK_TYPE_CONFIG:
if (!ptr_hook->deleted)
{
log_printf (" config data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_CONFIG(ptr_hook, callback));
- log_printf (" option . . . . . . . : '%s'", HOOK_CONFIG(ptr_hook, option));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_CONFIG(ptr_hook, callback));
+ log_printf (" option. . . . . . . . : '%s'", HOOK_CONFIG(ptr_hook, option));
}
break;
case HOOK_TYPE_COMPLETION:
if (!ptr_hook->deleted)
{
log_printf (" completion data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_COMPLETION(ptr_hook, callback));
- log_printf (" completion_item. . . : '%s'", HOOK_COMPLETION(ptr_hook, completion_item));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_COMPLETION(ptr_hook, callback));
+ log_printf (" completion_item . . . : '%s'", HOOK_COMPLETION(ptr_hook, completion_item));
+ log_printf (" description . . . . . : '%s'", HOOK_COMPLETION(ptr_hook, description));
}
break;
case HOOK_TYPE_MODIFIER:
if (!ptr_hook->deleted)
{
log_printf (" modifier data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_MODIFIER(ptr_hook, callback));
- log_printf (" modifier . . . . . . : '%s'", HOOK_MODIFIER(ptr_hook, modifier));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_MODIFIER(ptr_hook, callback));
+ log_printf (" modifier. . . . . . . : '%s'", HOOK_MODIFIER(ptr_hook, modifier));
}
break;
case HOOK_TYPE_INFO:
if (!ptr_hook->deleted)
{
log_printf (" info data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_INFO(ptr_hook, callback));
- log_printf (" info_name. . . . . . : '%s'", HOOK_INFO(ptr_hook, info_name));
- log_printf (" description. . . . . : '%s'", HOOK_INFO(ptr_hook, description));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_INFO(ptr_hook, callback));
+ log_printf (" info_name . . . . . . : '%s'", HOOK_INFO(ptr_hook, info_name));
+ log_printf (" description . . . . . : '%s'", HOOK_INFO(ptr_hook, description));
}
break;
case HOOK_TYPE_INFOLIST:
if (!ptr_hook->deleted)
{
log_printf (" infolist data:");
- log_printf (" callback . . . . . . : 0x%lx", HOOK_INFOLIST(ptr_hook, callback));
- log_printf (" infolist_name. . . . : '%s'", HOOK_INFOLIST(ptr_hook, infolist_name));
- log_printf (" description. . . . . : '%s'", HOOK_INFOLIST(ptr_hook, description));
+ log_printf (" callback. . . . . . . : 0x%lx", HOOK_INFOLIST(ptr_hook, callback));
+ log_printf (" infolist_name . . . . : '%s'", HOOK_INFOLIST(ptr_hook, infolist_name));
+ log_printf (" description . . . . . : '%s'", HOOK_INFOLIST(ptr_hook, description));
}
break;
case HOOK_NUM_TYPES:
@@ -2606,8 +2826,8 @@ hook_print_log ()
it is never used as type */
break;
}
- log_printf (" prev_hook. . . . . . . : 0x%lx", ptr_hook->prev_hook);
- log_printf (" next_hook. . . . . . . : 0x%lx", ptr_hook->next_hook);
+ log_printf (" prev_hook . . . . . . . : 0x%lx", ptr_hook->prev_hook);
+ log_printf (" next_hook . . . . . . . : 0x%lx", ptr_hook->next_hook);
}
}
}
diff --git a/src/core/wee-hook.h b/src/core/wee-hook.h
index fb6aa0010..2827d3c31 100644
--- a/src/core/wee-hook.h
+++ b/src/core/wee-hook.h
@@ -97,12 +97,26 @@ typedef int (t_hook_callback_command)(void *data, struct t_gui_buffer *buffer,
struct t_hook_command
{
- t_hook_callback_command *callback; /* command callback */
- char *command; /* name of command (without '/') */
- char *description; /* (for /help) short cmd description */
- char *args; /* (for /help) command arguments */
- char *args_description; /* (for /help) args long description */
- char *completion; /* template for completion */
+ t_hook_callback_command *callback; /* command callback */
+ char *command; /* name of command (without '/') */
+ char *description; /* (for /help) short cmd description*/
+ char *args; /* (for /help) command arguments */
+ char *args_description; /* (for /help) args long description*/
+ char *completion; /* template for completion */
+
+ /* templates */
+ int cplt_num_templates; /* number of templates for compl. */
+ char **cplt_templates; /* completion templates */
+ char **cplt_templates_static; /* static part of template (at */
+ /* beginning */
+
+ /* arguments for each template */
+ int *cplt_template_num_args; /* number of arguments for template */
+ char ***cplt_template_args; /* arguments for each template */
+
+ /* concatenation of arg N for each template */
+ int cplt_template_num_args_concat; /* number of concatened arguments */
+ char **cplt_template_args_concat; /* concatened arguments */
};
/* hook command run */
@@ -241,6 +255,7 @@ struct t_hook_completion
{
t_hook_callback_completion *callback; /* completion callback */
char *completion_item; /* name of completion */
+ char *description; /* description */
};
/* hook modifier */
@@ -355,6 +370,7 @@ extern struct t_hook *hook_config (struct t_weechat_plugin *plugin,
extern void hook_config_exec (const char *option, const char *value);
extern struct t_hook *hook_completion (struct t_weechat_plugin *plugin,
const char *completion_item,
+ const char *description,
t_hook_callback_completion *callback,
void *callback_data);
extern void hook_completion_list_add (struct t_gui_completion *completion,
diff --git a/src/core/wee-proxy.h b/src/core/wee-proxy.h
index b4fde0b44..b7b521f73 100644
--- a/src/core/wee-proxy.h
+++ b/src/core/wee-proxy.h
@@ -52,6 +52,7 @@ struct t_proxy
/* variables */
+extern char *proxy_option_string[];
extern char *proxy_type_string[];
extern struct t_proxy *weechat_proxies;
extern struct t_proxy *last_weechat_proxy;
diff --git a/src/core/weechat.c b/src/core/weechat.c
index 236f5c3db..d32e0c53e 100644
--- a/src/core/weechat.c
+++ b/src/core/weechat.c
@@ -64,6 +64,7 @@
#include "wee-util.h"
#include "../gui/gui-chat.h"
#include "../gui/gui-color.h"
+#include "../gui/gui-completion.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-main.h"
#include "../gui/gui-keyboard.h"
@@ -388,6 +389,7 @@ main (int argc, char *argv[])
gui_main_pre_init (&argc, &argv); /* pre-initiliaze interface */
weechat_init_vars (); /* initialize some variables */
command_init (); /* initialize WeeChat commands */
+ gui_completion_init (); /* add core completion hooks */
gui_keyboard_init (); /* init keyboard */
if (!config_weechat_init ()) /* init options with default values */
exit (EXIT_FAILURE);