;;; ido.el --- interactively do things with buffers and files.
;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-;; 2004, 2005 Free Software Foundation, Inc.
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Kim F. Storm <storm@cua.dk>
;; Based on: iswitchb by Stephen Eglen <stephen@cns.ed.ac.uk>
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
-;;; Acknowledgements
-
-;; Infinite amounts of gratitude goes to Stephen Eglen <stephen@cns.ed.ac.uk>
-;; 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 ackward 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 <klaus.berndl@sdm.de> based on
-;; an idea of Yuji Minejima <ggb01164@nifty.ne.jp> and his mcomplete-package.
-
;;; Commentary:
;; most recent, when I use ido-switch-buffer, I first of all get
;; presented with the list of all the buffers
;;
-;; Buffer: {123456,123}
+;; Buffer: {123456 | 123}
;;
;; If I then press 2:
-;; Buffer: 2[3]{123456,123}
+;; 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
;; pressing TAB. In this case, I will get "3" added to my input.
;; So, I press TAB:
-;; Buffer: 23{123456,123}
+;; 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
;; top of the list and then RET to select it.
;;
;; However, if I type 4, I only have one match left:
-;; Buffer: 234[123456] [Matched]
+;; Buffer: 234[123456]
;;
-;; Since there is only one matching buffer left, it is given in [] and we
-;; see the text [Matched] afterwards. I can now press TAB or RET to go
-;; to that buffer.
+;; 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 however, I now type "a":
+;; 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".
;;
;;(defun ido-my-keys ()
;; "Add my keybindings for ido."
-;; (define-key ido-mode-map " " 'ido-next-match)
+;; (define-key ido-completion-map " " 'ido-next-match)
;; )
;; Seeing all the matching buffers or files
;; can be used by other packages to read a buffer name, a file name,
;; or a directory name in the `ido' way.
+;;; Acknowledgements
+
+;; Infinite amounts of gratitude goes to Stephen Eglen <stephen@cns.ed.ac.uk>
+;; 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 ackward 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 <klaus.berndl@sdm.de> based on
+;; an idea of Yuji Minejima <ggb01164@nifty.ne.jp> and his mcomplete-package.
+
;;; Code:
"*Hook run after the ido variables and keymap have been setup.
The dynamic variable `ido-cur-item' contains the current type of item that
is read by ido, possible values are file, dir, buffer, and list.
-Additional keys can be defined in `ido-mode-map'."
+Additional keys can be defined in `ido-completion-map'."
:type 'hook
:group 'ido)
;; Persistent variables
-(defvar ido-mode-map nil
+(defvar ido-completion-map nil
"Currently active keymap for ido commands.")
-(defvar ido-mode-common-map nil
+(defvar ido-common-completion-map nil
"Keymap for all ido commands.")
-(defvar ido-mode-file-map nil
+(defvar ido-file-completion-map nil
"Keymap for ido file commands.")
-(defvar ido-mode-file-dir-map nil
+(defvar ido-file-dir-completion-map nil
"Keymap for ido file and directory commands.")
-(defvar ido-mode-buffer-map nil
+(defvar ido-buffer-completion-map nil
"Keymap for ido buffer commands.")
(defvar ido-file-history nil
(ido-everywhere (if ido-everywhere 1 -1))
(when ido-mode
- (ido-init-mode-maps))
+ (ido-init-completion-maps))
(when ido-mode
(add-hook 'minibuffer-setup-hook 'ido-minibuffer-setup)
(add-hook 'kill-emacs-hook 'ido-kill-emacs-hook)
- (if ido-minor-mode-map-entry
- (setcdr ido-minor-mode-map-entry (make-sparse-keymap))
- (setq ido-minor-mode-map-entry (cons 'ido-mode (make-sparse-keymap)))
- (add-to-list 'minor-mode-map-alist ido-minor-mode-map-entry))
-
- (let ((map (cdr ido-minor-mode-map-entry)))
+ (let ((map (make-sparse-keymap)))
(when (memq ido-mode '(file both))
(define-key map [remap find-file] 'ido-find-file)
(define-key map [remap find-file-read-only] 'ido-find-file-read-only)
(define-key map [remap switch-to-buffer-other-frame] 'ido-switch-buffer-other-frame)
(define-key map [remap insert-buffer] 'ido-insert-buffer)
(define-key map [remap kill-buffer] 'ido-kill-buffer)
- (define-key map [remap display-buffer] 'ido-display-buffer)))))
+ (define-key map [remap display-buffer] 'ido-display-buffer))
+
+ (if ido-minor-mode-map-entry
+ (setcdr ido-minor-mode-map-entry map)
+ (setq ido-minor-mode-map-entry (cons 'ido-mode map))
+ (add-to-list 'minor-mode-map-alist ido-minor-mode-map-entry)))))
+
(defun ido-everywhere (arg)
"Toggle using ido speed-ups everywhere file and directory names are read.
;;; IDO KEYMAP
-(defun ido-init-mode-maps ()
- "Set up the keymaps used by `ido'."
+(defun ido-init-completion-maps ()
+ "Set up the completion keymaps used by `ido'."
;; Common map
(let ((map (make-sparse-keymap)))
(define-key map "\C-f" 'ido-magic-forward-char)
(define-key map "\C-d" 'ido-magic-delete-char)
(set-keymap-parent map minibuffer-local-map)
- (setq ido-mode-common-map map))
+ (setq ido-common-completion-map map))
;; File and directory map
(let ((map (make-sparse-keymap)))
(define-key map [(meta control ?o)] 'ido-next-work-file)
(define-key map [(meta ?p)] 'ido-prev-work-directory)
(define-key map [(meta ?s)] 'ido-merge-work-directories)
- (set-keymap-parent map ido-mode-common-map)
- (setq ido-mode-file-dir-map map))
+ (set-keymap-parent map ido-common-completion-map)
+ (setq ido-file-dir-completion-map map))
;; File only map
(let ((map (make-sparse-keymap)))
(define-key map "\C-w" 'ido-copy-current-file-name)
(define-key map [(meta ?l)] 'ido-toggle-literal)
(define-key map "\C-v" 'ido-toggle-vc)
- (set-keymap-parent map ido-mode-file-dir-map)
- (setq ido-mode-file-map map))
+ (set-keymap-parent map ido-file-dir-completion-map)
+ (setq ido-file-completion-map map))
;; Buffer map
(let ((map (make-sparse-keymap)))
(define-key map "\C-x\C-f" 'ido-enter-find-file)
(define-key map "\C-x\C-b" 'ido-fallback-command)
(define-key map "\C-k" 'ido-kill-buffer-at-head)
- (set-keymap-parent map ido-mode-common-map)
- (setq ido-mode-buffer-map map)))
+ (set-keymap-parent map ido-common-completion-map)
+ (setq ido-buffer-completion-map map)))
-(defun ido-define-mode-map ()
+(defun ido-setup-completion-map ()
"Set up the keymap for `ido'."
;; generated every time so that it can inherit new functions.
(define-key map [remap viper-delete-backward-word] 'ido-delete-backward-word-updir))
(set-keymap-parent map
(if (eq ido-cur-item 'file)
- ido-mode-file-map
- ido-mode-file-dir-map)))
+ ido-file-completion-map
+ ido-file-dir-completion-map)))
((eq ido-cur-item 'buffer)
(when ido-context-switch-command
(define-key map "\C-x\C-f" ido-context-switch-command))
- (set-keymap-parent map ido-mode-buffer-map))
+ (set-keymap-parent map ido-buffer-completion-map))
(t
- (set-keymap-parent map ido-mode-common-map)))
+ (set-keymap-parent map ido-common-completion-map)))
- (setq ido-mode-map map)))
+ (setq ido-completion-map map)))
(defun ido-final-slash (dir &optional fix-it)
;; return DIR if DIR has final slash.
(ido-enable-regexp ido-enable-regexp)
)
- (ido-define-mode-map)
+ (ido-setup-completion-map)
(setq ido-text-init initial)
(setq ido-input-stack nil)
(if (and ido-matches (eq ido-try-merged-list 'auto))
(setq ido-try-merged-list t))
(let
- ((minibuffer-local-completion-map ido-mode-map)
+ ((minibuffer-local-completion-map ido-completion-map)
+ (minibuffer-local-filename-completion-map ido-completion-map)
(max-mini-window-height (or ido-max-window-height
(and (boundp 'max-mini-window-height) max-mini-window-height)))
(ido-completing-read t)
(if (eq method 'insert)
(progn
(ido-record-command 'insert-buffer buf)
- (with-no-warnings
- ;; we really want to run insert-buffer here
- (insert-buffer buf)))
+ (push-mark
+ (save-excursion
+ (insert-buffer-substring (get-buffer buf))
+ (point))))
(ido-visit-buffer buf method t)))
;; buffer doesn't exist
(if ido-find-literal 'insert-file-literally 'insert-file)
filename)
(ido-record-work-directory)
- (if ido-find-literal
- (insert-file-contents-literally filename)
- (insert-file-contents filename)))
+ (insert-file-1 filename
+ (if ido-find-literal
+ #'insert-file-contents-literally
+ #'insert-file-contents)))
(filename
(ido-record-work-file filename)
displayed if substring-matching is used \(default). Look at
`ido-enable-prefix' and `ido-toggle-prefix'. When you have found the
buffer you want, it can then be selected. As you type, most keys have
-their normal keybindings, except for the following: \\<ido-mode-buffer-map>
+their normal keybindings, except for the following: \\<ido-buffer-completion-map>
RET Select the buffer at the front of the list of matches. If the
list is empty, possibly prompt to create new buffer.
if substring-matching is used \(default). Look at `ido-enable-prefix' and
`ido-toggle-prefix'. When you have found the filename you want, it can
then be selected. As you type, most keys have their normal keybindings,
-except for the following: \\<ido-mode-file-map>
+except for the following: \\<ido-file-completion-map>
RET Select the file at the front of the list of matches. If the
list is empty, possibly prompt to create new file.