Mercurial > emacs
diff lisp/ido.el @ 90103:3ebd9bdb4fe5
Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-13
Merge from emacs--cvs-trunk--0
Patches applied:
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-83
- miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-89
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-90
Update from CVS: man/calc.texi: Add macro for LaTeX for info output.
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-91
- miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-94
Update from CVS
author | Miles Bader <miles@gnu.org> |
---|---|
date | Sun, 13 Feb 2005 07:19:08 +0000 |
parents | f2ebccfa87d4 aac0a33f5772 |
children | 7e3f621f1dd4 |
line wrap: on
line diff
--- a/lisp/ido.el Sun Feb 13 00:40:20 2005 +0000 +++ b/lisp/ido.el Sun Feb 13 07:19:08 2005 +0000 @@ -338,7 +338,7 @@ "Switch between files using substrings." :group 'extensions :group 'convenience - :version "21.4" + :version "22.1" :link '(emacs-commentary-link :tag "Commentary" "ido.el") :link '(emacs-library-link :tag "Lisp File" "ido.el")) @@ -410,6 +410,15 @@ :type 'boolean :group 'ido) +(defcustom ido-file-extensions-order nil + "*List of file extensions specifying preferred order of file selections. +Each element is either a string with `.' as the first char, an empty +string matching files without extension, or t which is the default order +of for files with an unlisted file extension." + :type '(repeat (choice string + (const :tag "Default order" t))) + :group 'ido) + (defcustom ido-ignore-directories '("\\`CVS/" "\\`\\.\\./" "\\`\\./") "*List of regexps or functions matching sub-directory names to ignore." @@ -2629,10 +2638,69 @@ (t nil)))) -(defun ido-sort-list (items) - ;; Simple list of file or buffer names - (sort items (lambda (a b) (string-lessp (ido-no-final-slash a) - (ido-no-final-slash b))))) +;; File list sorting + +(defun ido-file-lessp (a b) + ;; Simple compare two file names. + (string-lessp (ido-no-final-slash a) (ido-no-final-slash b))) + + +(defun ido-file-extension-lessp (a b) + ;; Compare file names according to ido-file-extensions-order list. + (let ((n (compare-strings a 0 nil b 0 nil nil)) + lessp p) + (if (eq n t) + nil + (if (< n 0) + (setq n (1- (- n)) + p a a b b p + lessp t) + (setq n (1- n))) + (cond + ((= n 0) + lessp) + ((= (aref a n) ?.) + (ido-file-extension-aux a b n lessp)) + (t + (while (and (> n 2) (/= (aref a n) ?.)) + (setq n (1- n))) + (if (> n 1) + (ido-file-extension-aux a b n lessp) + lessp)))))) + +(defun ido-file-extension-aux (a b n lessp) + (let ((oa (ido-file-extension-order a n)) + (ob (ido-file-extension-order b n))) + (cond + ((= oa ob) + lessp) + ((and oa ob) + (if lessp + (> oa ob) + (< oa ob))) + (oa + (not lessp)) + (ob + lessp) + (t + lessp)))) + +(defun ido-file-extension-order (s n) + (let ((l ido-file-extensions-order) + (i 0) o do) + (while l + (cond + ((eq (car l) t) + (setq do i + l (cdr l))) + ((eq (compare-strings s n nil (car l) 0 nil nil) t) + (setq o i + l nil)) + (t + (setq l (cdr l)))) + (setq i (1+ i))) + (or o do))) + (defun ido-sort-merged-list (items promote) ;; Input is list of ("file" . "dir") cons cells. @@ -2905,7 +2973,10 @@ ;; created to allow the user to further modify the order of the file names ;; in this list. (let ((ido-temp-list (ido-make-file-list1 ido-current-directory))) - (setq ido-temp-list (ido-sort-list ido-temp-list)) + (setq ido-temp-list (sort ido-temp-list + (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 @@ -2954,7 +3025,7 @@ ;; created to allow the user to further modify the order of the ;; directory names in this list. (let ((ido-temp-list (ido-make-dir-list1 ido-current-directory))) - (setq ido-temp-list (ido-sort-list ido-temp-list)) + (setq ido-temp-list (sort ido-temp-list #'ido-file-lessp)) (ido-to-end ;; move . files to end (delq nil (mapcar (lambda (x) (if (string-equal (substring x 0 1) ".") x)) @@ -3184,14 +3255,15 @@ (setq display-it t)) (if display-it (with-output-to-temp-buffer ido-completion-buffer - (let ((completion-list (ido-sort-list + (let ((completion-list (sort (cond (ido-use-merged-list (ido-flatten-merged-list (or ido-matches ido-cur-list))) ((or full-list ido-completion-buffer-all-completions) (ido-all-completions)) (t - (copy-sequence (or ido-matches ido-cur-list))))))) + (copy-sequence (or ido-matches ido-cur-list)))) + #'ido-file-lessp))) (if (featurep 'xemacs) ;; XEmacs extents are put on by default, doesn't seem to be ;; any way of switching them off.