diff -ur orig.jed-0.99-16/doc/tm/rtl/hooks.tm jed-0.99-16/doc/tm/rtl/hooks.tm --- orig.jed-0.99-16/doc/tm/rtl/hooks.tm 2002-10-20 09:55:30.000000000 +0300 +++ jed-0.99-16/doc/tm/rtl/hooks.tm 2003-05-28 19:13:35.000000000 +0300 @@ -7,6 +7,7 @@ supported hooks include: #v+ _jed_append_region_hooks + _jed_completion_filter_hooks _jed_exit_hooks _jed_find_file_after_hooks _jed_find_file_before_hooks diff -ur orig.jed-0.99-16/doc/txt/hooks.txt jed-0.99-16/doc/txt/hooks.txt --- orig.jed-0.99-16/doc/txt/hooks.txt 2002-10-20 09:55:30.000000000 +0300 +++ jed-0.99-16/doc/txt/hooks.txt 2003-05-28 19:28:54.000000000 +0300 @@ -485,3 +485,30 @@ x_set_window_name (whatbuf ()); } add_to_hook ("_jed_switch_active_buffer_hooks", &my_switch_buffer_hook); + +_jed_completion_filter_hooks +------------------------------- + + These hooks are called when the minibuffer tab-completion + is used, to filter out undesired entries. + + The functions in this list receive two parameters. The first + parameter is the entry to be filtered, and the second parameter is + the sort of completion is being applied. Currently only filename + completions are filtered (indicated by the second parameter having + a value of 0). The hook function should return either 0 (to filter + the entry out from the completion) or 1 (no effect). + + For example, the following code prevents object files from being + completed: + + static define completion_filter_hook(name, type) { + % Filter out object files + if (type == "file" and string_match(name, "/.*\\.o$", 1)) { + return 0; + } + + return 1; + } + + add_to_hook("_jed_completion_filter_hooks", &completion_filter_hook); diff -ur orig.jed-0.99-16/src/ledit.c jed-0.99-16/src/ledit.c --- orig.jed-0.99-16/src/ledit.c 2002-10-20 09:55:31.000000000 +0300 +++ jed-0.99-16/src/ledit.c 2003-05-28 19:10:42.000000000 +0300 @@ -1657,6 +1657,36 @@ /*}}}*/ +int filter_completion (int (*cfun)(char *), char *buf) /*{{{*/ +{ + char prev[JED_MAX_PATH_LEN]; + + /* Only use completion_filter_hook for filenames at this point. */ + if (!(cfun == sys_findfirst || cfun == sys_findnext)) + return (*cfun)(buf); + + /* Save the original start of completion. */ + safe_strcpy(prev, buf, sizeof(prev)); + + while (1) { + int accept; + int comp = (*cfun)(buf); + /* Only use complete_open first time through the loop. */ + cfun = complete_next; + + /* No more files. */ + if (!comp) return comp; + + if (0 != jed_va_run_hooks ("_jed_completion_filter_hooks", + JED_HOOKS_RUN_UNTIL_0, 2, + buf, "file")) + return comp; + + strcpy(prev, buf); + } +} +/*}}}*/ + int mini_complete (void) /*{{{*/ { char *pl, *pb; @@ -1678,11 +1708,11 @@ if ((last_key_char == ' ') && ((long) Last_Key_Function == (long) mini_complete)) { if (flag) - flag = (*complete_next)(buf); + flag = filter_completion(complete_next, buf); if (flag == 0) { safe_strcpy(buf, prev, sizeof (buf)); - flag = (*complete_open)(buf); + flag = filter_completion(complete_open, buf); } safe_strcpy(last, buf, sizeof (last)); n = -1; @@ -1697,7 +1727,7 @@ { if ((Repeat_Factor != NULL) || (complete_open != sys_findfirst) || (Expand_File_Hook == NULL)) - flag = (*complete_open)(buf); + flag = filter_completion(complete_open, buf); else { int do_free; @@ -1708,7 +1738,7 @@ { if (do_free == 0) { - flag = (*complete_open) (buf); + flag = filter_completion(complete_open, buf); goto start_loop; } } @@ -1778,7 +1808,7 @@ newline (); } } - while(0 != (flag = (*complete_next)(buf))); + while(0 != (flag = filter_completion(complete_next, buf))); #if JED_FILE_PRESERVE_CASE /* OS/2 uses case-insensitive search on buffer-names. Set the @@ -1788,7 +1818,7 @@ if (complete_open == open_bufflist) { safe_strcpy(buf, last, sizeof (buf)); - (*complete_open)(buf); + filter_completion(complete_open, buf); do { if (!strcmp(buf, last)) @@ -1796,7 +1826,7 @@ flag = 1; break; } } - while ((*complete_next)(buf)); + while (filter_completion(complete_next, buf)); } #endif }