diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2009-04-11 14:49:34 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2009-04-11 14:49:34 +0200 |
commit | acb57723343d61cc287a260333c28d802d6ea70f (patch) | |
tree | 6d154d5b7b2e1fcdc3b0702e9a5693d342e710a6 /src/core | |
parent | 8ac00cdac6ba3a2caf9a7b282701e3bb22c988de (diff) | |
download | weechat-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.c | 187 | ||||
-rw-r--r-- | src/core/wee-config.c | 2 | ||||
-rw-r--r-- | src/core/wee-hook.c | 358 | ||||
-rw-r--r-- | src/core/wee-hook.h | 28 | ||||
-rw-r--r-- | src/core/wee-proxy.h | 1 | ||||
-rw-r--r-- | src/core/weechat.c | 2 |
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); |