Mercurial > ~mikael > mcabber > hg
diff mcabber/src/screen.c @ 102:2b4cc6bc5bf2
[/trunk] Changeset 116 by mikael
* Can now complete command parameters :-)
author | mikael |
---|---|
date | Thu, 21 Apr 2005 19:06:27 +0000 |
parents | 4f3ad00b5187 |
children | 93dcc4e15d4a |
line wrap: on
line diff
--- a/mcabber/src/screen.c Thu Apr 21 17:31:28 2005 +0000 +++ b/mcabber/src/screen.c Thu Apr 21 19:06:27 2005 +0000 @@ -587,7 +587,8 @@ // -1 -> normal text // 0 -> command // 1 -> parameter 1 (etc.) -int which_row(void) +// If > 0, then *p_row is set to the beginning of the row +int which_row(char **p_row) { int row = -1; char *p; @@ -607,8 +608,10 @@ } if (*p == '"' && *(p-1) != '\\') { quote = TRUE; - } else if (*p == ' ' && *(p-1) != ' ') + } else if (*p == ' ' && *(p-1) != ' ') { row++; + *p_row = p+1; + } } return row; } @@ -630,13 +633,16 @@ void scr_handle_tab(void) { - int row; - row = which_row(); + int nrow; + cmd *com; + char *row; + const char *cchar; - if (row == -1) return; // No completion if no leading slash + nrow = which_row(&row); - if (row == 0) { // Command completion - const char *cchar; + if (nrow == -1) return; // No completion if no leading slash + + if (nrow == 0) { // Command completion if (!completion_started) { GSList *list = compl_get_category_list(COMPL_CMD); if (list) { @@ -650,7 +656,7 @@ scr_insert_text(cchar); completion_started = TRUE; } - } else { + } else { // Completion already initialized char *c; guint back = cancel_completion(); // Remove $back chars @@ -667,7 +673,45 @@ } // Other completion, depending on the command - scr_LogPrint("I'm unable to complete that yet"); + com = cmd_get(inputLine); + if (!com) { + scr_LogPrint("I cannot complete for this command"); + return; + } + // Now we have the command and the column. + scr_LogPrint("CMD_FLAGR1=%d COL=%d row=[%s]", com->completion_flags[0], nrow, row); + + // We can't have more than 2 parameters (we use 2 flags) + if (nrow > 2) + return; + + // Dirty copy & paste + if (!completion_started) { + GSList *list = compl_get_category_list(com->completion_flags[nrow-1]); + if (list) { + char *prefix = g_strndup(row, ptr_inputline-row); + // Init completion + new_completion(prefix, list); + g_free(prefix); + // Now complete + cchar = complete(); + if (cchar) + scr_insert_text(cchar); + completion_started = TRUE; + } + } else { // Completion already initialized + char *c; + guint back = cancel_completion(); + // Remove $back chars + ptr_inputline -= back; + c = ptr_inputline; + for ( ; *c ; c++) + *c = *(c+back); + // Now complete again + cchar = complete(); + if (cchar) + scr_insert_text(cchar); + } } void scr_cancel_current_completion(void)