diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi index 74e6211f8086..b5a17416d76c 100644 --- a/doc/emacs/buffers.texi +++ b/doc/emacs/buffers.texi @@ -725,6 +725,22 @@ of directories. the variable @code{icomplete-mode} to @code{t} (@pxref{Easy Customization}). +@findex fido-mode +@cindex fido mode + + An alternative to Icomplete mode is Fido mode. This is very similar +to Icomplete mode, but retains some functionality from a popular +extension called Ido mode (in fact the name is derived from ``Fake +Ido''). Among other things, in Fido mode, @kbd{C-s} and @kbd{C-r} are +also used to rotate the completions list, @kbd{C-k} can be used to +delete files and kill buffers in-list. Another noteworthy aspect is +that @code{flex} is used as the default completion style +(@pxref{Completion Styles}). + + To enable Fido mode, type @kbd{M-x fido-mode}, or customize +the variable @code{fido-mode} to @code{t} (@pxref{Easy +Customization}). + @node Buffer Menus @subsection Customizing Buffer Menus diff --git a/etc/NEWS b/etc/NEWS index b6e61c76e2f2..db3434f55b0f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1192,6 +1192,15 @@ A new command 'xref-revert-buffer' is bound to 'g'. --- *** Imenu support has been added to 'xref--xref-buffer-mode'. +** Icomplete + ++++ +*** A new minor mode based on Icomplete, Fido mode, is made available. +The point of this mode, named after "Fake Ido", is to recover much of +the functionality that still separated the popular ido-mode from +Icomplete, while still cooperating fully with all of Emacs's +completion facilities. + ** Ecomplete *** The ecomplete sorting has changed to a decay-based algorithm. diff --git a/lisp/icomplete.el b/lisp/icomplete.el index 777fdce13a03..40f4f0bc6885 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -273,20 +273,22 @@ require user confirmation." (exit-minibuffer)))) (defun icomplete-magic-ido-ret () - "Exit forcing completion or enter directory, like `ido-mode'." + "Exit minibuffer or enter directory, like `ido-mode'." (interactive) (let* ((beg (icomplete--field-beg)) (md (completion--field-metadata beg)) (category (alist-get 'category (cdr md))) (dir (and (eq category 'file) (file-name-directory (icomplete--field-string)))) - (current (and dir - (car (completion-all-sorted-completions)))) - (probe (and current + (current (car (completion-all-sorted-completions))) + (probe (and dir current (expand-file-name (directory-file-name current) dir)))) - (if (and probe (file-directory-p probe) (not (string= current "./"))) - (icomplete-force-complete) - (icomplete-force-complete-and-exit)))) + (cond ((and probe (file-directory-p probe) (not (string= current "./"))) + (icomplete-force-complete)) + (current + (icomplete-force-complete-and-exit)) + (t + (exit-minibuffer))))) (defun icomplete-magic-ido-backward-updir () "Delete char before or go up directory, like `ido-mode'." @@ -330,6 +332,7 @@ more like `ido-mode' than regular `icomplete-mode'." (remove-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup) (remove-hook 'minibuffer-setup-hook #'icomplete--fido-mode-setup) (when fido-mode + (icomplete-mode -1) (setq icomplete-mode t) (add-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup) (add-hook 'minibuffer-setup-hook #'icomplete--fido-mode-setup))) @@ -355,6 +358,7 @@ completions: (remove-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup) (remove-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup) (when icomplete-mode + (fido-mode -1) (when icomplete-in-buffer (add-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup)) (add-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup)))