summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2014-11-09 12:29:41 +0100
committerSébastien Helleu <flashcode@flashtux.org>2014-11-09 12:29:41 +0100
commitaf0397fb87dcaeb02c00067b1ecb9154fd4fed81 (patch)
tree32ac942f1cd3b42c273b3b43fb373edd5a8cf3c3 /src
parent5bfd710e62f5febf3a9b20dbe052fd6e1b866a78 (diff)
downloadweechat-af0397fb87dcaeb02c00067b1ecb9154fd4fed81.zip
core: add option weechat.completion.command_inline (task #12491)
Diffstat (limited to 'src')
-rw-r--r--src/core/wee-config.c10
-rw-r--r--src/core/wee-config.h1
-rw-r--r--src/gui/gui-completion.c104
3 files changed, 82 insertions, 33 deletions
diff --git a/src/core/wee-config.c b/src/core/wee-config.c
index 163115683..cb65ae312 100644
--- a/src/core/wee-config.c
+++ b/src/core/wee-config.c
@@ -244,6 +244,7 @@ struct t_config_option *config_color_nicklist_offline;
/* config, completion section */
struct t_config_option *config_completion_base_word_until_cursor;
+struct t_config_option *config_completion_command_inline;
struct t_config_option *config_completion_default_template;
struct t_config_option *config_completion_nick_add_space;
struct t_config_option *config_completion_nick_completer;
@@ -3192,6 +3193,15 @@ config_weechat_init_options ()
N_("if enabled, the base word to complete ends at char before cursor; "
"otherwise the base word ends at first space after cursor"),
NULL, 0, 0, "on", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
+ config_completion_command_inline = config_file_new_option (
+ weechat_config_file, ptr_section,
+ "command_inline", "boolean",
+ N_("if enabled, the commands inside command line are completed (the "
+ "command at beginning of line has higher priority and is used "
+ "first); note: when this option is enabled, there is no more "
+ "automatic completion of paths beginning with '/' (outside "
+ "commands arguments)"),
+ NULL, 0, 0, "on", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
config_completion_default_template = config_file_new_option (
weechat_config_file, ptr_section,
"default_template", "string",
diff --git a/src/core/wee-config.h b/src/core/wee-config.h
index 181d24129..862490415 100644
--- a/src/core/wee-config.h
+++ b/src/core/wee-config.h
@@ -277,6 +277,7 @@ extern struct t_config_option *config_color_nicklist_group;
extern struct t_config_option *config_color_nicklist_offline;
extern struct t_config_option *config_completion_base_word_until_cursor;
+extern struct t_config_option *config_completion_command_inline;
extern struct t_config_option *config_completion_default_template;
extern struct t_config_option *config_completion_nick_add_space;
extern struct t_config_option *config_completion_nick_completer;
diff --git a/src/gui/gui-completion.c b/src/gui/gui-completion.c
index 6a796c823..21a8c6d35 100644
--- a/src/gui/gui-completion.c
+++ b/src/gui/gui-completion.c
@@ -705,33 +705,77 @@ void
gui_completion_find_context (struct t_gui_completion *completion,
const char *data, int size, int pos)
{
- int i, command, command_arg, pos_start, pos_end;
+ int i, command_arg, pos_start, pos_end;
+ const char *ptr_command, *ptr_data;
char *prev_char;
/* look for context */
gui_completion_free_data (completion);
gui_completion_buffer_init (completion, completion->buffer);
- command = (string_is_command_char (data)) ? 1 : 0;
+ ptr_command = NULL;
command_arg = 0;
- i = 0;
- while (i < pos)
+
+ /* check if data starts with a command */
+ ptr_data = data;
+ if (string_is_command_char (ptr_data))
{
- if (data[i] == ' ')
+ ptr_data = utf8_next_char (ptr_data);
+ if (ptr_data < data + pos)
{
- command_arg++;
- i++;
- while ((i < pos) && (data[i] == ' '))
+ if (string_is_command_char (ptr_data))
+ ptr_data = utf8_next_char (ptr_data);
+ }
+ if (!string_is_command_char (ptr_data))
+ ptr_command = ptr_data;
+ }
+
+ /*
+ * search for the last command in data (only if there is no command at
+ * beginning and if completion of inline commands is enabled)
+ */
+ if (!ptr_command && CONFIG_BOOLEAN(config_completion_command_inline))
+ {
+ ptr_data = data;
+ while (ptr_data && (ptr_data < data + pos))
+ {
+ ptr_data = strchr (ptr_data, ' ');
+ if (!ptr_data)
+ break;
+ if (ptr_data < data + pos)
{
- i++;
+ while ((ptr_data < data + pos) && (ptr_data[0] == ' '))
+ {
+ ptr_data++;
+ }
+ }
+ if ((ptr_data < data + pos) && string_is_command_char (ptr_data))
+ {
+ ptr_data = utf8_next_char (ptr_data);
+ if (!string_is_command_char (ptr_data))
+ ptr_command = ptr_data;
}
- if (!completion->args)
- completion->args = strdup (data + i);
}
- else
- i++;
}
- if (command)
+
+ if (ptr_command)
{
+ /* search argument number and string with arguments */
+ ptr_data = ptr_command;
+ while (ptr_data < data + pos)
+ {
+ ptr_data = strchr (ptr_data, ' ');
+ if (!ptr_data)
+ break;
+ command_arg++;
+ while ((ptr_data < data + pos) && (ptr_data[0] == ' '))
+ {
+ ptr_data++;
+ }
+ if (!completion->args)
+ completion->args = strdup (ptr_data);
+ }
+
+ /* set completion context */
if (command_arg > 0)
{
completion->context = GUI_COMPLETION_COMMAND_ARG;
@@ -817,35 +861,29 @@ gui_completion_find_context (struct t_gui_completion *completion,
/* find command (for command argument completion only) */
if (completion->context == GUI_COMPLETION_COMMAND_ARG)
{
- pos_start = 0;
- while ((pos_start < size) && !string_is_command_char (data + pos_start))
+ pos_start = ptr_command - data;
+ pos_end = pos_start;
+ while ((pos_end < size) && (data[pos_end] != ' '))
{
- pos_start += utf8_char_size (data + pos_start);
+ pos_end += utf8_char_size (data + pos_end);
}
- if (string_is_command_char (data + pos_start))
+ if (data[pos_end] == ' ')
+ {
+ prev_char = utf8_prev_char (data, data + pos_end);
+ pos_end -= utf8_char_size (prev_char);
+ }
+ if (pos_end >= pos_start)
{
- pos_start += utf8_char_size (data + pos_start);
- if (string_is_command_char (data + pos_start))
- pos_start += utf8_char_size (data + pos_start);
- pos_end = pos_start;
- while ((pos_end < size) && (data[pos_end] != ' '))
- {
- pos_end += utf8_char_size (data + pos_end);
- }
- if (data[pos_end] == ' ')
- {
- prev_char = utf8_prev_char (data, data + pos_end);
- pos_end -= utf8_char_size (prev_char);
- }
-
completion->base_command = malloc (pos_end - pos_start + 2);
for (i = pos_start; i <= pos_end; i++)
{
completion->base_command[i - pos_start] = data[i];
}
completion->base_command[pos_end - pos_start + 1] = '\0';
- gui_completion_build_list (completion);
}
+ else
+ completion->base_command = strdup ("");
+ gui_completion_build_list (completion);
}
/*