mirror of
https://github.com/weechat/weechat.git
synced 2026-07-09 03:03:12 +02:00
Added new key to find previous completion (shift-tab by default)
This commit is contained in:
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user