ido

Homepage: https://www.gnu.org/software/emacs

Author: Kim F. Storm

Summary

Interactively do things with buffers and files

Commentary

Ido - interactive do - switches between buffers and opens files and
directories with a minimum of keystrokes.  It is a superset of
iswitchb, the interactive buffer switching package by Stephen Eglen.

Interactive substring matching
------------------------------

As you type in a substring, the list of buffers or files currently
matching the substring are displayed as you type.  The list is
ordered so that the most recent buffers or files visited come at
the start of the list.

The buffer or file at the start of the list will be the one visited
when you press RETURN.  By typing more of the substring, the list is
narrowed down so that gradually the buffer or file you want will be
at the top of the list.  Alternatively, you can use C-s and C-r (or
the right and left arrow keys) to rotate buffer or file names in the
list until the one you want is at the top of the list.

Completion is also available so that you can see what is common to
all of the matching buffers or files as you type.

Example:

If I have two buffers called "123456" and "123", with "123456" the
most recent, when I use ido-switch-buffer, I first of all get
presented with the list of all the buffers

      Buffer: {123456 | 123}

If I then press 2:
      Buffer: 2[3]{123456 | 123}

The list in {...} are the matching buffers, most recent first
(buffers visible in the current frame are put at the end of the
list by default).  At any time I can select the item at the head of
the list by pressing RET.  I can also put the first element at the
end of the list by pressing C-s or [right], or bring the last
element to the head of the list by pressing C-r or [left].

The item in [...] indicates what can be added to my input by
pressing TAB.  In this case, I will get "3" added to my input.

So, I press TAB:
	 Buffer: 23{123456 | 123}

At this point, I still have two matching buffers.
If I want the first buffer in the list, I simply press RET.  If I
wanted the second in the list, I could press C-s to move it to the
top of the list and then RET to select it.

However, if I type 4, I only have one match left:
      Buffer: 234[123456]

Since there is only one matching buffer left, it is given in [] and
it is shown in the `ido-only-match' face (ForestGreen).  I can now
press TAB or RET to go to that buffer.

If I want to create a new buffer named "234", I press C-j instead of
TAB or RET.

If instead, I type "a":
      Buffer: 234a [No match]
There are no matching buffers.  If I press RET or TAB, I can be
prompted to create a new buffer called "234a".

Of course, where this function comes in really useful is when you
can specify the buffer using only a few keystrokes.  In the above
example, the quickest way to get to the "123456" file would be
just to type 4 and then RET (assuming there isn't any newer buffer
with 4 in its name).

Likewise, if you use C-x C-f (ido-find-file), the list of files and
directories in the current directory is provided in the same
fashion as the buffers above.  The files and directories are
normally sorted in alphabetical order, but the most recently
visited directory is placed first to speed up navigating to
directories that you have visited recently.

In addition to scrolling through the list using [right] and [left],
you can use [up] and [down] to quickly scroll the list to the next
or previous subdirectory.

To go down into a subdirectory, and continue the file selection on
the files in that directory, simply move the directory to the head
of the list and hit RET.

To go up to the parent directory, delete any partial file name
already specified (e.g. using [backspace]) and hit [backspace].

To go to the root directory (on the current drive), enter two
slashes.  On MS-DOS or Windows, to select the root of another
drive, enter X:/ where X is the drive letter.  You can also visit
files on other hosts using the ange-ftp notations `/host:' and
`/user@host:'.  See the variable `ido-slow-ftp-hosts' if you want
to inhibit the ido substring matching for ftp access.

If for some reason you cannot specify the proper file using
ido-find-file, you can press C-f to enter the normal find-file.
You can also press C-b to drop into ido-switch-buffer.

