juha@tds.kth.se (Juha Sarlin) (10/26/89)
Below is Emacs Lisp code for my version of a searching "cd" command. It differs from other similar versions I've seen in that it does not change the default directory of the current buffer, but instead creates a buffer in dired-mode for the directory. There are two versions; one that reads in the directory list and one that doesn't. The latter can be useful because the reading is usually rather slow. -------------------- find-dir.el -------------------- ;; Find directory using cd-path. ;; Copyright (C) 1989 Juha Sarlin <juha@tds.kth.se> ;; This file is an unofficial part of GNU Emacs. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY. No author or distributor ;; accepts responsibility to anyone for the consequences of using it ;; or for whether it serves any particular purpose or works at all, ;; unless he says so in writing. Refer to the GNU Emacs General Public ;; License for full details. ;; Everyone is granted permission to copy, modify and redistribute ;; GNU Emacs, but only under the conditions described in the ;; GNU Emacs General Public License. A copy of this license is ;; supposed to have been given to you along with GNU Emacs so you ;; can know your rights and responsibilities. It should be in a ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. ;; To use this you can for example add the following lines to your .emacs file: ;; (autoload 'find-directory-noread "find-dir" nil t) ;; (global-set-key "\C-C\C-D" 'find-directory-noread) ;; If you prefer to read in the directory list by default use this instead: ;; (autoload 'find-directory "find-dir" nil t) ;; (global-set-key "\C-C\C-D" 'find-directory) ;; ;; To define the search path you can either define the environment ;; variable CDPATH before starting emacs. In bash, for example: ;; export CDPATH=.:/usr/gnu:/usr/local/src ;; Or you can define cd-path in your .emacs file: ;; (setq cd-path '(nil "/usr/gnu" "/usr/local/src")) ;; Note the use of nil instead of ".". This is explained in the ;; documentation for cd-path below. (defvar cd-path nil "*List of directories to search through in dir-search. Use nil instead of \".\", because expand-file-name doesn't expand \".\" into an absolute path name. If you don't set this variable yourself, its initialized from the CDPATH environment variable.") (defun substring-list (regexp string) "Return list of substrings matched by REGEXP in STRING." (let (list) (string-match "" "") ;initialize match-end to 0 (while (and (string-match regexp string (match-end 0)) ;; avoid infinite looping when the match is an empty string (/= (match-beginning 0) (match-end 0))) (setq list (cons (substring string (match-beginning 0) (match-end 0)) list))) (nreverse list))) (defun dir-search (dir) "Search for DIR in the directories listed in cd-path. If cd-path is nil, its initialized from a colon separated list of directories in the CDPATH environment variable. Returns directory name if one was found, else nil." (if (not cd-path) ;; Parse CDPATH and change "." to nil. (setq cd-path (mapcar '(lambda (name) (if (string-equal name ".") nil name)) (substring-list "[^:]+" (or (getenv "CDPATH") ""))))) (if (string-equal dir "") ; Empty string means home directory (expand-file-name "~") (let ((path cd-path) name found) (while (and (not found) path) (setq name (expand-file-name dir (car path))) (if (file-directory-p name) (setq found name)) (setq path (cdr path))) found))) (defun find-directory-noread (dir) "Search for DIR in the directories listed in cd-path. If found, switch to a buffer in dired-mode for that directory. The directory list is not read in by default; you can read it with the normal dired-mode commands." (interactive "sFind directory: ") (require 'dired) (let ((dirname (dir-search dir))) (if dirname (progn (setq dirname (file-name-as-directory dirname)) (switch-to-buffer (dired-find-buffer dirname)) (dired-mode dirname)) (error "Directory %s not found" dir)))) (defun find-directory (dir) "Search for DIR in the directories listed in cd-path. If found, switch to a buffer in dired-mode for that directory." (interactive "sFind directory: ") (find-directory-noread dir) (dired-revert)) -- Juha Sarlin juha@tds.kth.se