X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/83a12f3a553d0e11884dc8c07c876d330b58ff28..36b98f827848d2b1ece6aee7a372902e78120e98:/lisp/ido.el diff --git a/lisp/ido.el b/lisp/ido.el index f1fbb4cdbd..77479de04d 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -1,6 +1,7 @@ ;;; ido.el --- interactively do things with buffers and files. -;; Copyright (C) 1996-2004, 2005 Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +;; 2004, 2005, 2006 Free Software Foundation, Inc. ;; Author: Kim F. Storm ;; Based on: iswitchb by Stephen Eglen @@ -23,45 +24,6 @@ ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. -;;; Acknowledgements - -;; 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 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 based on -;; an idea of Yuji Minejima and his mcomplete-package. - ;;; Commentary: @@ -93,10 +55,10 @@ ;; 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 @@ -109,7 +71,7 @@ ;; 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 @@ -117,13 +79,16 @@ ;; 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". @@ -251,7 +216,7 @@ ;; ;;(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 @@ -317,11 +282,52 @@ ;; 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 +;; 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 based on +;; an idea of Yuji Minejima and his mcomplete-package. + ;;; Code: (provide 'ido) +(defvar cua-inhibit-cua-keys) + ;;; User Variables ;; ;; These are some things you might want to change. @@ -351,7 +357,7 @@ Setting this variable directly does not take effect; use either \\[customize] or the function `ido-mode'." :set #'(lambda (symbol value) (ido-mode value)) - :initialize 'custom-initialize-default + :initialize 'custom-initialize-set :require 'ido :link '(emacs-commentary-link "ido.el") :set-after '(ido-save-directory-list-file) @@ -366,7 +372,7 @@ use either \\[customize] or the function `ido-mode'." Setting this variable directly does not work. Use `customize' or call the function `ido-everywhere'." :set #'(lambda (symbol value) - (ido-everywhere value)) + (ido-everywhere (if value 1 -1))) :initialize 'custom-initialize-default :type 'boolean :group 'ido) @@ -687,12 +693,17 @@ not provide the normal completion. To show the completions, use C-a." :type 'boolean :group 'ido) -(defcustom ido-enter-single-matching-directory 'slash - "*Automatically enter sub-directory if it is the only matching item, if non-nil. -If value is 'slash, only enter if typing final slash, else do it always." +(defcustom ido-enter-matching-directory 'only + "*Additional methods to enter sub-directory of first/only matching item. +If value is 'first, enter first matching sub-directory when typing a slash. +If value is 'only, typing a slash only enters the sub-directory if it is +the only matching item. +If value is t, automatically enter a sub-directory when it is the only +matching item, even without typing a slash." :type '(choice (const :tag "Never" nil) - (const :tag "When typing /" slash) - (other :tag "Always" t)) + (const :tag "Slash enters first directory" first) + (const :tag "Slash enters first and only directory" only) + (other :tag "Always enter unique directory" t)) :group 'ido) (defcustom ido-create-new-buffer 'prompt @@ -708,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) @@ -890,8 +901,20 @@ The fallback command is passed as an argument to the functions." ;; Persistent variables -(defvar ido-mode-map nil - "Keymap for `ido-find-file' and `ido-switch-buffer'.") +(defvar ido-completion-map nil + "Currently active keymap for ido commands.") + +(defvar ido-common-completion-map nil + "Keymap for all ido commands.") + +(defvar ido-file-completion-map nil + "Keymap for ido file commands.") + +(defvar ido-file-dir-completion-map nil + "Keymap for ido file and directory commands.") + +(defvar ido-buffer-completion-map nil + "Keymap for ido buffer commands.") (defvar ido-file-history nil "History of files selected using `ido-find-file'.") @@ -1076,9 +1099,9 @@ it doesn't interfere with other minibuffer usage.") (setq truncate-lines t))))) (defun ido-is-tramp-root (&optional dir) - (setq dir (or dir ido-current-directory)) (and ido-enable-tramp-completion - (string-match "\\`/[^/][^/]+:\\([^/:@]+@\\)?\\'" dir))) + (string-match "\\`/[^/]+[@:]\\'" + (or dir ido-current-directory)))) (defun ido-is-root-directory (&optional dir) (setq dir (or dir ido-current-directory)) @@ -1293,8 +1316,7 @@ Removes badly formatted data and ignored directories." (while e (setq d (car e) e (cdr e)) (if (not (consp d)) - (set-text-properties 0 (length d) nil d)))))) -) + (set-text-properties 0 (length d) nil d))))))) (defun ido-kill-emacs-hook () @@ -1325,6 +1347,8 @@ This function also adds a hook to the minibuffer." (t nil))) (ido-everywhere (if ido-everywhere 1 -1)) + (when ido-mode + (ido-init-completion-maps)) (when ido-mode (add-hook 'minibuffer-setup-hook 'ido-minibuffer-setup) @@ -1333,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) @@ -1358,10 +1377,17 @@ 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) - "Enable ido everywhere file and directory names are read." + "Toggle using ido speed-ups everywhere file and directory names are read. +With ARG, turn ido speed-up on if arg is positive, off otherwise." (interactive "P") (setq ido-everywhere (if arg (> (prefix-numeric-value arg) 0) @@ -1382,12 +1408,11 @@ This function also adds a hook to the minibuffer." ;;; IDO KEYMAP -(defun ido-define-mode-map () - "Set up the keymap for `ido'." - (let (map) - ;; generated every time so that it can inherit new functions. +(defun ido-init-completion-maps () + "Set up the completion keymaps used by `ido'." - (setq map (copy-keymap minibuffer-local-map)) + ;; Common map + (let ((map (make-sparse-keymap))) (define-key map "\C-a" 'ido-toggle-ignore) (define-key map "\C-c" 'ido-toggle-case) (define-key map "\C-e" 'ido-edit-input) @@ -1405,59 +1430,92 @@ This function also adds a hook to the minibuffer." (define-key map [right] 'ido-next-match) (define-key map [left] 'ido-prev-match) (define-key map "?" 'ido-completion-help) - ;; Magic commands. (define-key map "\C-b" 'ido-magic-backward-char) (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-common-completion-map map)) + + ;; File and directory map + (let ((map (make-sparse-keymap))) + (define-key map "\C-x\C-b" 'ido-enter-switch-buffer) + (define-key map "\C-x\C-f" 'ido-fallback-command) + (define-key map "\C-x\C-d" 'ido-enter-dired) + (define-key map [down] 'ido-next-match-dir) + (define-key map [up] 'ido-prev-match-dir) + (define-key map [(meta up)] 'ido-prev-work-directory) + (define-key map [(meta down)] 'ido-next-work-directory) + (define-key map [backspace] 'ido-delete-backward-updir) + (define-key map "\d" 'ido-delete-backward-updir) + (define-key map [(meta backspace)] 'ido-delete-backward-word-updir) + (define-key map [(control backspace)] 'ido-up-directory) + (define-key map "\C-l" 'ido-reread-directory) + (define-key map [(meta ?d)] 'ido-wide-find-dir-or-delete-dir) + (define-key map [(meta ?b)] 'ido-push-dir) + (define-key map [(meta ?f)] 'ido-wide-find-file-or-pop-dir) + (define-key map [(meta ?k)] 'ido-forget-work-directory) + (define-key map [(meta ?m)] 'ido-make-directory) + (define-key map [(meta ?n)] 'ido-next-work-directory) + (define-key map [(meta ?o)] 'ido-prev-work-file) + (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-common-completion-map) + (setq ido-file-dir-completion-map map)) + + ;; File only map + (let ((map (make-sparse-keymap))) + (define-key map "\C-k" 'ido-delete-file-at-head) + (define-key map "\C-o" 'ido-copy-current-word) + (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-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-common-completion-map) + (setq ido-buffer-completion-map map))) + + +(defun ido-setup-completion-map () + "Set up the keymap for `ido'." - (when (memq ido-cur-item '(file dir)) - (define-key map "\C-x\C-b" (or ido-context-switch-command 'ido-enter-switch-buffer)) - (define-key map "\C-x\C-f" 'ido-fallback-command) - (define-key map "\C-x\C-d" (or (and ido-context-switch-command 'ignore) 'ido-enter-dired)) - (define-key map [down] 'ido-next-match-dir) - (define-key map [up] 'ido-prev-match-dir) - (define-key map [(meta up)] 'ido-prev-work-directory) - (define-key map [(meta down)] 'ido-next-work-directory) - (define-key map [backspace] 'ido-delete-backward-updir) - (define-key map "\d" 'ido-delete-backward-updir) - (define-key map [(meta backspace)] 'ido-delete-backward-word-updir) - (define-key map [(control backspace)] 'ido-up-directory) - (define-key map "\C-l" 'ido-reread-directory) - (define-key map [(meta ?d)] 'ido-wide-find-dir-or-delete-dir) - (define-key map [(meta ?b)] 'ido-push-dir) - (define-key map [(meta ?f)] 'ido-wide-find-file-or-pop-dir) - (define-key map [(meta ?k)] 'ido-forget-work-directory) - (define-key map [(meta ?m)] 'ido-make-directory) - (define-key map [(meta ?n)] 'ido-next-work-directory) - (define-key map [(meta ?o)] 'ido-prev-work-file) - (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) - ) + ;; generated every time so that it can inherit new functions. + (let ((map (make-sparse-keymap)) + (viper-p (if (boundp 'viper-mode) viper-mode))) - (when (eq ido-cur-item 'file) - (define-key map "\C-k" 'ido-delete-file-at-head) - (define-key map "\C-o" 'ido-copy-current-word) - (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) - ) + (when viper-p + (define-key map [remap viper-intercept-ESC-key] 'ignore)) - (when (eq ido-cur-item 'buffer) - (define-key map "\C-x\C-f" (or ido-context-switch-command 'ido-enter-find-file)) - (define-key map "\C-x\C-b" 'ido-fallback-command) - (define-key map "\C-k" 'ido-kill-buffer-at-head) - ) - - (when (if (boundp 'viper-mode) viper-mode) - (define-key map [remap viper-intercept-ESC-key] 'ignore) - (when (memq ido-cur-item '(file dir)) + (cond + ((memq ido-cur-item '(file dir)) + (when ido-context-switch-command + (define-key map "\C-x\C-b" ido-context-switch-command) + (define-key map "\C-x\C-d" 'ignore)) + (when viper-p (define-key map [remap viper-backward-char] 'ido-delete-backward-updir) (define-key map [remap viper-del-backward-char-in-insert] 'ido-delete-backward-updir) - (define-key map [remap viper-delete-backward-word] 'ido-delete-backward-word-updir))) + (define-key map [remap viper-delete-backward-word] 'ido-delete-backward-word-updir)) + (set-keymap-parent map + (if (eq ido-cur-item 'file) + ido-file-completion-map + ido-file-dir-completion-map))) - (setq ido-mode-map 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-buffer-completion-map)) + + (t + (set-keymap-parent map ido-common-completion-map))) + + (setq ido-completion-map map))) (defun ido-final-slash (dir &optional fix-it) ;; return DIR if DIR has final slash. @@ -1498,11 +1556,16 @@ This function also adds a hook to the minibuffer." (defun ido-set-current-directory (dir &optional subdir no-merge) ;; Set ido's current directory to DIR or DIR/SUBDIR - (setq dir (ido-final-slash dir t)) + (unless (and ido-enable-tramp-completion + (string-match "\\`/[^/]*@\\'" dir)) + (setq dir (ido-final-slash dir t))) (setq ido-use-merged-list nil ido-try-merged-list (not no-merge)) - (if subdir - (setq dir (ido-final-slash (concat dir subdir) t))) + (when subdir + (setq dir (concat dir subdir)) + (unless (and ido-enable-tramp-completion + (string-match "\\`/[^/]*@\\'" dir)) + (setq dir (ido-final-slash dir t)))) (if (equal dir ido-current-directory) nil (ido-trace "cd" dir) @@ -1624,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) @@ -1729,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) @@ -1958,7 +2022,10 @@ If INITIAL is non-nil, it specifies the initial input string." (if (eq method 'insert) (progn (ido-record-command 'insert-buffer buf) - (insert-buffer buf)) + (push-mark + (save-excursion + (insert-buffer-substring (get-buffer buf)) + (point)))) (ido-visit-buffer buf method t))) ;; buffer doesn't exist @@ -2127,7 +2194,7 @@ If INITIAL is non-nil, it specifies the initial input string." (ido-record-command method dirname) (ido-record-work-directory) (funcall method dirname)) - ((y-or-n-p (format "Directory %s does not exist. Create it " filename)) + ((y-or-n-p (format "Directory %s does not exist. Create it? " filename)) (ido-record-command method dirname) (ido-record-work-directory dirname) (make-directory-internal dirname) @@ -2159,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) @@ -3011,11 +3079,10 @@ for first matching file." (let (res) (message "Searching for `%s'...." text) (condition-case nil - (unless (catch 'input-pending-p - (let ((throw-on-input 'input-pending-p)) - (setq res (ido-make-merged-file-list-1 text auto wide)) - t)) - (setq res 'input-pending-p)) + (if (eq t (setq res + (while-no-input + (ido-make-merged-file-list-1 text auto wide)))) + (setq res 'input-pending-p)) (quit (setq res t ido-try-merged-list nil @@ -3092,27 +3159,29 @@ for first matching file." ((ido-nonreadable-directory-p dir) '()) ;; do not check (ido-directory-too-big-p dir) here. ;; Caller must have done that if necessary. + ((and ido-enable-tramp-completion - (string-match "\\`/\\([^/:]+:\\([^/:@]+@\\)?\\)\\'" dir)) - - ;; Trick tramp's file-name-all-completions handler to DTRT, as it - ;; has some pretty obscure requirements. This seems to work... - ;; /ftp: => (f-n-a-c "/ftp:" "") - ;; /ftp:kfs: => (f-n-a-c "" "/ftp:kfs:") - ;; /ftp:kfs@ => (f-n-a-c "ftp:kfs@" "/") - ;; /ftp:kfs@kfs: => (f-n-a-c "" "/ftp:kfs@kfs:") - ;; Currently no attempt is made to handle multi: stuff. - - (let* ((prefix (match-string 1 dir)) - (user-flag (match-beginning 2)) - (len (and prefix (length prefix))) - compl) - (if user-flag - (setq dir (substring dir 1))) - (require 'tramp nil t) - (ido-trace "tramp complete" dir) - (setq compl (file-name-all-completions dir (if user-flag "/" ""))) - (if (> len 0) + (or (fboundp 'tramp-completion-mode) + (require 'tramp nil t)) + (string-match "\\`/[^/]+[:@]\\'" dir)) + ;; Strip method:user@host: part of tramp completions. + ;; Tramp completions do not include leading slash. + (let ((len (1- (length dir))) + (compl + (or (file-name-all-completions "" dir) + ;; work around bug in ange-ftp. + ;; /ftp:user@host: => nil + ;; /ftp:user@host:./ => ok + (and + (not (string= "/ftp:" dir)) + (tramp-tramp-file-p dir) + (fboundp 'tramp-ftp-file-name-p) + (funcall 'tramp-ftp-file-name-p dir) + (string-match ":\\'" dir) + (file-name-all-completions "" (concat dir "./")))))) + (if (and compl + (> (length (car compl)) len) + (string= (substring (car compl) 0 len) (substring dir 1))) (mapcar (lambda (c) (substring c len)) compl) compl))) (t @@ -3183,13 +3252,14 @@ for first matching file." (if ido-file-extensions-order #'ido-file-extension-lessp #'ido-file-lessp))) - (let ((default-directory ido-current-directory)) - (ido-to-end ;; move ftp hosts and visited files to end - (delq nil (mapcar - (lambda (x) (if (or (string-match "..:\\'" x) - (and (not (ido-final-slash x)) - (get-file-buffer x))) x)) - ido-temp-list)))) + (unless (ido-is-tramp-root ido-current-directory) + (let ((default-directory ido-current-directory)) + (ido-to-end ;; move ftp hosts and visited files to end + (delq nil (mapcar + (lambda (x) (if (or (string-match "..:\\'" x) + (and (not (ido-final-slash x)) + (get-file-buffer x))) x)) + ido-temp-list))))) (ido-to-end ;; move . files to end (delq nil (mapcar (lambda (x) (if (string-equal (substring x 0 1) ".") x)) @@ -3358,38 +3428,37 @@ for first matching file." (or (member name ido-ignore-item-temp-list) (and ido-process-ignore-lists re-list - (let ((data (match-data)) - (ext-list (and ignore-ext ido-ignore-extensions + (save-match-data + (let ((ext-list (and ignore-ext ido-ignore-extensions completion-ignored-extensions)) - ignorep nextstr - (flen (length name)) slen) - (while ext-list - (setq nextstr (car ext-list)) - (if (cond - ((stringp nextstr) - (and (>= flen (setq slen (length nextstr))) - (string-equal (substring name (- flen slen)) nextstr))) - ((fboundp nextstr) (funcall nextstr name)) - (t nil)) - (setq ignorep t - ext-list nil - re-list nil) - (setq ext-list (cdr ext-list)))) - (while re-list - (setq nextstr (car re-list)) - (if (cond - ((stringp nextstr) (string-match nextstr name)) - ((fboundp nextstr) (funcall nextstr name)) - (t nil)) - (setq ignorep t - re-list nil) - (setq re-list (cdr re-list)))) - ;; return the result - (if ignorep - (setq ido-ignored-list (cons name ido-ignored-list))) - (set-match-data data) - ignorep)))) - + (case-fold-search ido-case-fold) + ignorep nextstr + (flen (length name)) slen) + (while ext-list + (setq nextstr (car ext-list)) + (if (cond + ((stringp nextstr) + (and (>= flen (setq slen (length nextstr))) + (string-equal (substring name (- flen slen)) nextstr))) + ((fboundp nextstr) (funcall nextstr name)) + (t nil)) + (setq ignorep t + ext-list nil + re-list nil) + (setq ext-list (cdr ext-list)))) + (while re-list + (setq nextstr (car re-list)) + (if (cond + ((stringp nextstr) (string-match nextstr name)) + ((fboundp nextstr) (funcall nextstr name)) + (t nil)) + (setq ignorep t + re-list nil) + (setq re-list (cdr re-list)))) + ;; return the result + (if ignorep + (setq ido-ignored-list (cons name ido-ignored-list))) + ignorep))))) ;; Private variable used by `ido-word-matching-substring'. (defvar ido-change-word-sub) @@ -3520,7 +3589,7 @@ for first matching file." (file-exists-p file) (not (file-directory-p file)) (file-writable-p ido-current-directory) - (yes-or-no-p (concat "Delete " file " "))) + (yes-or-no-p (concat "Delete " file "? "))) (delete-file file) ;; Check if file still exists. (if (file-exists-p file) @@ -3608,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: \\ +their normal keybindings, except for the following: \\ RET Select the buffer at the front of the list of matches. If the list is empty, possibly prompt to create new buffer. @@ -3696,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: \\ +except for the following: \\ RET Select the file at the front of the list of matches. If the list is empty, possibly prompt to create new file. @@ -3715,7 +3784,7 @@ in a separate window. \\[ido-merge-work-directories] search for file in the work directory history. \\[ido-forget-work-directory] removes current directory from the work directory history. \\[ido-prev-work-file] or \\[ido-next-work-file] cycle through the work file history. -\\[ido-wide-find-file] and \\[ido-wide-find-dir] prompts and uses find to locate files or directories. +\\[ido-wide-find-file-or-pop-dir] and \\[ido-wide-find-dir-or-delete-dir] prompts and uses find to locate files or directories. \\[ido-make-directory] prompts for a directory to create in current directory. \\[ido-fallback-command] Fallback to non-ido version of current command. \\[ido-toggle-regexp] Toggle regexp searching. @@ -3990,12 +4059,13 @@ For details of keybindings, do `\\[describe-function] ido-find-file'." (ido-set-matches) (ido-trace "new " ido-matches) - (when (and ido-enter-single-matching-directory + (when (and ido-enter-matching-directory ido-matches - (null (cdr ido-matches)) + (or (eq ido-enter-matching-directory 'first) + (null (cdr ido-matches))) (ido-final-slash (car ido-matches)) (or try-single-dir-match - (eq ido-enter-single-matching-directory t))) + (eq ido-enter-matching-directory t))) (ido-trace "single match" (car ido-matches)) (ido-set-current-directory (concat ido-current-directory (car ido-matches))) @@ -4211,6 +4281,7 @@ For details of keybindings, do `\\[describe-function] ido-find-file'." (put 'dired-do-rename 'ido 'ignore) (put 'ibuffer-find-file 'ido 'find-file) +(put 'dired-other-window 'ido 'dir) ;;;###autoload (defun ido-read-buffer (prompt &optional default require-match)