1
0
mirror of https://github.com/irssi/irssi.git synced 2024-10-27 05:20:20 -04:00

/connect + /server server/chatnet completion by tommik.

Completion works now with commands that optionally could have
subcommands, like /server l<tab> could return list (subcommand) or
localhost (server).


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@751 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2000-10-14 14:32:53 +00:00 committed by cras
parent 98060c3185
commit 4c882129c3
2 changed files with 70 additions and 12 deletions

View File

@ -26,6 +26,8 @@
#include "settings.h"
#include "servers.h"
#include "chatnets.h"
#include "servers-setup.h"
#include "channels.h"
#include "channels-setup.h"
#include "queries.h"
@ -500,6 +502,60 @@ static void sig_complete_msg(GList **list, WINDOW_REC *window,
if (*list != NULL) signal_stop();
}
GList *completion_get_chatnets(const char *word)
{
GList *list;
GSList *tmp;
int len;
g_return_val_if_fail(word != NULL, NULL);
len = strlen(word);
list = NULL;
for (tmp = chatnets; tmp != NULL; tmp = tmp->next) {
CHATNET_REC *rec = tmp->data;
if (g_strncasecmp(rec->name, word, len) == 0)
list = g_list_append(list, g_strdup(rec->name));
}
return list;
}
GList *completion_get_servers(const char *word)
{
GList *list;
GSList *tmp;
int len;
g_return_val_if_fail(word != NULL, NULL);
len = strlen(word);
list = NULL;
for (tmp = setupservers; tmp != NULL; tmp = tmp->next) {
SERVER_SETUP_REC *rec = tmp->data;
if (g_strncasecmp(rec->address, word, len) == 0)
list = g_list_append(list, g_strdup(rec->address));
}
return list;
}
static void sig_complete_connect(GList **list, WINDOW_REC *window,
const char *word, const char *line,
int *want_space)
{
g_return_if_fail(list != NULL);
g_return_if_fail(word != NULL);
*list = completion_get_chatnets(word);
*list = g_list_concat(*list, completion_get_servers(word));
if (*list != NULL) signal_stop();
}
/* expand \n, \t and \\ */
static char *expand_escapes(const char *line, SERVER_REC *server,
WI_ITEM_REC *item)
@ -624,6 +680,8 @@ void chat_completion_init(void)
signal_add("complete word", (SIGNAL_FUNC) sig_complete_word);
signal_add("complete command msg", (SIGNAL_FUNC) sig_complete_msg);
signal_add("complete command connect", (SIGNAL_FUNC) sig_complete_connect);
signal_add("complete command server", (SIGNAL_FUNC) sig_complete_connect);
signal_add("message public", (SIGNAL_FUNC) sig_message_public);
signal_add("message private", (SIGNAL_FUNC) sig_message_private);
signal_add("command msg", (SIGNAL_FUNC) cmd_msg);
@ -640,6 +698,8 @@ void chat_completion_deinit(void)
signal_remove("complete word", (SIGNAL_FUNC) sig_complete_word);
signal_remove("complete command msg", (SIGNAL_FUNC) sig_complete_msg);
signal_remove("complete command connect", (SIGNAL_FUNC) sig_complete_connect);
signal_remove("complete command server", (SIGNAL_FUNC) sig_complete_connect);
signal_remove("message public", (SIGNAL_FUNC) sig_message_public);
signal_remove("message private", (SIGNAL_FUNC) sig_message_private);
signal_remove("command msg", (SIGNAL_FUNC) cmd_msg);

View File

@ -495,17 +495,6 @@ static void sig_complete_word(GList **list, WINDOW_REC *window,
line = linestart[1] == *cmdchars ? g_strdup(linestart+2) :
expand_aliases(linestart+1);
if (command_have_sub(line)) {
/* complete subcommand */
cmd = g_strconcat(line, " ", word, NULL);
*list = completion_get_subcommands(cmd);
g_free(cmd);
if (*list != NULL) signal_stop();
g_free(line);
return;
}
cmd = line_get_command(line, &args, FALSE);
if (cmd == NULL) {
g_free(line);
@ -524,6 +513,15 @@ static void sig_complete_word(GList **list, WINDOW_REC *window,
signal = g_strconcat("complete command ", cmd, NULL);
signal_emit(signal, 5, list, window, word, args, want_space);
if (command_have_sub(line)) {
/* complete subcommand */
g_free(cmd);
cmd = g_strconcat(line, " ", word, NULL);
*list = g_list_concat(completion_get_subcommands(cmd), *list);
if (*list != NULL) signal_stop();
}
g_free(signal);
g_free(cmd);