1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-30 23:06:38 +02:00

alias: add option rename in command /alias (issue #1872)

This commit is contained in:
Sébastien Helleu
2023-01-28 14:57:55 +01:00
parent 11ea0aecf4
commit 3318a7f3b8
3 changed files with 219 additions and 109 deletions
+51 -4
View File
@@ -80,8 +80,8 @@ alias_command_cb (const void *pointer, void *data,
struct t_gui_buffer *buffer, int argc,
char **argv, char **argv_eol)
{
char *ptr_alias_name;
struct t_alias *ptr_alias;
char *ptr_alias_name, *ptr_alias_name2;
struct t_alias *ptr_alias, *ptr_alias2;
struct t_config_option *ptr_option;
int alias_found, i;
@@ -235,6 +235,48 @@ alias_command_cb (const void *pointer, void *data,
return WEECHAT_RC_OK;
}
if (weechat_strcmp (argv[1], "rename") == 0)
{
WEECHAT_COMMAND_MIN_ARGS(4, "rename");
ptr_alias_name = (weechat_string_is_command_char (argv[2])) ?
(char *)weechat_utf8_next_char (argv[2]) : argv[2];
ptr_alias_name2 = (weechat_string_is_command_char (argv[3])) ?
(char *)weechat_utf8_next_char (argv[3]) : argv[3];
ptr_alias = alias_search (ptr_alias_name);
if (!ptr_alias)
{
weechat_printf (NULL,
_("%sAlias \"%s\" not found"),
weechat_prefix ("error"),
ptr_alias_name);
}
else
{
/* check if target name already exists */
ptr_alias2 = alias_search (ptr_alias_name2);
if (ptr_alias2)
{
weechat_printf (NULL, _("%sAlias \"%s\" already exists"),
weechat_prefix ("error"), ptr_alias_name2);
}
else
{
/* rename alias */
if (alias_rename (ptr_alias, ptr_alias_name2))
{
weechat_printf (
NULL,
_("Alias \"%s\" has been renamed to \"%s\""),
ptr_alias_name,
ptr_alias_name2);
}
}
}
return WEECHAT_RC_OK;
}
WEECHAT_COMMAND_ERROR;
}
@@ -251,13 +293,15 @@ alias_command_init ()
N_("list [<alias>]"
" || add <alias> [<command>[;<command>...]]"
" || addcompletion <completion> <alias> [<command>[;<command>...]]"
" || del <alias> [<alias>...]"),
" || del <alias> [<alias>...]"
" || rename <alias> <new_alias>"),
/* xgettext:no-c-format */
N_(" list: list aliases (without argument, this list is "
"displayed)\n"
" add: add an alias\n"
"addcompletion: add an alias with a custom completion\n"
" del: delete an alias\n"
" rename: rename an alias\n"
" completion: completion for alias: by default completion is "
"done with target command\n"
" note: you can use %%command to use completion of "
@@ -283,12 +327,15 @@ alias_command_init ()
" alias /hello to say \"hello\" on all channels but not on "
"#weechat:\n"
" /alias add hello /allchan -exclude=#weechat hello\n"
" rename alias \"hello\" to \"Hello\":\n"
" /alias rename hello Hello\n"
" alias /forcejoin to send IRC command \"forcejoin\" with "
"completion of /sajoin:\n"
" /alias addcompletion %%sajoin forcejoin /quote forcejoin"),
"list %(alias)"
" || add %(alias) %(commands:/)|%(alias_value)"
" || addcompletion %- %(alias) %(commands:/)|%(alias_value)"
" || del %(alias)|%*",
" || del %(alias)|%*"
" || rename %(alias) %(alias)",
&alias_command_cb, NULL, NULL);
}
+167 -105
View File
@@ -444,77 +444,6 @@ alias_cb (const void *pointer, void *data,
return WEECHAT_RC_OK;
}
/*
* Frees an alias and remove it from list.
*/
void
alias_free (struct t_alias *alias)
{
struct t_alias *new_alias_list;
if (!alias)
return;
/* remove alias from list */
if (last_alias == alias)
last_alias = alias->prev_alias;
if (alias->prev_alias)
{
(alias->prev_alias)->next_alias = alias->next_alias;
new_alias_list = alias_list;
}
else
new_alias_list = alias->next_alias;
if (alias->next_alias)
(alias->next_alias)->prev_alias = alias->prev_alias;
/* free data */
if (alias->hook)
weechat_unhook (alias->hook);
if (alias->name)
free (alias->name);
if (alias->command)
free (alias->command);
if (alias->completion)
free (alias->completion);
free (alias);
alias_list = new_alias_list;
}
/*
* Frees all aliases.
*/
void
alias_free_all ()
{
while (alias_list)
{
alias_free (alias_list);
}
}
/*
* Searches for position of alias (to keep aliases sorted by name).
*/
struct t_alias *
alias_find_pos (const char *name)
{
struct t_alias *ptr_alias;
for (ptr_alias = alias_list; ptr_alias; ptr_alias = ptr_alias->next_alias)
{
if (weechat_strcmp (name, ptr_alias->name) < 0)
return ptr_alias;
}
/* position not found (we will add to the end of list) */
return NULL;
}
/*
* Hooks command for an alias.
*/
@@ -525,6 +454,12 @@ alias_hook_command (struct t_alias *alias)
char *str_priority_name, *str_completion;
int length;
if (alias->hook)
{
weechat_unhook (alias->hook);
alias->hook = NULL;
}
/*
* build string with priority and name: the alias priority is 2000, which
* is higher than default one (1000), so the alias is executed before a
@@ -565,6 +500,164 @@ alias_hook_command (struct t_alias *alias)
free (str_completion);
}
/*
* Searches for position of alias (to keep aliases sorted by name).
*/
struct t_alias *
alias_find_pos (const char *name)
{
struct t_alias *ptr_alias;
for (ptr_alias = alias_list; ptr_alias; ptr_alias = ptr_alias->next_alias)
{
if (weechat_strcmp (name, ptr_alias->name) < 0)
return ptr_alias;
}
/* position not found (we will add to the end of list) */
return NULL;
}
/*
* Inserts alias in list of aliases.
*/
void
alias_insert (struct t_alias *alias)
{
struct t_alias *pos_alias;
if (alias_list)
{
pos_alias = alias_find_pos (alias->name);
if (pos_alias)
{
/* insert alias into the list (before alias found) */
alias->prev_alias = pos_alias->prev_alias;
alias->next_alias = pos_alias;
if (pos_alias->prev_alias)
(pos_alias->prev_alias)->next_alias = alias;
else
alias_list = alias;
pos_alias->prev_alias = alias;
}
else
{
/* add alias to end of list */
alias->prev_alias = last_alias;
alias->next_alias = NULL;
last_alias->next_alias = alias;
last_alias = alias;
}
}
else
{
alias->prev_alias = NULL;
alias->next_alias = NULL;
alias_list = alias;
last_alias = alias;
}
}
/*
* Removes alias from list of aliases.
*/
void
alias_remove_from_list (struct t_alias *alias)
{
if (last_alias == alias)
last_alias = alias->prev_alias;
if (alias->prev_alias)
(alias->prev_alias)->next_alias = alias->next_alias;
else
alias_list = alias->next_alias;
if (alias->next_alias)
(alias->next_alias)->prev_alias = alias->prev_alias;
}
/*
* Renames an alias.
*
* Returns:
* 1: OK
* 0: error
*/
int
alias_rename (struct t_alias *alias, const char *new_name)
{
struct t_config_option *ptr_option;
if (!alias || !new_name || !new_name[0] || alias_search (new_name))
return 0;
/* rename options */
ptr_option = weechat_config_search_option (
alias_config_file,
alias_config_section_cmd,
alias->name);
if (ptr_option)
weechat_config_option_rename (ptr_option, new_name);
ptr_option = weechat_config_search_option (
alias_config_file,
alias_config_section_completion,
alias->name);
if (ptr_option)
weechat_config_option_rename (ptr_option, new_name);
/* rename alias */
free (alias->name);
alias->name = strdup (new_name);
/* hook command again */
alias_hook_command (alias);
/* move alias in list (to keep list sorted) */
alias_remove_from_list (alias);
alias_insert (alias);
return 1;
}
/*
* Frees an alias and remove it from list.
*/
void
alias_free (struct t_alias *alias)
{
if (!alias)
return;
alias_remove_from_list (alias);
/* free data */
if (alias->hook)
weechat_unhook (alias->hook);
if (alias->name)
free (alias->name);
if (alias->command)
free (alias->command);
if (alias->completion)
free (alias->completion);
free (alias);
}
/*
* Frees all aliases.
*/
void
alias_free_all ()
{
while (alias_list)
{
alias_free (alias_list);
}
}
/*
* Updates completion for an alias.
*/
@@ -577,9 +670,7 @@ alias_update_completion (struct t_alias *alias, const char *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;
/* hook command again, with new completion */
alias_hook_command (alias);
}
@@ -619,7 +710,7 @@ alias_name_valid (const char *name)
struct t_alias *
alias_new (const char *name, const char *command, const char *completion)
{
struct t_alias *new_alias, *ptr_alias, *pos_alias;
struct t_alias *new_alias, *ptr_alias;
if (!alias_name_valid (name))
{
@@ -653,36 +744,7 @@ alias_new (const char *name, const char *command, const char *completion)
alias_hook_command (new_alias);
if (alias_list)
{
pos_alias = alias_find_pos (name);
if (pos_alias)
{
/* insert alias into the list (before alias found) */
new_alias->prev_alias = pos_alias->prev_alias;
new_alias->next_alias = pos_alias;
if (pos_alias->prev_alias)
(pos_alias->prev_alias)->next_alias = new_alias;
else
alias_list = new_alias;
pos_alias->prev_alias = new_alias;
}
else
{
/* add alias to end of list */
new_alias->prev_alias = last_alias;
new_alias->next_alias = NULL;
last_alias->next_alias = new_alias;
last_alias = new_alias;
}
}
else
{
new_alias->prev_alias = NULL;
new_alias->next_alias = NULL;
alias_list = new_alias;
last_alias = new_alias;
}
alias_insert (new_alias);
}
return new_alias;
+1
View File
@@ -46,6 +46,7 @@ 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 int alias_rename (struct t_alias *alias, const char *new_name);
extern void alias_free (struct t_alias *alias);
extern void alias_free_all ();
extern int alias_add_to_infolist (struct t_infolist *infolist,