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
      }
