]> code.delx.au - gnu-emacs/blobdiff - lisp/ido.el
Merged from emacs@sv.gnu.org
[gnu-emacs] / lisp / ido.el
index a6bd99cdeea25fd9a1baf0172fc5236639a8f27c..77479de04d8d1ddc2cda4a96d7f36771e4bc5028 100644 (file)
@@ -1,7 +1,7 @@
 ;;; 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:
 
@@ -716,7 +719,7 @@ ask user whether to create buffer, or 'never to never create new buffer."
   "*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)
 
@@ -898,19 +901,19 @@ The fallback command is passed as an argument to the functions."
 
 ;; 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
@@ -1345,7 +1348,7 @@ This function also adds a hook to the minibuffer."
 
   (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)
@@ -1354,12 +1357,7 @@ This function also adds a hook to the minibuffer."
 
     (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)
@@ -1379,7 +1377,13 @@ This function also adds a hook to the minibuffer."
        (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.
@@ -1404,8 +1408,8 @@ With ARG, turn ido speed-up on if arg is positive, off otherwise."
 
 
 ;;; 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)))
@@ -1431,7 +1435,7 @@ With ARG, turn ido speed-up on if arg is positive, off otherwise."
     (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)))
@@ -1457,8 +1461,8 @@ With ARG, turn ido speed-up on if arg is positive, off otherwise."
     (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)))
@@ -1467,19 +1471,19 @@ With ARG, turn ido speed-up on if arg is positive, off otherwise."
     (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.
@@ -1500,18 +1504,18 @@ With ARG, turn ido speed-up on if arg is positive, off otherwise."
        (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.
@@ -1683,7 +1687,7 @@ If INITIAL is non-nil, it specifies the initial input string."
        (ido-enable-regexp ido-enable-regexp)
        )
 
-    (ido-define-mode-map)
+    (ido-setup-completion-map)
     (setq ido-text-init initial)
     (setq ido-input-stack nil)
 
@@ -1788,7 +1792,8 @@ If INITIAL is non-nil, it specifies the initial input string."
       (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)
@@ -2017,9 +2022,10 @@ If INITIAL is non-nil, it specifies the initial input string."
        (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
@@ -2220,9 +2226,10 @@ If INITIAL is non-nil, it specifies the initial input string."
         (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)
@@ -3670,7 +3677,7 @@ As you type in a string, all of the buffers matching the string are
 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.
@@ -3758,7 +3765,7 @@ type in a string, all of the filenames matching the string are displayed
 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.