comparison lisp/efs/fn-handler.el @ 98:0d2f883870bc r20-1b1

Import from CVS: tag r20-1b1
author cvs
date Mon, 13 Aug 2007 09:13:56 +0200
parents 8fc7fe29b841
children
comparison
equal deleted inserted replaced
97:498bf5da1c90 98:0d2f883870bc
1 ;; -*-Emacs-Lisp-*-
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;;
4 ;; File: fn-handler.el
5 ;; Description: enhanced file-name-handler-alist support for pre-19.23 Emacs
6 ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it>
7 ;; Created: Sat Mar 19 00:50:10 1994 by sandy on ibm550
8 ;; Modified: Tue Sep 13 20:59:19 1994 by sandy on ibm550
9 ;; Language: Emacs-Lisp
10 ;;
11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
13
14 ;;; One of the problems with the file-name-handler-alist, is that when
15 ;;; a handler gets called, and it has nothing to do for that function,
16 ;;; the usual procedure is to remove the handler from the alist, and
17 ;;; re-call the function. This is necessary to avoid an infinite
18 ;;; recursion. However, if the function calling
19 ;;; find-file-name-handler is not a primitive, there may be other lisp
20 ;;; functions inside of it for which the handler does have some
21 ;;; special actions specified. They won't run, because the let-bound
22 ;;; value of file-name-handler-alist doesn't contain the handler.
23 ;;;
24 ;;; This problem was solved in Emacs 19.23 with the variables
25 ;;; inhibit-file-name-handlers and inhibit-file-name-operation
26 ;;; This file provides this solution to older versions of emacs.
27
28
29 (provide 'fn-handler)
30 (require 'efs-ovwrt)
31
32 (or (boundp 'file-name-handler-alist)
33 (defvar file-name-handler-alist nil
34 "Association list of regexps for special file names and handlers."))
35
36 (defvar inhibit-file-name-handlers nil
37 "List of handlers \(symbols\) to be avoided by `find-file-name-handler'.")
38
39 (defvar inhibit-file-name-operation nil
40 "Defines to which operation `inhibit-file-name-handlers applies'
41 Must be a synbol.")
42
43 (defun find-file-name-handler (filename &optional operation)
44 "Return FILENAME1's handler function, if its syntax is handled specially.
45 Does not return handlers in `inhibit-file-name-handlers' list.
46 If there is no handler for FILENAME1, searches for one for FILENAME2.
47 Returns nil, if there is no handler for either file name.
48 A file name is handles specially if one of the regular expressions in
49 `file-name-handler-alist' matches it."
50 (let ((match-data (match-data)))
51 (unwind-protect
52 (catch 'handler
53 (mapcar (function
54 (lambda (x)
55 (and
56 (not
57 (and
58 (or (null operation)
59 (eq operation inhibit-file-name-operation))
60 (memq (cdr x) inhibit-file-name-handlers)))
61 (string-match (car x) filename)
62 (throw 'handler (cdr x)))))
63 file-name-handler-alist)
64 nil)
65 (store-match-data match-data))))
66
67 ;;; Overloads to supply the file-name-handler-alist
68
69 (defun fn-handler-insert-file-contents (filename &optional visit &rest args)
70 "Documented as original."
71 (let* ((filename (expand-file-name filename))
72 (handler (find-file-name-handler filename 'insert-file-contents)))
73 (if handler
74 (apply handler 'insert-file-contents filename visit args)
75 (let (file-name-handler-alist)
76 (apply 'fn-handler-real-insert-file-contents filename visit args)))))
77
78 (efs-overwrite-fn "fn-handler" 'insert-file-contents
79 'fn-handler-insert-file-contents)
80
81 (defun fn-handler-directory-files (directory &optional full match &rest nosort)
82 "Documented as original."
83 (let ((handler (find-file-name-handler directory 'directory-files)))
84 (if handler
85 (apply handler 'directory-files directory full match nosort)
86 (let (file-name-handler-alist)
87 (apply 'fn-handler-real-directory-files
88 directory full match nosort)))))
89
90 (efs-overwrite-fn "fn-handler" 'directory-files 'fn-handler-directory-files)
91
92 (defun fn-handler-list-directory (dirname &optional verbose)
93 "Documented as original."
94 (interactive (let ((pfx current-prefix-arg))
95 (list (read-file-name (if pfx "List directory (verbose): "
96 "List directory (brief): ")
97 nil default-directory nil)
98 pfx)))
99 (let ((handler (find-file-name-handler dirname 'list-directory)))
100 (if handler
101 (funcall handler 'list-directory dirname verbose)
102 (let (file-name-handler-alist)
103 (fn-handler-real-list-directory dirname verbose)))))
104
105 (efs-overwrite-fn "fn-handler" 'list-directory 'fn-handler-list-directory)
106
107 (defun fn-handler-file-directory-p (filename)
108 "Documented as original."
109 (let* ((filename (expand-file-name filename))
110 (handler (find-file-name-handler filename 'file-directory-p)))
111 (if handler
112 (funcall handler 'file-directory-p filename)
113 (let (file-name-handler-alist)
114 (fn-handler-real-file-directory-p filename)))))
115
116 (efs-overwrite-fn "fn-handler" ' file-directory-p 'fn-handler-file-directory-p)
117
118 (defun fn-handler-file-writable-p (filename)
119 "Documented as original."
120 (let* ((filename (expand-file-name filename))
121 (handler (find-file-name-handler filename 'file-writable-p)))
122 (if handler
123 (funcall handler 'file-writable-p filename)
124 (let (file-name-handler-alist)
125 (fn-handler-real-file-writable-p filename)))))
126
127 (efs-overwrite-fn "fn-handler" 'file-writable-p 'fn-handler-file-writable-p)
128
129 (defun fn-handler-file-readable-p (filename)
130 "Documented as original."
131 (let* ((filename (expand-file-name filename))
132 (handler (find-file-name-handler filename 'file-readable-p)))
133 (if handler
134 (funcall handler 'file-readable-p filename)
135 (let (file-name-handler-alist)
136 (fn-handler-real-file-readable-p filename)))))
137
138 (efs-overwrite-fn "fn-handler" 'file-readable-p 'fn-handler-file-readable-p)
139
140 (defun fn-handler-file-symlink-p (filename)
141 "Documented as original."
142 (let* ((filename (expand-file-name filename))
143 (handler (find-file-name-handler filename 'file-symlink-p)))
144 (if handler
145 (funcall handler 'file-symlink-p filename)
146 (let (file-name-handler-alist)
147 (fn-handler-real-file-symlink-p filename)))))
148
149 (efs-overwrite-fn "fn-handler" 'file-symlink-p 'fn-handler-file-symlink-p)
150
151 (defun fn-handler-delete-file (file)
152 "Documented as original"
153 (interactive (list (read-file-name "Delete-file: " nil nil t)))
154 (let* ((file (expand-file-name file))
155 (handler (find-file-name-handler file 'delete-file)))
156 (if handler
157 (funcall handler 'delete-file file)
158 (let (file-name-handler-alist)
159 (fn-handler-real-delete-file file)))))
160
161 (efs-overwrite-fn "fn-handler" 'delete-file 'fn-handler-delete-file)
162
163 (defun fn-handler-file-exists-p (filename)
164 "Documented as original"
165 (let* ((filename (expand-file-name filename))
166 (handler (find-file-name-handler filename 'file-exists-p)))
167 (if handler
168 (funcall handler 'file-exists-p filename)
169 (let (file-name-handler-alist)
170 (fn-handler-real-file-exists-p filename)))))
171
172 (efs-overwrite-fn "fn-handler" 'file-exists-p 'fn-handler-file-exists-p)
173
174 (defun fn-handler-write-region (start end filename &optional append visit)
175 "Documented as original"
176 ;; Use read-file-name, rather then interactive spec,
177 ;; to make it easier to get decent initial contents in the minibuffer.
178 (interactive
179 (progn
180 (or (mark) (error "The mark is not set now."))
181 (list (min (point) (mark))
182 (max (point) (mark))
183 (read-file-name "Write region to file: "))))
184 (let* ((filename (expand-file-name filename))
185 (handler (or (find-file-name-handler filename 'write-region)
186 (and (stringp visit)
187 (find-file-name-handler (expand-file-name visit)
188 'write-region)))))
189 (if handler
190 (funcall handler 'write-region start end filename append visit)
191 (let (file-name-handler-alist)
192 (fn-handler-real-write-region start end filename append visit)))))
193
194 (efs-overwrite-fn "fn-handler" 'write-region
195 'fn-handler-write-region)
196
197 (defun fn-handler-verify-visited-file-modtime (buffer)
198 "Documented as original"
199 (let* ((file (buffer-file-name buffer))
200 (handler (and file (find-file-name-handler
201 file
202 'verify-visited-file-modtime))))
203 (if handler
204 (funcall handler 'verify-visited-file-modtime buffer)
205 (let (file-name-handler-alist)
206 (fn-handler-real-verify-visited-file-modtime buffer)))))
207
208 (efs-overwrite-fn "fn-handler" 'verify-visited-file-modtime
209 'fn-handler-verify-visited-file-modtime)
210
211 (defun fn-handler-backup-buffer ()
212 "Documented as original"
213 (let ((handler (and buffer-file-name
214 (find-file-name-handler buffer-file-name
215 'backup-buffer))))
216 (if handler
217 (funcall handler 'backup-buffer)
218 ;; Don't let-bind file-name-handler-alist to nil, as backup-buffer
219 ;; is a lisp function and I want handlers to be available inside it.
220 (fn-handler-real-backup-buffer))))
221
222 (efs-overwrite-fn "fn-handler" 'backup-buffer 'fn-handler-backup-buffer)
223
224 (defun fn-handler-copy-file (filename newname &optional ok-if-already-exists
225 keep-date)
226 "Documented as original"
227 ;; handler for filename takes precedence over the handler for newname.
228 (interactive
229 (let* ((from (read-file-name "Copy file: " nil nil t))
230 (to (read-file-name (format "Copy %s to: " (abbreviate-file-name
231 from)))))
232 (list from to 0 current-prefix-arg)))
233 (let* ((filename (expand-file-name filename))
234 (newname (expand-file-name newname))
235 (handler (or (find-file-name-handler filename 'copy-file)
236 (find-file-name-handler newname 'copy-file))))
237 (if handler
238 ;; Using the NOWAIT arg is a bit risky for other users of the
239 ;; handler-alist
240 (funcall handler 'copy-file filename newname ok-if-already-exists
241 keep-date)
242 (let (file-name-handler-alist)
243 (fn-handler-real-copy-file filename newname ok-if-already-exists
244 keep-date)))))
245
246 (efs-overwrite-fn "fn-handler" 'copy-file 'fn-handler-copy-file)
247
248 (defun fn-handler-file-newer-than-file-p (file1 file2)
249 "Documented as original"
250 ;; The handler for file2 takes precedence over the handler for file1.
251 (let* ((file1 (expand-file-name file1))
252 (file2 (expand-file-name file2))
253 (handler (or (find-file-name-handler file2 'file-newer-than-file-p)
254 (find-file-name-handler file1 'file-newer-than-file-p))))
255 (if handler
256 (funcall handler 'file-newer-than-file-p file1 file2)
257 (let (file-name-handler-alist)
258 (fn-handler-real-file-newer-than-file-p file1 file2)))))
259
260 (efs-overwrite-fn "fn-handler" 'file-newer-than-file-p
261 'fn-handler-file-newer-than-file-p)
262
263 (defun fn-handler-file-attributes (file)
264 "Documented as original"
265 (let* ((file (expand-file-name file))
266 (handler (find-file-name-handler file 'file-attributes)))
267 (if handler
268 (funcall handler 'file-attributes file)
269 (let (file-name-handler-alist)
270 (fn-handler-real-file-attributes file)))))
271
272 (efs-overwrite-fn "fn-handler" 'file-attributes 'fn-handler-file-attributes)
273
274 (defun fn-handler-file-name-directory (file)
275 "Documented as original"
276 (let ((handler (find-file-name-handler file 'file-name-directory)))
277 (if handler
278 (funcall handler 'file-name-directory file)
279 (let (file-name-handler-alist)
280 (fn-handler-real-file-name-directory file)))))
281
282 (efs-overwrite-fn "fn-handler" 'file-name-directory
283 'fn-handler-file-name-directory)
284
285 (defun fn-handler-rename-file (filename newname &optional ok-if-already-exists)
286 "Documented as original"
287 (interactive
288 (let* ((from (read-file-name "Rename file: " nil nil t))
289 (to (read-file-name (format "Rename %s to: " (abbreviate-file-name
290 from)))))
291 (list from to 0)))
292 (let* ((filename (expand-file-name filename))
293 (newname (expand-file-name newname))
294 (handler (or (find-file-name-handler filename 'rename-file)
295 (find-file-name-handler newname 'rename-file))))
296 (if handler
297 (funcall handler 'rename-file filename newname ok-if-already-exists)
298 (let (file-name-handler-alist)
299 (fn-handler-real-rename-file filename newname ok-if-already-exists)))))
300
301 (efs-overwrite-fn "fn-handler" 'rename-file 'fn-handler-rename-file)
302
303 (defun fn-handler-insert-directory (file switches
304 &optional wildcard full-directory-p)
305 "Documented as original"
306 (let* ((file (expand-file-name file))
307 (handler (find-file-name-handler file 'insert-directory)))
308 (if handler
309 (funcall handler 'insert-directory file switches wildcard
310 full-directory-p)
311 (let (file-name-handler-alist)
312 (fn-handler-real-insert-directory file switches wildcard
313 full-directory-p)))))
314
315 (efs-overwrite-fn "fn-handler" 'insert-directory 'fn-handler-insert-directory)
316
317 (defun fn-handler-set-visited-file-modtime (&optional time)
318 "Sets the buffer's record of file modtime to the modtime of buffer-file-name.
319 With optional TIME, sets the modtime to TIME. This is an emacs 19 function.
320 In emacs 18, efs will make this work for remote files only."
321 (if buffer-file-name
322 (let ((handler (find-file-name-handler buffer-file-name
323 'set-visited-file-modtime)))
324 (if handler
325 (funcall handler 'set-visited-file-modtime time)
326 (let (file-name-handler-alist)
327 (fn-handler-real-set-visited-file-modtime time))))))
328
329 (efs-overwrite-fn "fn-handler" 'set-visited-file-modtime
330 'fn-handler-set-visited-file-modtime)
331
332 (defun fn-handler-file-name-nondirectory (name)
333 "Documented as original"
334 (let ((handler (find-file-name-handler name 'file-name-nondirectory)))
335 (if handler
336 (funcall handler 'file-name-nondirectory name)
337 (let (file-name-handler-alist)
338 (fn-handler-real-file-name-nondirectory name)))))
339
340 (efs-overwrite-fn "fn-handler" 'file-name-nondirectory
341 'fn-handler-file-name-nondirectory)
342
343 (defun fn-handler-file-name-as-directory (name)
344 "Documented as original"
345 (let ((handler (find-file-name-handler name 'file-name-as-directory)))
346 (if handler
347 (funcall handler 'file-name-as-directory name)
348 (let (file-name-handler-alist)
349 (fn-handler-real-file-name-as-directory name)))))
350
351 (efs-overwrite-fn "fn-handler" 'file-name-as-directory
352 'fn-handler-file-name-as-directory)
353
354 (defun fn-handler-directory-file-name (directory)
355 "Documented as original"
356 (let ((handler (find-file-name-handler directory 'directory-file-name)))
357 (if handler
358 (funcall handler 'directory-file-name directory)
359 (let (file-name-handler-alist)
360 (fn-handler-real-directory-file-name directory)))))
361
362 (efs-overwrite-fn "fn-handler" 'directory-file-name
363 'fn-handler-directory-file-name)
364
365 (defun fn-handler-get-file-buffer (file)
366 "Documented as original"
367 (let ((handler (find-file-name-handler file 'get-file-buffer)))
368 (if handler
369 (funcall handler 'get-file-buffer file)
370 (let (file-name-handler-alist)
371 (fn-handler-real-get-file-buffer file)))))
372
373 (efs-overwrite-fn "fn-handler" 'get-file-buffer 'fn-handler-get-file-buffer)
374
375 (defun fn-handler-create-file-buffer (file)
376 "Documented as original"
377 (let ((handler (find-file-name-handler file 'create-file-buffer)))
378 (if handler
379 (funcall handler 'create-file-buffer file)
380 (let (file-name-handler-alist)
381 (fn-handler-real-create-file-buffer file)))))
382
383 (efs-overwrite-fn "fn-handler" 'create-file-buffer
384 'fn-handler-create-file-buffer)
385
386 (defun fn-handler-set-file-modes (file mode)
387 "Documented as original"
388 (let* ((file (expand-file-name file))
389 (handler (find-file-name-handler file 'set-file-modes)))
390 (if handler
391 (funcall handler 'set-file-modes file mode)
392 (let (file-name-handler-alist)
393 (fn-handler-real-set-file-modes file mode)))))
394
395 (efs-overwrite-fn "fn-handler" 'set-file-modes 'fn-handler-set-file-modes)
396
397 (defun fn-handler-file-modes (file)
398 "Documented as original"
399 (let* ((file (expand-file-name file))
400 (handler (find-file-name-handler file 'file-modes)))
401 (if handler
402 (funcall handler 'file-modes file)
403 (let (file-name-handler-alist)
404 (fn-handler-real-file-modes file)))))
405
406 (efs-overwrite-fn "fn-handler" 'file-modes 'fn-handler-file-modes)
407
408 (if (string-match emacs-version "Lucid")
409
410 (progn
411 (defun fn-handler-abbreviate-file-name (filename &optional hack-homedir)
412 "Documented as original"
413 (let ((handler (find-file-name-handler filename
414 'abbreviate-file-name)))
415 (if handler
416 (funcall handler 'abbreviate-file-name filename hack-homedir)
417 (let (file-name-handler-alist)
418 (fn-handler-real-abbreviate-file-name filename hack-homedir))))))
419
420 (defun fn-handler-abbreviate-file-name (filename)
421 "Documented as original"
422 (let ((handler (find-file-name-handler filename 'abbreviate-file-name)))
423 (if handler
424 (funcall handler 'abbreviate-file-name filename)
425 (let (file-name-handler-alist)
426 (fn-handler-real-abbreviate-file-name filename))))))
427
428 (efs-overwrite-fn "fn-handler" 'abbreviate-file-name
429 'fn-handler-abbreviate-file-name)
430
431 (defun fn-handler-file-name-sans-versions (filename
432 &optional keep-backup-version)
433 "Documented as original"
434 (let ((handler (find-file-name-handler filename 'file-name-sans-versions)))
435 (if handler
436 (funcall handler 'file-name-sans-versions filename
437 keep-backup-version)
438 (let (file-name-handler-alist)
439 (fn-handler-real-file-name-sans-versions filename
440 keep-backup-version)))))
441
442 (efs-overwrite-fn "fn-handler" 'file-name-sans-versions
443 'fn-handler-file-name-sans-versions)
444
445 (if (fboundp 'make-directory-internal) ; not defined in lemacs 19.[67]
446 (progn
447 (defun fn-handler-make-directory-internal (dirname)
448 "Documented as original"
449 (let* ((dirname (expand-file-name dirname))
450 (handler (find-file-name-handler dirname
451 'make-directory-internal)))
452 (if handler
453 (funcall handler 'make-directory-internal dirname)
454 (let (file-name-handler-alist)
455 (fn-handler-real-make-directory-internal dirname)))))
456
457 (efs-overwrite-fn "fn-handler" 'make-directory-internal
458 'fn-handler-make-directory-internal)))
459
460 (defun fn-handler-delete-directory (dirname)
461 "Documented as original"
462 (let* ((dirname (expand-file-name dirname))
463 (handler (find-file-name-handler dirname 'delete-directory)))
464 (if handler
465 (funcall handler 'delete-directory dirname)
466 (let (file-name-handler-alist)
467 (fn-handler-real-delete-directory dirname)))))
468
469 (efs-overwrite-fn "fn-handler" 'delete-directory 'fn-handler-delete-directory)
470
471 (defun fn-handler-make-symbolic-link (target linkname
472 &optional ok-if-already-exists)
473 "Documented as original"
474 (interactive
475 (let (target)
476 (list
477 (setq target (read-string "Make symbolic link to file: "))
478 (read-file-name (format "Make symbolic link to file %s: " target))
479 0)))
480 (let* ((linkname (expand-file-name linkname))
481 (handler (or (find-file-name-handler linkname 'make-symbolic-link)
482 (find-file-name-handler target 'make-symbolic-link))))
483 (if handler
484 (funcall handler 'make-symbolic-link
485 target linkname ok-if-already-exists)
486 (let (file-name-handler-alist)
487 (fn-handler-real-make-symbolic-link target linkname
488 ok-if-already-exists)))))
489
490 (efs-overwrite-fn "fn-handler" 'make-symbolic-link
491 'fn-handler-make-symbolic-link)
492
493 (defun fn-handler-add-name-to-file (file newname &optional
494 ok-if-already-exists)
495 "Documented as original"
496 (interactive
497 (let (file)
498 (list
499 (setq file (read-file-name "Add name to file: " nil nil t))
500 (read-file-name (format "Name to add to %s: " file))
501 0)))
502 (let* ((file (expand-file-name file))
503 (newname (expand-file-name newname))
504 (handler (or (find-file-name-handler newname 'add-name-to-file)
505 (find-file-name-handler file 'add-name-to-file))))
506 (if handler
507 (funcall handler 'add-name-to-file file newname ok-if-already-exists)
508 (let (file-name-handler-alist)
509 (fn-handler-real-add-name-to-file file newname
510 ok-if-already-exists)))))
511
512 (efs-overwrite-fn "fn-handler" 'add-name-to-file 'fn-handler-add-name-to-file)
513
514 (defun fn-handler-recover-file (file)
515 "Documented as original"
516 (interactive "FRecover file: ")
517 (let* ((file (expand-file-name file))
518 (handler (or (find-file-name-handler file 'recover-file)
519 (find-file-name-handler (let ((buffer-file-name file))
520 (make-auto-save-file-name))
521 'recover-file))))
522 (if handler
523 (funcall handler 'recover-file file)
524 (let (file-name-handler-alist)
525 (fn-handler-real-recover-file file)))))
526
527 (efs-overwrite-fn "fn-handler" 'recover-file 'fn-handler-recover-file)
528
529 (defun fn-handler-file-name-completion (file dir)
530 "Documented as original."
531 (let* ((dir (expand-file-name dir))
532 (handler (find-file-name-handler dir 'file-name-completion)))
533 (if handler
534 (funcall handler 'file-name-completion file dir)
535 (let (file-name-handler-alist)
536 (fn-handler-real-file-name-completion file dir)))))
537
538 (efs-overwrite-fn "fn-handler" 'file-name-completion
539 'fn-handler-file-name-completion)
540
541 (defun fn-handler-file-name-all-completions (file dir)
542 "Documented as original."
543 (let* ((dir (expand-file-name dir))
544 (handler (find-file-name-handler dir 'file-name-all-completions)))
545 (if handler
546 (funcall handler 'file-name-all-completions file dir)
547 (let (file-name-handler-alist)
548 (fn-handler-real-file-name-all-completions file dir)))))
549
550 (efs-overwrite-fn "fn-handler" 'file-name-all-completions
551 'fn-handler-file-name-all-completions)
552
553 (if (fboundp 'file-truename)
554 (progn
555 (defun fn-handler-file-truename (filename)
556 "Documented as original"
557 (let* ((fn (expand-file-name filename))
558 (handler (find-file-name-handler filename 'file-truename)))
559 (if handler
560 (funcall handler 'file-truename filename)
561 (let (file-name-handler-alist)
562 (fn-handler-real-file-truename filename)))))
563 (efs-overwrite-fn "fn-handler" 'file-truename
564 'fn-handler-file-truename)))
565
566 (if (fboundp 'unhandled-file-name-directory)
567 (progn
568 (defun fn-handler-unhandled-file-name-directory (filename)
569 "Documented as original"
570 (let ((handler (find-file-name-handler
571 filename 'unhandled-file-name-directory)))
572 (if handler
573 (funcall handler 'unhandled-file-name-directory filename)
574 (let (file-name-handler-alist)
575 (fn-handler-real-unhandled-file-name-directory filename)))))
576
577 (efs-overwrite-fn "fn-handler" 'unhandled-file-name-directory
578 'fn-handler-unhandled-file-name-directory)))
579
580
581 ;; We don't need the file-name-handler-alist for these. Inhibit it to
582 ;; avoid an infinite recursion. Hope that this doesn't step
583 ;; on any other packages' toes.
584 (defun fn-handler-expand-file-name (filename &optional default)
585 "Documented as original."
586 (let (file-name-handler-alist)
587 (fn-handler-real-expand-file-name filename default)))
588
589 (efs-overwrite-fn "fn-handler" 'expand-file-name 'fn-handler-expand-file-name)
590
591 (defun fn-handler-substitute-in-file-name (filename)
592 "Documented as original."
593 (let ((handler (find-file-name-handler filename 'substitute-in-file-name)))
594 (if handler
595 (funcall handler 'substitute-in-file-name filename)
596 (let (file-name-handler-alist)
597 (fn-handler-real-substitute-in-file-name filename)))))
598
599 (efs-overwrite-fn "fn-handler" 'substitute-in-file-name
600 'fn-handler-substitute-in-file-name)
601
602 (if (fboundp 'file-executable-p)
603 (progn
604 (defun fn-handler-file-executable-p (file)
605 (let ((handler (find-file-name-handler file 'file-executable-p)))
606 (if handler
607 (funcall handler 'file-executable-p file)
608 (let (file-name-handler-alist)
609 (fn-handler-real-file-executable-p file)))))
610 (efs-overwrite-fn "fn-handler" 'file-executable-p
611 'fn-handler-file-executable-p)))
612
613 (if (fboundp 'file-accessible-directory-p)
614 (progn
615 (defun fn-handler-file-accessible-directory-p (file)
616 (let ((handler (find-file-name-handler file
617 'file-accessible-directory-p)))
618 (if handler
619 (funcall handler 'file-accessible-directory-p file)
620 (let (file-name-handler-alist)
621 (fn-handler-real-file-accessible-directory-p file)))))
622 (efs-overwrite-fn "fn-handler" 'file-accessible-directory-p
623 'fn-handler-file-accessible-directory-p)))
624
625 (defun fn-handler-load (file &optional noerror nomessage nosuffix)
626 (let ((handler (find-file-name-handler file 'load)))
627 (if handler
628 (funcall handler 'load file noerror nomessage nosuffix)
629 (let (file-name-handler-alist)
630 (fn-handler-real-load file noerror nomessage nosuffix)))))
631
632 (efs-overwrite-fn "fn-handler" 'load 'fn-handler-load)
633
634 ;; We don't need file-name-handlers for do-auto-save.
635 ;; If it does try to access them there is a risk of an infinite recursion.
636 (defun fn-handler-do-auto-save (&rest args)
637 "Documented as original."
638 (let (file-name-handler-alist)
639 (apply 'fn-handler-real-do-auto-save args)))
640
641 (efs-overwrite-fn "fn-handler" 'do-auto-save 'fn-handler-do-auto-save)
642
643 (if (fboundp 'vc-registered)
644 (progn
645 (defun fn-handler-vc-registered (file)
646 "Documented as original."
647 (let ((handler (find-file-name-handler file 'vc-registered)))
648 (if handler
649 (funcall handler 'vc-registered file)
650 (let (file-name-handler-alist)
651 (fn-handler-real-vc-registered file)))))
652
653 (efs-overwrite-fn "fn-handler" 'vc-registered
654 'fn-handler-vc-registered)))
655
656 ;;; end of fn-handler.el