If someone runs "git st", the command "git status" is not suggested because it's not one of the closest levenshtein-neighbour. Reserve the distance of 0 for common commands where the entered command is a prefixe, as these are often more likely to be what the user meant. This way, "git status" is the first suggestion, while a list of possible typos are still suggested as well. Signed-off-by: Erik Faye-Lund <kusmabite@xxxxxxxxx> --- Here's an updated version, with the issues Junio fixed. I hope this is a bit clearer. Makefile | 2 ++ help.c | 26 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 1f1ce04..d6ba349 100644 --- a/Makefile +++ b/Makefile @@ -1611,6 +1611,8 @@ git$X: git.o $(BUILTIN_OBJS) $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \ $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS) +help.o: common-cmds.h + builtin/help.o: common-cmds.h builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \ '-DGIT_HTML_PATH="$(htmldir_SQ)"' \ diff --git a/help.c b/help.c index 7f4928e..dff5d6b 100644 --- a/help.c +++ b/help.c @@ -3,6 +3,7 @@ #include "exec_cmd.h" #include "levenshtein.h" #include "help.h" +#include "common-cmds.h" /* most GUI terminals set COLUMNS (although some don't export it) */ static int term_columns(void) @@ -298,7 +299,7 @@ static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old) } /* An empirically derived magic number */ -#define SIMILAR_ENOUGH(x) ((x) < 6) +#define SIMILAR_ENOUGH(x) ((x) < 7) const char *help_unknown_cmd(const char *cmd) { @@ -320,9 +321,16 @@ const char *help_unknown_cmd(const char *cmd) uniq(&main_cmds); /* This reuses cmdname->len for similarity index */ - for (i = 0; i < main_cmds.cnt; ++i) - main_cmds.names[i]->len = + for (i = 0; i < main_cmds.cnt; ++i) { + main_cmds.names[i]->len = 1 + levenshtein(cmd, main_cmds.names[i]->name, 0, 2, 1, 4); + for (n = 0; n < ARRAY_SIZE(common_cmds); ++n) { + if (!strcmp(main_cmds.names[i]->name, + common_cmds[n].name) && + !prefixcmp(main_cmds.names[i]->name, cmd)) + main_cmds.names[i]->len = 0; + } + } qsort(main_cmds.names, main_cmds.cnt, sizeof(*main_cmds.names), levenshtein_compare); @@ -330,10 +338,16 @@ const char *help_unknown_cmd(const char *cmd) if (!main_cmds.cnt) die ("Uh oh. Your system reports no Git commands at all."); - best_similarity = main_cmds.names[0]->len; - n = 1; - while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len) + n = 0; + while (n < main_cmds.cnt && !main_cmds.names[n]->len) ++n; + if (n < main_cmds.cnt) { + best_similarity = main_cmds.names[n++]->len; + while (n < main_cmds.cnt && + best_similarity == main_cmds.names[n]->len) + ++n; + } else + best_similarity = 0; if (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) { const char *assumed = main_cmds.names[0]->name; main_cmds.names[0] = NULL; -- 1.7.3.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html