See the doc string of ido-switch-buffer and ido-find-file for full
keybindings and features.
 (describe-function 'ido-find-file)

Hidden buffers and files
------------------------

Normally, ido does not include hidden buffers (whose name starts
with a space) and hidden files and directories (whose name starts
with `.') in the list of possible completions.  However, if the
substring you enter does not match any of the visible buffers or
files, ido will automatically look for completions among the hidden
buffers or files.

You can toggle display of the hidden buffers and files with C-a.

Additional functionality
------------------------

After C-x b, the buffer at the head of the list can be killed by
pressing C-k.  If the buffer needs saving, you will be queried
before the buffer is killed.

Likewise, after C-x C-f, you can delete (i.e. physically remove)
the file at the head of the list with C-k.  You will always be
asked for confirmation before the file is deleted.

If you enter C-x b to switch to a buffer visiting a given file, and
you find that the file you are after is not in any buffer, you can
press C-f to immediately drop into ido-find-file.  And you can
switch back to buffer selection with C-b.

Prefix matching
---------------

The standard way of completion with Unix-shells and Emacs is to insert a
PREFIX and then hitting TAB (or another completion key).  Cause of this
behavior has become second nature to a lot of Emacs users, Ido offers in
addition to the default substring-matching-method (look above) also the
prefix-matching-method.  The kind of matching is the only difference to
the description of the substring-matching above.

You can toggle prefix matching with C-p.

Example:

If you have again two Buffers "123456" and "123" then hitting "2" does
not match because "2" is not a PREFIX in any of the buffer-names.

Flexible matching
-----------------

If you set ido-enable-flex-matching, ido will do a more flexible
matching (unless regexp matching is active) to find possible matches
among the available buffer or file names if no matches are found using
the normal prefix or substring matching.

The flexible matching implies that any item which simply contains all
of the entered characters in the specified sequence will match.

Example:

If you have four files "alpha", "beta", "gamma", and "delta",
entering "aa" will match "alpha" and "gamma", while "ea" matches
"beta" and "delta".  If prefix matching is also active, "aa" only
matches "alpha", while "ea" does not match any files.

Regexp matching
---------------

There is limited provision for regexp matching within ido,
enabled through `ido-enable-regexp' (toggle with C-t).
This allows you to type `[ch]$' for example and see all file names
ending in `c' or `h'.

Note: ido-style completion is inhibited when you enable regexp matching.


Customization
-------------

Customize the Ido group to change the Ido functionality.

To modify the keybindings, use `define-key' on
`ido-common-completion-map' or one of the specialized keymaps:
`ido-file-dir-completion-map', `ido-file-completion-map' or
`ido-buffer-completion-map'.

(with-eval-after-load 'ido
  (define-key ido-common-completion-map " " 'ido-next-match))

Seeing all the matching buffers or files
----------------------------------------

If you have many matching files, they may not all fit onto one
line of the minibuffer.  Normally, the minibuffer window will grow
to show you more of the matching files (depending on the setting
of the variables `resize-mini-windows' and `max-mini-window-height').
If you want ido to behave differently from the default minibuffer
resizing behavior, set the variable `ido-max-window-height'.

Also, to improve the responsiveness of ido, the maximum number of
matching items is limited to 12, but you can increase or removed
this limit via the `ido-max-prospects' variable.

To see a full list of all matching buffers in a separate buffer,
hit ? or press TAB when there are no further completions to the
substring.  Repeated TAB presses will scroll you through this
separate buffer.

Changing the list of files
--------------------------

By default, the list of current files is most recent first,
oldest last, with the exception that the files visible in the
current frame are put at the end of the list.  A hook exists to
allow other functions to order the list.  For example, if you add:

(add-hook 'ido-make-buffer-list-hook #'ido-summary-buffers-to-end)

then all files matching "Summary" are moved to the end of the
list.  (I find this handy for keeping the INBOX Summary and so on
out of the way.)  It also moves files matching "output\*$" to the
end of the list (these are created by AUCTeX when compiling.)
Other functions could be made available which alter the list of
matching files (either deleting or rearranging elements.)

Highlighting
------------

The highlighting of matching items is controlled via ido-use-faces.
The faces used are ido-first-match, ido-only-match and
ido-subdir.
Coloring of the matching item was suggested by
Carsten Dominik (dominik@strw.leidenuniv.nl).

Replacement for read-buffer and read-file-name
----------------------------------------------

ido-read-buffer and ido-read-file-name have been written to be drop
in replacements for the normal buffer and file name reading
functions `read-buffer' and `read-file-name'.

To use ido for all buffer and file selections in Emacs, customize the
variable `ido-everywhere'.

Using ido-like behavior in other Lisp packages
-----------------------------------------------

If you don't want to rely on the `ido-everywhere' functionality,
ido-read-buffer, ido-read-file-name, and ido-read-directory-name
can be used by other packages to read a buffer name, a file name,
or a directory name in the Ido way.

Acknowledgments

Infinite amounts of gratitude goes to Stephen Eglen 
who wrote iswitch-buffer mode - from which I ripped off 99% of the code
for ido-switch-buffer and found the inspiration for ido-find-file.
The ido package would never have existed without his work.

Also thanks to Klaus Berndl, Rohit Namjoshi, Robert Fenk, Alex
Schroeder, Bill Benedetto, Stephen Eglen, and many others for bug
fixes and improvements.

History

Since I discovered Stephen Eglen's excellent iswitchb package, I just
couldn't live without it, but once being addicted to switching buffers
with a minimum of keystrokes, I soon found that opening files in the
old-fashioned way was just too slow - so I decided to write a package
which could open files with the same speed and ease as iswitchb could
switch buffers.

I originally wrote a separate ifindf.el package based on a copy of
iswitchb.el, which did for opening files what iswitchb did for
switching buffers.  Along the way, I corrected a few errors in
ifindf which could have found its way back into iswitchb, but since
most of the functionality of the two package was practically
identical, I decided that the proper thing to do was to merge my
ifindf package back into iswitchb.

This is basically what ido (interactively do) is all about; but I
found it awkward to merge my changes into the "iswitchb-" namespace,
so I invented a common "ido-" namespace for the merged packages.

This version is based on ido.el version 1.57 released on
gnu.emacs.sources adapted for Emacs 22.1 to use command remapping
and optionally hooking the read-buffer and read-file-name functions.

Prefix matching was added by Klaus Berndl  based on
an idea of Yuji Minejima  and his mcomplete-package.

Dependencies

Reverse dependencies