gildea@ALEXANDER.BBN.COM (Stephen Gildea) (07/21/88)
Here's my handling of compressed files. It works such that if you try
to find a file, and it exists only in compressed form, it is
uncompressed into the buffer. No facility for saving the file is
provided since the file on disk is never uncompressed.
< Stephen
;;; Read in compressed files automatically.
;;; By gildea@bbn.com 20 Jul 88
(defun read-file-compressed ()
"Called by find-file-not-found-hooks to try reading the file
by adding `.Z' to the name and uncompressing it. Note that if you do
completion on the filename in the minibuffer this will not work,
because then Emacs will find the existing `filename.Z' instead of
failing to find `filename' and being forced to uncompress it. By gildea."
(if (file-exists-p (concat buffer-file-name ".Z"))
(progn
(call-process "zcat" nil t nil buffer-file-name)
(goto-char (point-min))
(setq error nil)
(set-buffer-modified-p nil)
(message "uncompressed %s" buffer-file-name))))
;;; I don't have a mechanism for writing compressed files,
;;; so the buffer is set read-only.
(defun after-find-file-compressed ()
"If we had to uncompress a file, set it read only"
(if (and (not (file-exists-p buffer-file-name))
(file-exists-p (concat buffer-file-name ".Z")))
(setq buffer-read-only t)))
(setq find-file-not-found-hooks
(cons 'read-file-compressed find-file-not-found-hooks))
(setq find-file-hooks
(cons 'after-find-file-compressed find-file-hooks))
;;; And make it work in dired, too.
(defun dired-find-file-compressed ()
"In dired, find the uncompressed version of this file."
(interactive)
(let* ((dired-name (dired-get-filename))
(filename (substring dired-name 0 (string-match "\\.Z$" dired-name))))
(find-file filename)))
(defun dired-hook ()
(define-key dired-mode-map "z" 'dired-find-file-compressed))
(setq dired-mode-hook 'dired-hook)