static void sig_complete_erase(WINDOW_REC *window, const char *word, const char *linestart) { const char *cmdchars; char *line, *cmd, *args, *signal; if (*linestart == '\0') return; /* we only want to check for commands */ cmdchars = settings_get_str("cmdchars"); cmdchars = strchr(cmdchars, *linestart); if (cmdchars == NULL) return; /* check if there's aliases */ line = linestart[1] == *cmdchars ? g_strdup(linestart+2) : expand_aliases(linestart+1); cmd = line_get_command(line, &args, FALSE); if (cmd == NULL) { g_free(line); return; } signal = g_strconcat("complete erase command ", cmd, NULL); signal_emit(signal, 3, window, word, args); g_free(signal); g_free(cmd); g_free(line); }
static char *expand_aliases(const char *line) { char *cmd, *args, *ret; g_return_val_if_fail(line != NULL, NULL); cmd = line_get_command(line, &args, TRUE); if (cmd == NULL) return g_strdup(line); if (*args == '\0') return cmd; ret = g_strconcat(cmd, " ", args, NULL); g_free(cmd); return ret; }
static void sig_complete_word(GList **list, WINDOW_REC *window, const char *word, const char *linestart, int *want_space) { const char *newword, *cmdchars; char *signal, *cmd, *args, *line; g_return_if_fail(list != NULL); g_return_if_fail(word != NULL); g_return_if_fail(linestart != NULL); /* check against "completion words" list */ newword = completion_find(word); if (newword != NULL) { *list = g_list_append(*list, g_strdup(newword)); signal_stop(); return; } /* command completion? */ cmdchars = settings_get_str("cmdchars"); if (strchr(cmdchars, *word) && *linestart == '\0') { /* complete /command */ *list = completion_get_commands(word+1, *word); if (*list != NULL) signal_stop(); return; } /* check only for /command completions from now on */ cmdchars = strchr(cmdchars, *linestart); if (cmdchars == NULL) return; /* check if there's aliases */ line = linestart[1] == *cmdchars ? g_strdup(linestart+2) : expand_aliases(linestart+1); cmd = line_get_command(line, &args, FALSE); if (cmd == NULL) { g_free(line); return; } /* we're completing -option? */ if (*word == '-') { *list = completion_get_options(cmd, word+1); g_free(cmd); g_free(line); return; } /* complete parameters */ 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); g_free(line); }