comparison lisp/dired.el @ 17206:30a9faea2a54

(dired-glob-regexp): New function. (dired-buffers-for-dir): New arg FILE; if non-nil, check that it matches the wildcard pattern.
author Richard M. Stallman <rms@gnu.org>
date Sat, 22 Mar 1997 03:40:55 +0000
parents 471ce207330c
children cc5b0995866f
comparison
equal deleted inserted replaced
17205:a886f419a946 17206:30a9faea2a54
1 ;;; dired.el --- directory-browsing commands 1 ;;; dired.el --- directory-browsing commands
2 2
3 ;; Copyright (C) 1985, 86, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. 3 ;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
4 4
5 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de> 5 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
6 ;; Maintainer: FSF 6 ;; Maintainer: FSF
7 7
8 ;; This file is part of GNU Emacs. 8 ;; This file is part of GNU Emacs.
1389 ;; Enlarged by dired-advertise 1389 ;; Enlarged by dired-advertise
1390 ;; Queried by function dired-buffers-for-dir. When this detects a 1390 ;; Queried by function dired-buffers-for-dir. When this detects a
1391 ;; killed buffer, it is removed from this list. 1391 ;; killed buffer, it is removed from this list.
1392 "Alist of expanded directories and their associated dired buffers.") 1392 "Alist of expanded directories and their associated dired buffers.")
1393 1393
1394 (defun dired-buffers-for-dir (dir) 1394 (defun dired-buffers-for-dir (dir &optional file)
1395 ;; Return a list of buffers that dired DIR (top level or in-situ subdir). 1395 ;; Return a list of buffers that dired DIR (top level or in-situ subdir).
1396 ;; If FILE is non-nil, include only those whose wildcard pattern (if any)
1397 ;; matches FILE.
1396 ;; The list is in reverse order of buffer creation, most recent last. 1398 ;; The list is in reverse order of buffer creation, most recent last.
1397 ;; As a side effect, killed dired buffers for DIR are removed from 1399 ;; As a side effect, killed dired buffers for DIR are removed from
1398 ;; dired-buffers. 1400 ;; dired-buffers.
1399 (setq dir (file-name-as-directory dir)) 1401 (setq dir (file-name-as-directory dir))
1400 (let ((alist dired-buffers) result elt buf) 1402 (let ((alist dired-buffers) result elt buf pattern)
1401 (while alist 1403 (while alist
1402 (setq elt (car alist) 1404 (setq elt (car alist)
1403 buf (cdr elt)) 1405 buf (cdr elt))
1404 (if (buffer-name buf) 1406 (if (buffer-name buf)
1405 (if (dired-in-this-tree dir (car elt)) 1407 (if (dired-in-this-tree dir (car elt))
1406 (if (assoc dir (save-excursion 1408 (with-current-buffer buf
1407 (set-buffer buf) 1409 (and (assoc dir dired-subdir-alist)
1408 dired-subdir-alist)) 1410 (or (null file)
1409 (setq result (cons buf result)))) 1411 (let ((wildcards
1412 (file-name-nondirectory dired-directory)))
1413 (or (= 0 (length wildcards))
1414 (string-match (dired-glob-regexp wildcards)
1415 file))))
1416 (setq result (cons buf result)))))
1410 ;; else buffer is killed - clean up: 1417 ;; else buffer is killed - clean up:
1411 (setq dired-buffers (delq elt dired-buffers))) 1418 (setq dired-buffers (delq elt dired-buffers)))
1412 (setq alist (cdr alist))) 1419 (setq alist (cdr alist)))
1413 result)) 1420 result))
1421
1422 (defun dired-glob-regexp (pattern)
1423 "Convert glob-pattern PATTERN to a regular expression."
1424 (let ((matched-in-pattern 0) ;; How many chars of PATTERN we've handled.
1425 regexp)
1426 (while (string-match "[[?*]" pattern matched-in-pattern)
1427 (let ((op-end (match-end 0))
1428 (next-op (aref pattern (match-beginning 0))))
1429 (setq regexp (concat regexp
1430 (regexp-quote
1431 (substring pattern matched-in-pattern
1432 (match-beginning 0)))))
1433 (cond ((= next-op ??)
1434 (setq regexp (concat regexp "."))
1435 (setq matched-in-pattern op-end))
1436 ((= next-op ?\[)
1437 ;; Fails to handle ^ yet ????
1438 (let* ((set-start (match-beginning 0))
1439 (set-cont
1440 (if (= (aref pattern (1+ set-start)) ?^)
1441 (+ 3 set-start)
1442 (+ 2 set-start)))
1443 (set-end (string-match "]" pattern set-cont))
1444 (set (substring pattern set-start (1+ set-end))))
1445 (setq regexp (concat regexp set))
1446 (setq matched-in-pattern (1+ set-end))))
1447 ((= next-op ?*)
1448 (setq regexp (concat regexp ".*"))
1449 (setq matched-in-pattern op-end)))))
1450 (concat "\\`"
1451 regexp
1452 (regexp-quote
1453 (substring pattern matched-in-pattern))
1454 "\\'")))
1455
1456
1414 1457
1415 (defun dired-advertise () 1458 (defun dired-advertise ()
1416 ;;"Advertise in variable `dired-buffers' that we dired `default-directory'." 1459 ;;"Advertise in variable `dired-buffers' that we dired `default-directory'."
1417 ;; With wildcards we actually advertise too much. 1460 ;; With wildcards we actually advertise too much.
1418 (let ((expanded-default (expand-file-name default-directory))) 1461 (let ((expanded-default (expand-file-name default-directory)))