diff options
Diffstat (limited to 'src/plugins/alias')
-rw-r--r-- | src/plugins/alias/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/alias/Makefile.am | 2 | ||||
-rw-r--r-- | src/plugins/alias/alias-config.c | 368 | ||||
-rw-r--r-- | src/plugins/alias/alias-config.h | 35 | ||||
-rw-r--r-- | src/plugins/alias/alias.c | 385 | ||||
-rw-r--r-- | src/plugins/alias/alias.h | 9 |
6 files changed, 552 insertions, 248 deletions
diff --git a/src/plugins/alias/CMakeLists.txt b/src/plugins/alias/CMakeLists.txt index 04c4ef945..b9b0c0b05 100644 --- a/src/plugins/alias/CMakeLists.txt +++ b/src/plugins/alias/CMakeLists.txt @@ -16,6 +16,7 @@ ADD_LIBRARY(alias MODULE alias.c alias.h +alias-config.c alias-config.h alias-info.c alias-info.h) SET_TARGET_PROPERTIES(alias PROPERTIES PREFIX "") diff --git a/src/plugins/alias/Makefile.am b/src/plugins/alias/Makefile.am index 785fa237c..511109f3d 100644 --- a/src/plugins/alias/Makefile.am +++ b/src/plugins/alias/Makefile.am @@ -22,6 +22,8 @@ lib_LTLIBRARIES = alias.la alias_la_SOURCES = alias.c \ alias.h \ + alias-config.c \ + alias-config.h \ alias-info.c \ alias-info.h alias_la_LDFLAGS = -module diff --git a/src/plugins/alias/alias-config.c b/src/plugins/alias/alias-config.c new file mode 100644 index 000000000..4657a7d1c --- /dev/null +++ b/src/plugins/alias/alias-config.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2003-2010 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* alias-config.c: alias configuration options */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "../weechat-plugin.h" +#include "alias.h" + + +struct t_config_file *alias_config_file = NULL; +struct t_config_section *alias_config_section_cmd = NULL; +struct t_config_section *alias_config_section_completion = NULL; + + +/* + * alias_config_cmd_change_cb: callback called when alias option is modified + * in section "cmd" (command) + */ + +void +alias_config_cmd_change_cb (void *data, struct t_config_option *option) +{ + struct t_config_option *ptr_option_completion; + + /* make C compiler happy */ + (void) data; + + ptr_option_completion = weechat_config_search_option (alias_config_file, + alias_config_section_completion, + weechat_config_option_get_pointer (option, "name")); + + alias_new (weechat_config_option_get_pointer (option, "name"), + weechat_config_option_get_pointer (option, "value"), + (ptr_option_completion) ? + weechat_config_option_get_pointer (ptr_option_completion, "value") : NULL); +} + +/* + * alias_config_cmd_delete_cb: callback called when alias option is deleted + * in section "cmd" (command) + */ + +void +alias_config_cmd_delete_cb (void *data, struct t_config_option *option) +{ + struct t_config_option *ptr_option_completion; + struct t_alias *ptr_alias; + + /* make C compiler happy */ + (void) data; + + ptr_option_completion = weechat_config_search_option (alias_config_file, + alias_config_section_completion, + weechat_config_option_get_pointer (option, "name")); + + ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name")); + if (ptr_alias) + alias_free (ptr_alias); + + if (ptr_option_completion) + weechat_config_option_free (ptr_option_completion); +} + +/* + * alias_config_completion_change_cb: callback called when alias completion is + * modified in section "completion" + */ + +void +alias_config_completion_change_cb (void *data, struct t_config_option *option) +{ + struct t_alias *ptr_alias; + + /* make C compiler happy */ + (void) data; + + ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name")); + if (ptr_alias && ptr_alias->hook) + { + alias_update_completion (ptr_alias, + weechat_config_option_get_pointer (option, "value")); + } +} + +/* + * alias_config_completion_delete_cb: callback called when alias completion is + * deleted in section "completion" + */ + +void +alias_config_completion_delete_cb (void *data, struct t_config_option *option) +{ + struct t_alias *ptr_alias; + + /* make C compiler happy */ + (void) data; + + ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name")); + if (ptr_alias && ptr_alias->hook && ptr_alias->completion) + { + alias_update_completion (ptr_alias, NULL); + } +} + +/* + * alias_config_reload: reload alias configuration file + */ + +int +alias_config_reload (void *data, struct t_config_file *config_file) +{ + /* make C compiler happy */ + (void) data; + + weechat_config_section_free_options (alias_config_section_cmd); + weechat_config_section_free_options (alias_config_section_completion); + alias_free_all (); + + return weechat_config_reload (config_file); +} + +/* + * alias_config_cmd_write_default_cb: write default aliases in configuration + * file in section "cmd" (command) + */ + +void +alias_config_cmd_write_default_cb (void *data, + struct t_config_file *config_file, + const char *section_name) +{ + /* make C compiler happy */ + (void) data; + + weechat_config_write_line (config_file, section_name, NULL); + + weechat_config_write_line (config_file, "AAWAY", "%s", "\"allserv /away\""); + weechat_config_write_line (config_file, "AME", "%s", "\"allchan /me\""); + weechat_config_write_line (config_file, "AMSG", "%s", "\"allchan /msg *\""); + weechat_config_write_line (config_file, "ANICK", "%s", "\"allserv /nick\""); + weechat_config_write_line (config_file, "BYE", "%s", "\"quit\""); + weechat_config_write_line (config_file, "C", "%s", "\"buffer clear\""); + weechat_config_write_line (config_file, "CL", "%s", "\"buffer clear\""); + weechat_config_write_line (config_file, "CLOSE", "%s", "\"buffer close\""); + weechat_config_write_line (config_file, "CHAT", "%s", "\"dcc chat\""); + weechat_config_write_line (config_file, "EXIT", "%s", "\"quit\""); + weechat_config_write_line (config_file, "IG", "%s", "\"ignore\""); + weechat_config_write_line (config_file, "J", "%s", "\"join\""); + weechat_config_write_line (config_file, "K", "%s", "\"kick\""); + weechat_config_write_line (config_file, "KB", "%s", "\"kickban\""); + weechat_config_write_line (config_file, "LEAVE", "%s", "\"part\""); + weechat_config_write_line (config_file, "M", "%s", "\"msg\""); + weechat_config_write_line (config_file, "MUB", "%s", "\"unban *\""); + weechat_config_write_line (config_file, "N", "%s", "\"names\""); + weechat_config_write_line (config_file, "Q", "%s", "\"query\""); + weechat_config_write_line (config_file, "REDRAW", "%s", "\"window refresh\""); + weechat_config_write_line (config_file, "SAY", "%s", "\"msg *\""); + weechat_config_write_line (config_file, "SIGNOFF", "%s", "\"quit\""); + weechat_config_write_line (config_file, "T", "%s", "\"topic\""); + weechat_config_write_line (config_file, "UB", "%s", "\"unban\""); + weechat_config_write_line (config_file, "V", "%s", "\"command core version\""); + weechat_config_write_line (config_file, "W", "%s", "\"who\""); + weechat_config_write_line (config_file, "WC", "%s", "\"window merge\""); + weechat_config_write_line (config_file, "WI", "%s", "\"whois\""); + weechat_config_write_line (config_file, "WII", "%s", "\"whois $1 $1\""); + weechat_config_write_line (config_file, "WW", "%s", "\"whowas\""); +} + +/* + * alias_config_cmd_new_option: create new option in section "cmd" (command) + */ + +void +alias_config_cmd_new_option (const char *name, const char *command) +{ + weechat_config_new_option (alias_config_file, alias_config_section_cmd, + name, "string", NULL, + NULL, 0, 0, "", command, 0, + NULL, NULL, + &alias_config_cmd_change_cb, NULL, + &alias_config_cmd_delete_cb, NULL); +} + +/* + * alias_config_cmd_create_option_cb: create an alias in section "cmd" + * (command) + */ + +int +alias_config_cmd_create_option_cb (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, const char *value) +{ + struct t_alias *ptr_alias; + int rc; + + /* make C compiler happy */ + (void) data; + (void) config_file; + (void) section; + + rc = WEECHAT_CONFIG_OPTION_SET_ERROR; + + /* create config option */ + alias_config_cmd_new_option (option_name, value); + + /* create alias */ + ptr_alias = alias_search (option_name); + if (ptr_alias) + alias_free (ptr_alias); + if (value && value[0]) + rc = (alias_new (option_name, value, NULL)) ? + WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE : WEECHAT_CONFIG_OPTION_SET_ERROR; + else + rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; + + if (rc == WEECHAT_CONFIG_OPTION_SET_ERROR) + { + weechat_printf (NULL, + _("%s%s: error creating alias \"%s\" => \"%s\""), + weechat_prefix ("error"), ALIAS_PLUGIN_NAME, + option_name, value); + } + + return rc; +} + +/* + * alias_config_completion_new_option: create new option in section "completion" + */ + +void +alias_config_completion_new_option (const char *name, const char *completion) +{ + weechat_config_new_option (alias_config_file, + alias_config_section_completion, + name, "string", NULL, + NULL, 0, 0, "", completion, 0, + NULL, NULL, + &alias_config_completion_change_cb, NULL, + &alias_config_completion_delete_cb, NULL); +} + +/* + * alias_config_completion_create_option_cb: create a completion for an alias + * in section "completion" + */ + +int +alias_config_completion_create_option_cb (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, + const char *value) +{ + struct t_alias *ptr_alias; + + /* make C compiler happy */ + (void) data; + (void) config_file; + (void) section; + + ptr_alias = alias_search (option_name); + if (!ptr_alias) + { + weechat_printf (NULL, + _("%s%s: error creating completion for alias \"%s\": " + "alias not found"), + weechat_prefix ("error"), ALIAS_PLUGIN_NAME, + option_name); + return WEECHAT_CONFIG_OPTION_SET_ERROR; + } + + /* create config option */ + alias_config_completion_new_option (option_name, value); + + /* create/update completion in alias */ + alias_update_completion (ptr_alias, value); + + return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; +} + +/* + * alias_config_init: init alias configuration file + * return: 1 if ok, 0 if error + */ + +int +alias_config_init () +{ + struct t_config_section *ptr_section; + + alias_config_file = weechat_config_new (ALIAS_CONFIG_NAME, + &alias_config_reload, NULL); + if (!alias_config_file) + return 0; + + ptr_section = weechat_config_new_section (alias_config_file, "cmd", + 1, 1, + NULL, NULL, + NULL, NULL, + &alias_config_cmd_write_default_cb, NULL, + &alias_config_cmd_create_option_cb, NULL, + NULL, NULL); + if (!ptr_section) + { + weechat_config_free (alias_config_file); + return 0; + } + alias_config_section_cmd = ptr_section; + + ptr_section = weechat_config_new_section (alias_config_file, "completion", + 1, 1, + NULL, NULL, + NULL, NULL, + NULL, NULL, + &alias_config_completion_create_option_cb, NULL, + NULL, NULL); + if (!ptr_section) + { + weechat_config_free (alias_config_file); + return 0; + } + alias_config_section_completion = ptr_section; + + return 1; +} + +/* + * alias_config_read: read alias configuration file + */ + +int +alias_config_read () +{ + return weechat_config_read (alias_config_file); +} + +/* + * alias_config_write: write alias configuration file + */ + +int +alias_config_write () +{ + return weechat_config_write (alias_config_file); +} diff --git a/src/plugins/alias/alias-config.h b/src/plugins/alias/alias-config.h new file mode 100644 index 000000000..b24427016 --- /dev/null +++ b/src/plugins/alias/alias-config.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003-2010 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef __WEECHAT_ALIAS_CONFIG_H +#define __WEECHAT_ALIAS_CONFIG_H 1 + +extern struct t_config_file *alias_config_file; +extern struct t_config_section *alias_config_section_cmd; +extern struct t_config_section *alias_config_section_completion; + +extern void alias_config_cmd_new_option (const char *name, + const char *command); +extern void alias_config_completion_new_option (const char *name, + const char *completion); +extern int alias_config_init (); +extern int alias_config_read (); +extern int alias_config_write (); + +#endif /* alias-config.h */ diff --git a/src/plugins/alias/alias.c b/src/plugins/alias/alias.c index b59af9f83..9b9492d7e 100644 --- a/src/plugins/alias/alias.c +++ b/src/plugins/alias/alias.c @@ -25,6 +25,7 @@ #include "../weechat-plugin.h" #include "alias.h" +#include "alias-config.h" #include "alias-info.h" @@ -38,9 +39,6 @@ WEECHAT_PLUGIN_LICENSE("GPL3"); struct t_weechat_plugin *weechat_alias_plugin = NULL; -struct t_config_file *alias_config_file = NULL; -struct t_config_section *alias_config_section_cmd = NULL; - struct t_alias *alias_list = NULL; struct t_alias *last_alias = NULL; @@ -331,7 +329,6 @@ alias_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, int some_args_replaced, length1, length2; /* make C compiler happy */ - (void) argc; (void) argv; ptr_alias = (struct t_alias *)data; @@ -450,6 +447,8 @@ alias_free (struct t_alias *alias) free (alias->name); if (alias->command) free (alias->command); + if (alias->completion) + free (alias->completion); free (alias); alias_list = new_alias_list; @@ -488,16 +487,70 @@ alias_find_pos (const char *name) } /* + * alias_hook_command: call weehat_hook_command() for an alias and store result + * in variable "hook" of alias + */ + +void +alias_hook_command (struct t_alias *alias) +{ + char *str_completion; + int length; + + str_completion = NULL; + + if (!alias->completion) + { + /* + * if alias has no custom completion, then default is to complete with + * completion template of target command, for example if alias is + * "/alias test /buffer", then str_completion will be "%%buffer" + */ + length = 2 + strlen (alias->command) + 1; + str_completion = malloc (length); + if (str_completion) + { + snprintf (str_completion, length, "%%%%%s", + (weechat_string_is_command_char (alias->command)) ? + weechat_utf8_next_char (alias->command) : alias->command); + } + } + + alias->hook = weechat_hook_command (alias->name, alias->command, + NULL, NULL, + (str_completion) ? str_completion : alias->completion, + &alias_cb, alias); + + if (str_completion) + free (str_completion); +} + +/* + * alias_update_completion: update completion for an alias + */ + +void +alias_update_completion (struct t_alias *alias, const char *completion) +{ + /* update completion in alias */ + if (alias->completion) + free (alias->completion); + alias->completion = (completion) ? strdup (completion) : NULL; + + /* unhook and hook again command, with new completion */ + weechat_unhook (alias->hook); + alias->hook = NULL; + alias_hook_command (alias); +} + +/* * alias_new: create new alias and add it to alias list */ struct t_alias * -alias_new (const char *name, const char *command) +alias_new (const char *name, const char *command, const char *completion) { struct t_alias *new_alias, *ptr_alias, *pos_alias; - struct t_hook *new_hook; - char *str_completion; - int length; if (!name || !name[0] || !command || !command[0]) return NULL; @@ -514,30 +567,14 @@ alias_new (const char *name, const char *command) new_alias = malloc (sizeof (*new_alias)); if (new_alias) { - length = 2 + strlen (command) + 1; - str_completion = malloc (length); - if (str_completion) - { - snprintf (str_completion, length, "%%%%%s", - (weechat_string_is_command_char (command)) ? - weechat_utf8_next_char (command) : command); - } - new_hook = weechat_hook_command (name, command, NULL, NULL, - (str_completion) ? str_completion : NULL, - alias_cb, new_alias); - if (str_completion) - free (str_completion); - if (!new_hook) - { - free (new_alias); - return NULL; - } - - new_alias->hook = new_hook; + new_alias->hook = NULL; new_alias->name = strdup (name); new_alias->command = strdup (command); + new_alias->completion = (completion) ? strdup (completion) : NULL; new_alias->running = 0; - + + alias_hook_command (new_alias); + if (alias_list) { pos_alias = alias_find_pos (name); @@ -607,199 +644,6 @@ alias_get_final_command (struct t_alias *alias) } /* - * alias_config_change_cb: callback called when alias option is modified - */ - -void -alias_config_change_cb (void *data, struct t_config_option *option) -{ - /* make C compiler happy */ - (void) data; - - alias_new (weechat_config_option_get_pointer (option, "name"), - weechat_config_option_get_pointer (option, "value")); -} - -/* - * alias_config_delete_cb: callback called when alias option is deleted - */ - -void -alias_config_delete_cb (void *data, struct t_config_option *option) -{ - struct t_alias *ptr_alias; - - /* make C compiler happy */ - (void) data; - - ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name")); - if (ptr_alias) - alias_free (ptr_alias); -} - -/* - * alias_config_reload: reload alias configuration file - */ - -int -alias_config_reload (void *data, struct t_config_file *config_file) -{ - /* make C compiler happy */ - (void) data; - - weechat_config_section_free_options (alias_config_section_cmd); - alias_free_all (); - - return weechat_config_reload (config_file); -} - -/* - * alias_config_write_default: write default aliases in configuration file - */ - -void -alias_config_write_default (void *data, - struct t_config_file *config_file, - const char *section_name) -{ - /* make C compiler happy */ - (void) data; - - weechat_config_write_line (config_file, section_name, NULL); - - weechat_config_write_line (config_file, "AAWAY", "%s", "\"allserv /away\""); - weechat_config_write_line (config_file, "AME", "%s", "\"allchan /me\""); - weechat_config_write_line (config_file, "AMSG", "%s", "\"allchan /msg *\""); - weechat_config_write_line (config_file, "ANICK", "%s", "\"allserv /nick\""); - weechat_config_write_line (config_file, "BYE", "%s", "\"quit\""); - weechat_config_write_line (config_file, "C", "%s", "\"buffer clear\""); - weechat_config_write_line (config_file, "CL", "%s", "\"buffer clear\""); - weechat_config_write_line (config_file, "CLOSE", "%s", "\"buffer close\""); - weechat_config_write_line (config_file, "CHAT", "%s", "\"dcc chat\""); - weechat_config_write_line (config_file, "EXIT", "%s", "\"quit\""); - weechat_config_write_line (config_file, "IG", "%s", "\"ignore\""); - weechat_config_write_line (config_file, "J", "%s", "\"join\""); - weechat_config_write_line (config_file, "K", "%s", "\"kick\""); - weechat_config_write_line (config_file, "KB", "%s", "\"kickban\""); - weechat_config_write_line (config_file, "LEAVE", "%s", "\"part\""); - weechat_config_write_line (config_file, "M", "%s", "\"msg\""); - weechat_config_write_line (config_file, "MUB", "%s", "\"unban *\""); - weechat_config_write_line (config_file, "N", "%s", "\"names\""); - weechat_config_write_line (config_file, "Q", "%s", "\"query\""); - weechat_config_write_line (config_file, "REDRAW", "%s", "\"window refresh\""); - weechat_config_write_line (config_file, "SAY", "%s", "\"msg *\""); - weechat_config_write_line (config_file, "SIGNOFF", "%s", "\"quit\""); - weechat_config_write_line (config_file, "T", "%s", "\"topic\""); - weechat_config_write_line (config_file, "UB", "%s", "\"unban\""); - weechat_config_write_line (config_file, "V", "%s", "\"command core version\""); - weechat_config_write_line (config_file, "W", "%s", "\"who\""); - weechat_config_write_line (config_file, "WC", "%s", "\"window merge\""); - weechat_config_write_line (config_file, "WI", "%s", "\"whois\""); - weechat_config_write_line (config_file, "WII", "%s", "\"whois $1 $1\""); - weechat_config_write_line (config_file, "WW", "%s", "\"whowas\""); -} - -/* - * alias_config_create_option: create an alias - */ - -int -alias_config_create_option (void *data, struct t_config_file *config_file, - struct t_config_section *section, - const char *option_name, const char *value) -{ - struct t_alias *ptr_alias; - int rc; - - /* make C compiler happy */ - (void) data; - - rc = WEECHAT_CONFIG_OPTION_SET_ERROR; - - /* create config option */ - weechat_config_new_option ( - config_file, section, - option_name, "string", NULL, - NULL, 0, 0, "", value, 0, - NULL, NULL, - &alias_config_change_cb, NULL, - &alias_config_delete_cb, NULL); - - /* create alias */ - ptr_alias = alias_search (option_name); - if (ptr_alias) - alias_free (ptr_alias); - if (value && value[0]) - rc = (alias_new (option_name, value)) ? - WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE : WEECHAT_CONFIG_OPTION_SET_ERROR; - else - rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; - - if (rc == WEECHAT_CONFIG_OPTION_SET_ERROR) - { - weechat_printf (NULL, - "%s%s: error creating alias \"%s\" => \"%s\"", - weechat_prefix ("error"), ALIAS_PLUGIN_NAME, - option_name, value); - } - - return rc; -} - -/* - * alias_config_init: init alias configuration file - * return: 1 if ok, 0 if error - */ - -int -alias_config_init () -{ - struct t_config_section *ptr_section; - - alias_config_file = weechat_config_new (ALIAS_CONFIG_NAME, - &alias_config_reload, NULL); - if (!alias_config_file) - return 0; - - ptr_section = weechat_config_new_section (alias_config_file, "cmd", - 1, 1, - NULL, NULL, - NULL, NULL, - &alias_config_write_default, NULL, - &alias_config_create_option, NULL, - NULL, NULL); - if (!ptr_section) - { - weechat_config_free (alias_config_file); - return 0; - } - - alias_config_section_cmd = ptr_section; - - return 1; -} - -/* - * alias_config_read: read alias configuration file - */ - -int -alias_config_read () -{ - return weechat_config_read (alias_config_file); -} - -/* - * alias_config_write: write alias configuration file - */ - -int -alias_config_write () -{ - return weechat_config_write (alias_config_file); -} - -/* * alias_command_cb: display or create alias */ @@ -807,7 +651,7 @@ int alias_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { - char *alias_name; + char *ptr_completion, *ptr_alias_name, *ptr_command; struct t_alias *ptr_alias; struct t_config_option *ptr_option; int alias_found; @@ -818,47 +662,71 @@ alias_command_cb (void *data, struct t_gui_buffer *buffer, int argc, if (argc > 1) { - alias_name = (weechat_string_is_command_char (argv[1])) ? - weechat_utf8_next_char (argv[1]) : argv[1]; if (argc > 2) { - /* Define new alias */ - if (!alias_new (alias_name, argv_eol[2])) + /* get pointers to completion, alias name and command (+ args) */ + ptr_completion = NULL; + ptr_alias_name = NULL; + ptr_command = NULL; + if ((argc > 4) && (weechat_strcasecmp (argv[1], "-completion") == 0)) + { + ptr_completion = argv[2]; + ptr_alias_name = (weechat_string_is_command_char (argv[3])) ? + weechat_utf8_next_char (argv[3]) : argv[3]; + ptr_command = argv_eol[4]; + } + else + { + ptr_alias_name = (weechat_string_is_command_char (argv[1])) ? + weechat_utf8_next_char (argv[1]) : argv[1]; + ptr_command = argv_eol[2]; + } + + /* define new alias */ + if (!alias_new (ptr_alias_name, ptr_command, ptr_completion)) { weechat_printf (NULL, _("%s%s: error creating alias \"%s\" " "=> \"%s\""), weechat_prefix ("error"), ALIAS_PLUGIN_NAME, - alias_name, argv_eol[2]); + ptr_alias_name, ptr_command); return WEECHAT_RC_ERROR; } - /* create config option */ + /* create config option for command */ ptr_option = weechat_config_search_option (alias_config_file, alias_config_section_cmd, - alias_name); + ptr_alias_name); + if (ptr_option) + weechat_config_option_free (ptr_option); + alias_config_cmd_new_option (ptr_alias_name, ptr_command); + + /* create config option for completion */ + ptr_option = weechat_config_search_option (alias_config_file, + alias_config_section_completion, + ptr_alias_name); if (ptr_option) weechat_config_option_free (ptr_option); - weechat_config_new_option ( - alias_config_file, alias_config_section_cmd, - alias_name, "string", NULL, - NULL, 0, 0, "", argv_eol[2], 0, - NULL, NULL, - &alias_config_change_cb, NULL, - &alias_config_delete_cb, NULL); + if (ptr_completion) + alias_config_completion_new_option (ptr_alias_name, ptr_completion); + /* display message */ weechat_printf (NULL, _("Alias \"%s\" => \"%s\" created"), - alias_name, argv_eol[2]); + ptr_alias_name, ptr_command); } else { - /* Display list of aliases */ + /* get pointer to alias name */ + ptr_alias_name = (weechat_string_is_command_char (argv[1])) ? + weechat_utf8_next_char (argv[1]) : argv[1]; + + /* display list of aliases */ alias_found = 0; for (ptr_alias = alias_list; ptr_alias; ptr_alias = ptr_alias->next_alias) { - if (weechat_string_match (ptr_alias->name, alias_name, 0)) + if (weechat_string_match (ptr_alias->name, ptr_alias_name, 0)) { if (!alias_found) { @@ -876,7 +744,7 @@ alias_command_cb (void *data, struct t_gui_buffer *buffer, int argc, if (!alias_found) { weechat_printf (NULL, _("No alias found matching \"%s\""), - alias_name); + ptr_alias_name); } } } @@ -942,12 +810,17 @@ unalias_command_cb (void *data, struct t_gui_buffer *buffer, int argc, /* remove alias */ alias_free (ptr_alias); - /* remove option */ + /* remove options */ ptr_option = weechat_config_search_option (alias_config_file, alias_config_section_cmd, alias_name); if (ptr_option) weechat_config_option_free (ptr_option); + ptr_option = weechat_config_search_option (alias_config_file, + alias_config_section_completion, + alias_name); + if (ptr_option) + weechat_config_option_free (ptr_option); weechat_printf (NULL, _("Alias \"%s\" removed"), @@ -1007,6 +880,8 @@ alias_add_to_infolist (struct t_infolist *infolist, struct t_alias *alias) return 0; if (!weechat_infolist_new_var_string (ptr_item, "command", alias->command)) return 0; + if (!weechat_infolist_new_var_string (ptr_item, "completion", alias->completion)) + return 0; if (!weechat_infolist_new_var_integer (ptr_item, "running", alias->running)) return 0; @@ -1029,7 +904,7 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) if (!alias_config_init ()) { weechat_printf (NULL, - "%s%s: error creating configuration file", + _("%s%s: error creating configuration file"), weechat_prefix("error"), ALIAS_PLUGIN_NAME); return WEECHAT_RC_ERROR; } @@ -1037,9 +912,13 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) weechat_hook_command ("alias", N_("create an alias for a command"), - N_("[alias_name [command [arguments]]]"), - N_("alias_name: name of alias (can start or end with " - "\"*\" for alias listing)\n" + N_("[[-completion completion] alias_name [command " + "[arguments]]]"), + N_("completion: completion for alias (optional, by " + "default completion is done with target " + "command)\n" + "alias_name: name of alias (can start or end " + "with \"*\" for alias listing)\n" " command: command name (many commands can be " "separated by semicolons)\n" " arguments: arguments for command\n\n" @@ -1055,8 +934,18 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) " $~: last argument\n" " $nick: current nick\n" " $channel: current channel\n" - " $server: current server"), - "%(alias) %(commands)", + " $server: current server\n\n" + "Examples:\n" + " alias /split to split window horizontally:\n" + " /alias split /window splith\n" + " alias /hello to say \"hello\" on all channels " + "but not on #weechat:\n" + " /alias hello /allchan -exclude=#weechat msg " + "* hello\n" + " alias /forcejoin to send IRC command " + "\"forcejoin\" with completion of /sajoin:\n" + " /alias -completion %%sajoin /quote forcejoin"), + "%(alias)|-completion %(commands)", &alias_command_cb, NULL); weechat_hook_command ("unalias", N_("remove aliases"), diff --git a/src/plugins/alias/alias.h b/src/plugins/alias/alias.h index aa7eb7c3f..57215b6bd 100644 --- a/src/plugins/alias/alias.h +++ b/src/plugins/alias/alias.h @@ -30,6 +30,8 @@ struct t_alias struct t_hook *hook; /* command hook */ char *name; /* alias name */ char *command; /* alias command */ + char *completion; /* completion for alias (if not set, */ + /* uses completion of target cmd) */ int running; /* 1 if alias is running */ struct t_alias *prev_alias; /* link to previous alias */ struct t_alias *next_alias; /* link to next alias */ @@ -40,6 +42,13 @@ extern struct t_alias *alias_list; extern struct t_weechat_plugin *weechat_alias_plugin; extern int alias_valid (struct t_alias *alias); +extern struct t_alias *alias_search (const char *alias_name); +extern void alias_update_completion (struct t_alias *alias, + const char *completion); +extern struct t_alias *alias_new (const char *name, const char *command, + const char *completion); +extern void alias_free (struct t_alias *alias); +extern void alias_free_all (); extern int alias_add_to_infolist (struct t_infolist *infolist, struct t_alias *alias); |