1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-05 17:23:15 +02:00

Added new key to find previous completion (shift-tab by default)

This commit is contained in:
Sebastien Helleu
2006-05-13 00:06:18 +00:00
parent 293bf5988b
commit 78ca78855e
36 changed files with 1276 additions and 1068 deletions
+137 -107
View File
@@ -56,6 +56,7 @@ completion_init (t_completion *completion, void *server, void *channel)
completion->position = -1;
completion->base_word = NULL;
completion->args = NULL;
completion->direction = 0;
completion->completion_list = NULL;
completion->last_completion = NULL;
@@ -176,6 +177,23 @@ completion_get_command_infos (t_completion *completion,
return;
}
/*
* completion_list_add: add a word to completion word list
*/
void
completion_list_add (t_completion *completion, char *word)
{
if (!completion->base_word || !completion->base_word[0]
|| (ascii_strncasecmp (completion->base_word, word,
strlen (completion->base_word)) == 0))
{
weelist_add (&completion->completion_list,
&completion->last_completion,
word);
}
}
/*
* completion_list_add_alias: add alias to completion list
*/
@@ -187,9 +205,7 @@ completion_list_add_alias (t_completion *completion)
for (ptr_alias = weechat_alias; ptr_alias; ptr_alias = ptr_alias->next_alias)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_alias->alias_name);
completion_list_add (completion, ptr_alias->alias_name);
}
}
@@ -204,9 +220,7 @@ completion_list_add_alias_cmd (t_completion *completion)
for (ptr_list = index_commands; ptr_list; ptr_list = ptr_list->next_weelist)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_list->data);
completion_list_add (completion, ptr_list->data);
}
}
@@ -218,9 +232,8 @@ void
completion_list_add_channel (t_completion *completion)
{
if (completion->channel)
weelist_add (&completion->completion_list,
&completion->last_completion,
((t_irc_channel *)(completion->channel))->name);
completion_list_add (completion,
((t_irc_channel *)(completion->channel))->name);
}
/*
@@ -237,9 +250,7 @@ completion_list_add_server_channels (t_completion *completion)
for (ptr_channel = ((t_irc_server *)(completion->server))->channels;
ptr_channel; ptr_channel = ptr_channel->next_channel)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_channel->name);
completion_list_add (completion, ptr_channel->name);
}
}
}
@@ -273,9 +284,7 @@ completion_list_add_plugin_cmd (t_completion *completion)
ptr_handler; ptr_handler = ptr_handler->next_handler)
{
if (ptr_handler->type == HANDLER_COMMAND)
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_handler->command);
completion_list_add (completion, ptr_handler->command);
}
}
#else
@@ -296,9 +305,7 @@ completion_list_add_irc_cmd_sent (t_completion *completion)
for (i = 0; irc_commands[i].command_name; i++)
{
if (irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
weelist_add (&completion->completion_list,
&completion->last_completion,
irc_commands[i].command_name);
completion_list_add (completion, irc_commands[i].command_name);
}
}
@@ -314,9 +321,7 @@ completion_list_add_irc_cmd_recv (t_completion *completion)
for (i = 0; irc_commands[i].command_name; i++)
{
if (irc_commands[i].recv_function)
weelist_add(&completion->completion_list,
&completion->last_completion,
irc_commands[i].command_name);
completion_list_add(completion, irc_commands[i].command_name);
}
}
@@ -331,9 +336,7 @@ completion_list_add_key_cmd (t_completion *completion)
for (i = 0; gui_key_functions[i].function_name; i++)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
gui_key_functions[i].function_name);
completion_list_add (completion, gui_key_functions[i].function_name);
}
}
@@ -353,17 +356,14 @@ completion_list_add_channel_nicks (t_completion *completion)
for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
ptr_nick; ptr_nick = ptr_nick->next_nick)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_nick->nick);
completion_list_add (completion, ptr_nick->nick);
}
}
if ((((t_irc_channel *)(completion->channel))->type == CHANNEL_TYPE_PRIVATE)
|| (((t_irc_channel *)(completion->channel))->type == CHANNEL_TYPE_DCC_CHAT))
{
weelist_add (&completion->completion_list,
&completion->last_completion,
((t_irc_channel *)(completion->channel))->name);
completion_list_add (completion,
((t_irc_channel *)(completion->channel))->name);
}
completion->arg_is_nick = 1;
}
@@ -387,9 +387,7 @@ completion_list_add_channel_nicks_hosts (t_completion *completion)
for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
ptr_nick; ptr_nick = ptr_nick->next_nick)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_nick->nick);
completion_list_add (completion, ptr_nick->nick);
if (ptr_nick->host)
{
length = strlen (ptr_nick->nick) + 1 +
@@ -399,9 +397,7 @@ completion_list_add_channel_nicks_hosts (t_completion *completion)
{
snprintf (buf, length, "%s!%s",
ptr_nick->nick, ptr_nick->host);
weelist_add (&completion->completion_list,
&completion->last_completion,
buf);
completion_list_add (completion, buf);
free (buf);
}
}
@@ -410,9 +406,8 @@ completion_list_add_channel_nicks_hosts (t_completion *completion)
if ((((t_irc_channel *)(completion->channel))->type == CHANNEL_TYPE_PRIVATE)
|| (((t_irc_channel *)(completion->channel))->type == CHANNEL_TYPE_PRIVATE))
{
weelist_add (&completion->completion_list,
&completion->last_completion,
((t_irc_channel *)(completion->channel))->name);
completion_list_add (completion,
((t_irc_channel *)(completion->channel))->name);
}
completion->arg_is_nick = 1;
}
@@ -436,9 +431,8 @@ completion_list_add_option (t_completion *completion)
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
weechat_options[i][j].option_name);
completion_list_add (completion,
weechat_options[i][j].option_name);
}
}
}
@@ -450,9 +444,7 @@ completion_list_add_option (t_completion *completion)
snprintf (option_name, sizeof (option_name), "%s.%s",
ptr_server->name,
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
weelist_add (&completion->completion_list,
&completion->last_completion,
option_name);
completion_list_add (completion, option_name);
}
}
}
@@ -470,9 +462,7 @@ completion_list_add_plugin_option (t_completion *completion)
for (ptr_option = plugin_options; ptr_option;
ptr_option = ptr_option->next_option)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_option->name);
completion_list_add (completion, ptr_option->name);
}
#else
/* make gcc happy */
@@ -488,9 +478,7 @@ void
completion_list_add_part (t_completion *completion)
{
if (cfg_irc_default_msg_part && cfg_irc_default_msg_part[0])
weelist_add (&completion->completion_list,
&completion->last_completion,
cfg_irc_default_msg_part);
completion_list_add (completion, cfg_irc_default_msg_part);
}
/*
@@ -506,9 +494,7 @@ completion_list_add_plugin (t_completion *completion)
for (ptr_plugin = weechat_plugins; ptr_plugin;
ptr_plugin = ptr_plugin->next_plugin)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_plugin->name);
completion_list_add (completion, ptr_plugin->name);
}
#else
/* make gcc happy */
@@ -524,9 +510,7 @@ void
completion_list_add_quit (t_completion *completion)
{
if (cfg_irc_default_msg_quit && cfg_irc_default_msg_quit[0])
weelist_add (&completion->completion_list,
&completion->last_completion,
cfg_irc_default_msg_quit);
completion_list_add (completion, cfg_irc_default_msg_quit);
}
/*
@@ -537,9 +521,8 @@ void
completion_list_add_server (t_completion *completion)
{
if (completion->server)
weelist_add (&completion->completion_list,
&completion->last_completion,
((t_irc_server *)(completion->server))->name);
completion_list_add (completion,
((t_irc_server *)(completion->server))->name);
}
/*
@@ -554,9 +537,7 @@ completion_list_add_servers (t_completion *completion)
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_server->name);
completion_list_add (completion, ptr_server->name);
}
}
@@ -582,9 +563,9 @@ completion_list_add_topic (t_completion *completion)
string2 = channel_iconv_decode ((t_irc_server *)(completion->server),
(t_irc_channel *)(completion->channel),
(string) ? string : ((t_irc_channel *)(completion->channel))->topic);
weelist_add (&completion->completion_list,
&completion->last_completion,
(string2) ? string2 : ((string) ? string : ((t_irc_channel *)(completion->channel))->topic));
completion_list_add (completion,
(string2) ? string2 : ((string) ?
string : ((t_irc_channel *)(completion->channel))->topic));
if (string)
free (string);
if (string2)
@@ -618,34 +599,26 @@ completion_list_add_option_value (t_completion *completion)
{
case OPTION_TYPE_BOOLEAN:
if (option_value && (*((int *)(option_value))))
weelist_add (&completion->completion_list,
&completion->last_completion,
"on");
completion_list_add (completion, "on");
else
weelist_add (&completion->completion_list,
&completion->last_completion,
"off");
completion_list_add (completion, "off");
break;
case OPTION_TYPE_INT:
snprintf (option_string, sizeof (option_string) - 1,
"%d", (option_value) ? *((int *)(option_value)) : option->default_int);
weelist_add (&completion->completion_list,
&completion->last_completion,
option_string);
completion_list_add (completion, option_string);
break;
case OPTION_TYPE_INT_WITH_STRING:
weelist_add (&completion->completion_list,
&completion->last_completion,
(option_value) ?
option->array_values[*((int *)(option_value))] :
option->array_values[option->default_int]);
completion_list_add (completion,
(option_value) ?
option->array_values[*((int *)(option_value))] :
option->array_values[option->default_int]);
break;
case OPTION_TYPE_COLOR:
weelist_add (&completion->completion_list,
&completion->last_completion,
(option_value) ?
gui_color_get_name (*((int *)(option_value))) :
option->default_string);
completion_list_add (completion,
(option_value) ?
gui_color_get_name (*((int *)(option_value))) :
option->default_string);
break;
case OPTION_TYPE_STRING:
snprintf (option_string, sizeof (option_string) - 1,
@@ -653,9 +626,7 @@ completion_list_add_option_value (t_completion *completion)
((option_value) && (*((char **)(option_value)))) ?
*((char **)(option_value)) :
option->default_string);
weelist_add (&completion->completion_list,
&completion->last_completion,
option_string);
completion_list_add (completion, option_string);
break;
}
}
@@ -683,9 +654,7 @@ completion_list_add_plugin_option_value (t_completion *completion)
ptr_option = plugin_config_search_internal (completion->args);
if (ptr_option)
weelist_add (&completion->completion_list,
&completion->last_completion,
ptr_option->value);
completion_list_add (completion, ptr_option->value);
if (pos)
pos[0] = ' ';
@@ -707,9 +676,7 @@ completion_list_add_weechat_cmd (t_completion *completion)
for (i = 0; weechat_commands[i].command_name; i++)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
weechat_commands[i].command_name);
completion_list_add (completion, weechat_commands[i].command_name);
}
}
@@ -1028,20 +995,35 @@ completion_command (t_completion *completion)
length = strlen (completion->base_word) - 1;
word_found_seen = 0;
other_completion = 0;
for (ptr_weelist = index_commands; ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
if (completion->direction < 0)
ptr_weelist = last_index_command;
else
ptr_weelist = index_commands;
while (ptr_weelist)
{
if (ascii_strncasecmp (ptr_weelist->data, completion->base_word + 1, length) == 0)
{
if ((!completion->word_found) || word_found_seen)
{
completion->word_found = ptr_weelist->data;
for (ptr_weelist2 = ptr_weelist->next_weelist; ptr_weelist2;
ptr_weelist2 = ptr_weelist2->next_weelist)
if (completion->direction < 0)
ptr_weelist2 = ptr_weelist->prev_weelist;
else
ptr_weelist2 = ptr_weelist->next_weelist;
while (ptr_weelist2)
{
if (ascii_strncasecmp (ptr_weelist2->data,
completion->base_word + 1, length) == 0)
completion->base_word + 1, length) == 0)
other_completion++;
if (completion->direction < 0)
ptr_weelist2 = ptr_weelist2->prev_weelist;
else
ptr_weelist2 = ptr_weelist2->next_weelist;
}
if (other_completion == 0)
completion->position = -1;
else
@@ -1054,6 +1036,11 @@ completion_command (t_completion *completion)
if (completion->word_found &&
(ascii_strcasecmp (ptr_weelist->data, completion->word_found) == 0))
word_found_seen = 1;
if (completion->direction < 0)
ptr_weelist = ptr_weelist->prev_weelist;
else
ptr_weelist = ptr_weelist->next_weelist;
}
if (completion->word_found)
{
@@ -1144,8 +1131,12 @@ completion_command_arg (t_completion *completion, int nick_completion)
length = strlen (completion->base_word);
word_found_seen = 0;
other_completion = 0;
for (ptr_weelist = completion->completion_list; ptr_weelist;
ptr_weelist = ptr_weelist->next_weelist)
if (completion->direction < 0)
ptr_weelist = completion->last_completion;
else
ptr_weelist = completion->completion_list;
while (ptr_weelist)
{
if ((nick_completion && (completion_nickncmp (completion->base_word, ptr_weelist->data, length) == 0))
|| ((!nick_completion) && (ascii_strncasecmp (completion->base_word, ptr_weelist->data, length) == 0)))
@@ -1153,15 +1144,26 @@ completion_command_arg (t_completion *completion, int nick_completion)
if ((!completion->word_found) || word_found_seen)
{
completion->word_found = ptr_weelist->data;
for (ptr_weelist2 = ptr_weelist->next_weelist; ptr_weelist2;
ptr_weelist2 = ptr_weelist2->next_weelist)
if (completion->direction < 0)
ptr_weelist2 = ptr_weelist->prev_weelist;
else
ptr_weelist2 = ptr_weelist->next_weelist;
while (ptr_weelist2)
{
if ((nick_completion
&& (completion_nickncmp (completion->base_word, ptr_weelist2->data, length) == 0))
|| ((!nick_completion)
&& (ascii_strncasecmp (completion->base_word, ptr_weelist2->data, length) == 0)))
other_completion++;
if (completion->direction < 0)
ptr_weelist2 = ptr_weelist2->prev_weelist;
else
ptr_weelist2 = ptr_weelist2->next_weelist;
}
if (other_completion == 0)
completion->position = -1;
else
@@ -1174,6 +1176,11 @@ completion_command_arg (t_completion *completion, int nick_completion)
if (completion->word_found &&
(ascii_strcasecmp (ptr_weelist->data, completion->word_found) == 0))
word_found_seen = 1;
if (completion->direction < 0)
ptr_weelist = ptr_weelist->prev_weelist;
else
ptr_weelist = ptr_weelist->next_weelist;
}
if (completion->word_found)
{
@@ -1214,9 +1221,13 @@ completion_nick (t_completion *completion)
length = strlen (completion->base_word);
word_found_seen = 0;
other_completion = 0;
if (completion->direction < 0)
ptr_nick = ((t_irc_channel *)(completion->channel))->last_nick;
else
ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
ptr_nick; ptr_nick = ptr_nick->next_nick)
while (ptr_nick)
{
if (completion_nickncmp (completion->base_word, ptr_nick->nick, length) == 0)
{
@@ -1228,14 +1239,25 @@ completion_nick (t_completion *completion)
completion->position = -1;
return;
}
for (ptr_nick2 = ptr_nick->next_nick; ptr_nick2;
ptr_nick2 = ptr_nick2->next_nick)
if (completion->direction < 0)
ptr_nick2 = ptr_nick->prev_nick;
else
ptr_nick2 = ptr_nick->next_nick;
while (ptr_nick2)
{
if (completion_nickncmp (completion->base_word,
ptr_nick2->nick,
length) == 0)
other_completion++;
if (completion->direction < 0)
ptr_nick2 = ptr_nick2->prev_nick;
else
ptr_nick2 = ptr_nick2->next_nick;
}
if (other_completion == 0)
completion->position = -1;
else
@@ -1250,6 +1272,11 @@ completion_nick (t_completion *completion)
if (completion->word_found &&
(ascii_strcasecmp (ptr_nick->nick, completion->word_found) == 0))
word_found_seen = 1;
if (completion->direction < 0)
ptr_nick = ptr_nick->prev_nick;
else
ptr_nick = ptr_nick->next_nick;
}
if (completion->word_found)
{
@@ -1263,10 +1290,13 @@ completion_nick (t_completion *completion)
*/
void
completion_search (t_completion *completion, char *buffer, int size, int pos)
completion_search (t_completion *completion, int direction,
char *buffer, int size, int pos)
{
char *old_word_found;
completion->direction = direction;
/* if new completion => look for base word */
if (pos != completion->position)
{
+2 -1
View File
@@ -43,6 +43,7 @@ struct t_completion
int base_word_pos; /* beggining of base word */
int position; /* position where Tab was pressed */
char *args; /* command line args (including base word) */
int direction; /* +1 = search next word, -1 = previous word */
/* for command argument completion */
t_weelist *completion_list; /* data list for completion */
@@ -57,6 +58,6 @@ struct t_completion
extern void completion_init (t_completion *, void *, void *);
extern void completion_free (t_completion *);
extern void completion_search (t_completion *, char *, int, int);
extern void completion_search (t_completion *, int, char *, int, int);
#endif /* completion.h */
+1
View File
@@ -51,6 +51,7 @@ gui_keyboard_default_bindings ()
gui_keyboard_bind ( /* RC */ "ctrl-M", "return");
gui_keyboard_bind ( /* RC */ "ctrl-J", "return");
gui_keyboard_bind ( /* tab */ "ctrl-I", "tab");
gui_keyboard_bind ( /* s-tab */ "meta2-Z", "tab_previous");
gui_keyboard_bind ( /* basckp */ "ctrl-H", "backspace");
gui_keyboard_bind ( /* basckp */ "ctrl-?", "backspace");
gui_keyboard_bind ( /* del */ "meta2-3~", "delete");
+20 -102
View File
@@ -125,114 +125,32 @@ gui_action_return (t_gui_window *window)
void
gui_action_tab (t_gui_window *window)
{
int i;
if (window->buffer->has_input)
{
completion_search (&(window->buffer->completion),
completion_search (&(window->buffer->completion), 1,
window->buffer->input_buffer,
window->buffer->input_buffer_size,
utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos));
if (window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (window->buffer->completion.diff_size > 0)
{
window->buffer->input_buffer_size +=
window->buffer->completion.diff_size;
window->buffer->input_buffer_length +=
window->buffer->completion.diff_length;
gui_input_optimize_size (window->buffer);
window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0';
for (i = window->buffer->input_buffer_size - 1;
i >= window->buffer->completion.position_replace +
(int)strlen (window->buffer->completion.word_found); i--)
{
window->buffer->input_buffer[i] =
window->buffer->input_buffer[i - window->buffer->completion.diff_size];
window->buffer->input_buffer_color_mask[i] =
window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size];
}
}
else
{
for (i = window->buffer->completion.position_replace +
strlen (window->buffer->completion.word_found);
i < window->buffer->input_buffer_size; i++)
{
window->buffer->input_buffer[i] =
window->buffer->input_buffer[i - window->buffer->completion.diff_size];
window->buffer->input_buffer_color_mask[i] =
window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size];
}
window->buffer->input_buffer_size +=
window->buffer->completion.diff_size;
window->buffer->input_buffer_length +=
window->buffer->completion.diff_length;
gui_input_optimize_size (window->buffer);
window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0';
}
strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace,
window->buffer->completion.word_found,
strlen (window->buffer->completion.word_found));
for (i = 0; i < (int)strlen (window->buffer->completion.word_found); i++)
{
window->buffer->input_buffer_color_mask[window->buffer->completion.position_replace + i] = ' ';
}
window->buffer->input_buffer_pos =
utf8_pos (window->buffer->input_buffer,
window->buffer->completion.position_replace) +
utf8_strlen (window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (window->buffer->completion.position >= 0)
window->buffer->completion.position =
utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos);
/* add space or completor to the end of completion, if needed */
if ((window->buffer->completion.context == COMPLETION_COMMAND)
|| (window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos)] != ' ')
gui_insert_string_input (window, " ",
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position++;
window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((window->buffer->completion.base_word_pos == 0)
&& (window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (utf8_add_offset (window->buffer->input_buffer,
window->buffer->input_buffer_pos),
cfg_look_nick_completor, strlen (cfg_look_nick_completor)) != 0)
gui_insert_string_input (window, cfg_look_nick_completor,
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position += strlen (cfg_look_nick_completor);
window->buffer->input_buffer_pos += utf8_strlen (cfg_look_nick_completor);
if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos)] != ' ')
gui_insert_string_input (window, " ",
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position++;
window->buffer->input_buffer_pos++;
}
}
gui_input_draw (window->buffer, 0);
}
gui_input_complete (window);
}
}
/*
* gui_action_tab_previous: shift-tab key => find previous completion
*/
void
gui_action_tab_previous (t_gui_window *window)
{
if (window->buffer->has_input)
{
completion_search (&(window->buffer->completion), -1,
window->buffer->input_buffer,
window->buffer->input_buffer_size,
utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos));
gui_input_complete (window);
}
}
+109
View File
@@ -552,6 +552,115 @@ gui_input_move (t_gui_buffer *buffer, char *target, char *source, int size)
buffer->input_buffer_color_mask + pos_source, size);
}
/*
* gui_input_complete: complete a word in input buffer
*/
void
gui_input_complete (t_gui_window *window)
{
int i;
if (window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (window->buffer->completion.diff_size > 0)
{
window->buffer->input_buffer_size +=
window->buffer->completion.diff_size;
window->buffer->input_buffer_length +=
window->buffer->completion.diff_length;
gui_input_optimize_size (window->buffer);
window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0';
for (i = window->buffer->input_buffer_size - 1;
i >= window->buffer->completion.position_replace +
(int)strlen (window->buffer->completion.word_found); i--)
{
window->buffer->input_buffer[i] =
window->buffer->input_buffer[i - window->buffer->completion.diff_size];
window->buffer->input_buffer_color_mask[i] =
window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size];
}
}
else
{
for (i = window->buffer->completion.position_replace +
strlen (window->buffer->completion.word_found);
i < window->buffer->input_buffer_size; i++)
{
window->buffer->input_buffer[i] =
window->buffer->input_buffer[i - window->buffer->completion.diff_size];
window->buffer->input_buffer_color_mask[i] =
window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size];
}
window->buffer->input_buffer_size +=
window->buffer->completion.diff_size;
window->buffer->input_buffer_length +=
window->buffer->completion.diff_length;
gui_input_optimize_size (window->buffer);
window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0';
}
strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace,
window->buffer->completion.word_found,
strlen (window->buffer->completion.word_found));
for (i = 0; i < (int)strlen (window->buffer->completion.word_found); i++)
{
window->buffer->input_buffer_color_mask[window->buffer->completion.position_replace + i] = ' ';
}
window->buffer->input_buffer_pos =
utf8_pos (window->buffer->input_buffer,
window->buffer->completion.position_replace) +
utf8_strlen (window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (window->buffer->completion.position >= 0)
window->buffer->completion.position =
utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos);
/* add space or completor to the end of completion, if needed */
if ((window->buffer->completion.context == COMPLETION_COMMAND)
|| (window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos)] != ' ')
gui_insert_string_input (window, " ",
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position++;
window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((window->buffer->completion.base_word_pos == 0)
&& (window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (utf8_add_offset (window->buffer->input_buffer,
window->buffer->input_buffer_pos),
cfg_look_nick_completor, strlen (cfg_look_nick_completor)) != 0)
gui_insert_string_input (window, cfg_look_nick_completor,
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position += strlen (cfg_look_nick_completor);
window->buffer->input_buffer_pos += utf8_strlen (cfg_look_nick_completor);
if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
window->buffer->input_buffer_pos)] != ' ')
gui_insert_string_input (window, " ",
window->buffer->input_buffer_pos);
if (window->buffer->completion.position >= 0)
window->buffer->completion.position++;
window->buffer->input_buffer_pos++;
}
}
gui_input_draw (window->buffer, 0);
}
}
/*
* gui_exec_action_dcc: execute an action on a DCC after a user input
* return -1 if DCC buffer was closed due to action,
+2
View File
@@ -49,6 +49,8 @@ t_gui_key_function gui_key_functions[] =
N_("terminate line") },
{ "tab", gui_action_tab,
N_("complete word") },
{ "tab_previous", gui_action_tab_previous,
N_("find previous completion for word") },
{ "backspace", gui_action_backspace,
N_("delete previous char") },
{ "delete", gui_action_delete,
+2
View File
@@ -106,6 +106,7 @@ extern void gui_action_clipboard_copy (char *, int);
extern void gui_action_clipboard_paste (t_gui_window *);
extern void gui_action_return (t_gui_window *);
extern void gui_action_tab (t_gui_window *);
extern void gui_action_tab_previous (t_gui_window *);
extern void gui_action_backspace (t_gui_window *);
extern void gui_action_delete (t_gui_window *);
extern void gui_action_delete_previous_word (t_gui_window *);
@@ -174,6 +175,7 @@ extern void gui_printf_raw_data (void *, int, char *);
extern void gui_input_optimize_size (t_gui_buffer *);
extern void gui_input_init_color_mask (t_gui_buffer *);
extern void gui_input_move (t_gui_buffer *, char *, char *, int );
extern void gui_input_complete (t_gui_window *);
extern void gui_exec_action_dcc (t_gui_window *, char *);
extern void gui_exec_action_raw_data (t_gui_window *, char *);
extern int gui_insert_string_input (t_gui_window *, char *, int);