;;; find-files.el ;;; ;;; Copyright (C) 1998, 2000, 2003, 2004, 2007, 2008 Thien-Thi Nguyen ;;; ;;; This file is part of ttn's personal elisp library, released under ;;; the terms of the GNU General Public License as published by the ;;; Free Software Foundation; either version 3, or (at your option) any ;;; later version. There is NO WARRANTY. See file COPYING for details. ;;; ;;; Description: Find all files matching shell wildcards. ;;;###autoload (defun find-files (find-wildcard) "Selectively do `find-file' on find(1) output using FIND-WILDCARD. Find(1) is invoked from the current working directory. Selection is interactive: `y' or `SPC' accepts, `n' or `DEL' rejects, `.' accepts then stops, `!' accepts the rest, `q' just stops." (interactive "sCall find(1) with regexp: ") (let* ((cwd default-directory) (pre-decided nil) (same-for-rest nil) ; either 'yes or 'no (candidates (split-string (shell-command-to-string (format "find . -name '%s' -print" find-wildcard)))) (len (length candidates)) (count 0) (km (let ((km (copy-keymap minibuffer-local-map))) (define-key km "y" (lambda () (interactive) (insert "y") (exit-minibuffer))) (define-key km " " (lambda () (interactive) (insert "y") (exit-minibuffer))) (define-key km "n" (lambda () (interactive) (insert "n") (exit-minibuffer))) (define-key km "\C-?" (lambda () (interactive) (insert "n") (exit-minibuffer))) (define-key km "." (lambda () (interactive) (insert "s") (exit-minibuffer))) (define-key km "!" (lambda () (interactive) (insert "Y") (exit-minibuffer))) (define-key km "q" (lambda () (interactive) (insert "N") (exit-minibuffer))) km))) (flet ((query (file) (or same-for-rest (read-from-minibuffer (format "[%d/%d] Find %s ? [yn.!q] " count len file) nil km))) (do-it (file) (find-file (expand-file-name file cwd))) (do-rest-as (type) (setq same-for-rest type)) (maybe (file) (setq count (1+ count)) (let ((ans (query file))) (cond ; `case' doesn't work! ((equal ans "y") (do-it file)) ((equal ans "n") nil) ((equal ans "s") (do-it file) (do-rest-as "n")) ((equal ans "Y") (do-it file) (do-rest-as "y")) ((equal ans "N") (do-rest-as "n")) (t (error "Bad input")))))) (mapcar 'maybe candidates)))) (provide 'find-files) ;;; find-files.el ends here