Mercurial > emacs
annotate lisp/jka-compr.el @ 24419:30e478cd167e
(shell-command-default-error-buffer): Renamed from
shell-command-on-region-default-error-buffer.
(shell-command-on-region): Mention in echo area when there
is some error output. Mention success or failure, too.
Accumulate multiple error outputs
going forward, with formfeed in between. Display the error buffer
when we have put something in it.
(shell-command): Add the ERROR-BUFFER argument feature.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Mon, 01 Mar 1999 03:19:32 +0000 |
parents | 051cdf587a57 |
children | 3472aaf1ed7b |
rev | line source |
---|---|
13337 | 1 ;;; jka-compr.el --- reading/writing/loading compressed files |
2 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
3 ;; Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. |
6002 | 4 |
5 ;; Author: jka@ece.cmu.edu (Jay K. Adams) | |
17976 | 6 ;; Maintainer: FSF |
6002 | 7 ;; Keywords: data |
8 | |
13514
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
9 ;; This file is part of GNU Emacs. |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
10 |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
11 ;; GNU Emacs is free software; you can redistribute it and/or modify |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
12 ;; it under the terms of the GNU General Public License as published by |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
13 ;; the Free Software Foundation; either version 2, or (at your option) |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
14 ;; any later version. |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
15 |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
16 ;; GNU Emacs is distributed in the hope that it will be useful, |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
19 ;; GNU General Public License for more details. |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
20 |
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
21 ;; You should have received a copy of the GNU General Public License |
14169 | 22 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
24 ;; Boston, MA 02111-1307, USA. | |
13514
0e46e8075a1d
(auto-compression-mode): Make arg optional.
Richard M. Stallman <rms@gnu.org>
parents:
13337
diff
changeset
|
25 |
6002 | 26 ;;; Commentary: |
27 | |
14169 | 28 ;; This package implements low-level support for reading, writing, |
29 ;; and loading compressed files. It hooks into the low-level file | |
30 ;; I/O functions (including write-region and insert-file-contents) so | |
31 ;; that they automatically compress or uncompress a file if the file | |
32 ;; appears to need it (based on the extension of the file name). | |
33 ;; Packages like Rmail, VM, GNUS, and Info should be able to work | |
34 ;; with compressed files without modification. | |
6002 | 35 |
36 | |
14169 | 37 ;; INSTRUCTIONS: |
38 ;; | |
39 ;; To use jka-compr, simply load this package, and edit as usual. | |
40 ;; Its operation should be transparent to the user (except for | |
41 ;; messages appearing when a file is being compressed or | |
42 ;; uncompressed). | |
43 ;; | |
44 ;; The variable, jka-compr-compression-info-list can be used to | |
45 ;; customize jka-compr to work with other compression programs. | |
46 ;; The default value of this variable allows jka-compr to work with | |
47 ;; Unix compress and gzip. | |
48 ;; | |
49 ;; If you are concerned about the stderr output of gzip and other | |
50 ;; compression/decompression programs showing up in your buffers, you | |
51 ;; should set the discard-error flag in the compression-info-list. | |
52 ;; This will cause the stderr of all programs to be discarded. | |
53 ;; However, it also causes emacs to call compression/uncompression | |
54 ;; programs through a shell (which is specified by jka-compr-shell). | |
55 ;; This may be a drag if, on your system, starting up a shell is | |
56 ;; slow. | |
57 ;; | |
58 ;; If you don't want messages about compressing and decompressing | |
59 ;; to show up in the echo area, you can set the compress-name and | |
60 ;; decompress-name fields of the jka-compr-compression-info-list to | |
61 ;; nil. | |
6002 | 62 |
63 | |
14169 | 64 ;; APPLICATION NOTES: |
65 ;; | |
66 ;; crypt++ | |
67 ;; jka-compr can coexist with crpyt++ if you take all the decompression | |
68 ;; entries out of the crypt-encoding-list. Clearly problems will arise if | |
69 ;; you have two programs trying to compress/decompress files. jka-compr | |
70 ;; will not "work with" crypt++ in the following sense: you won't be able to | |
71 ;; decode encrypted compressed files--that is, files that have been | |
72 ;; compressed then encrypted (in that order). Theoretically, crypt++ and | |
73 ;; jka-compr could properly handle a file that has been encrypted then | |
74 ;; compressed, but there is little point in trying to compress an encrypted | |
75 ;; file. | |
76 ;; | |
6002 | 77 |
78 | |
14169 | 79 ;; ACKNOWLEDGMENTS |
80 ;; | |
81 ;; jka-compr is a V19 adaptation of jka-compr for V18 of Emacs. Many people | |
82 ;; have made helpful suggestions, reported bugs, and even fixed bugs in | |
83 ;; jka-compr. I recall the following people as being particularly helpful. | |
84 ;; | |
85 ;; Jean-loup Gailly | |
86 ;; David Hughes | |
87 ;; Richard Pieri | |
88 ;; Daniel Quinlan | |
89 ;; Chris P. Ross | |
90 ;; Rick Sladkey | |
91 ;; | |
92 ;; Andy Norman's ange-ftp was the inspiration for the original jka-compr for | |
93 ;; Version 18 of Emacs. | |
94 ;; | |
95 ;; After I had made progress on the original jka-compr for V18, I learned of a | |
96 ;; package written by Kazushi Jam Marukawa, called jam-zcat, that did exactly | |
97 ;; what I was trying to do. I looked over the jam-zcat source code and | |
98 ;; probably got some ideas from it. | |
99 ;; | |
6002 | 100 |
101 ;;; Code: | |
102 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
103 (defgroup compression nil |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
104 "Data compression utilities" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
105 :group 'data) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
106 |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
107 (defgroup jka-compr nil |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
108 "jka-compr customization" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
109 :group 'compression) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
110 |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
111 |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
112 (defcustom jka-compr-shell "sh" |
6002 | 113 "*Shell to be used for calling compression programs. |
114 The value of this variable only matters if you want to discard the | |
115 stderr of a compression/decompression program (see the documentation | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
116 for `jka-compr-compression-info-list')." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
117 :type 'string |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
118 :group 'jka-compr) |
6002 | 119 |
21633
185e8e424ee9
(jka-compr-use-shell) [ms-dos, windows-nt]: Do not use a shell.
Richard M. Stallman <rms@gnu.org>
parents:
20893
diff
changeset
|
120 (defvar jka-compr-use-shell |
185e8e424ee9
(jka-compr-use-shell) [ms-dos, windows-nt]: Do not use a shell.
Richard M. Stallman <rms@gnu.org>
parents:
20893
diff
changeset
|
121 (not (memq system-type '(ms-dos windows-nt)))) |
6002 | 122 |
123 ;;; I have this defined so that .Z files are assumed to be in unix | |
20873
d2b5d0e2607e
(jka-compr-compression-info-list): Handle bzip.
Richard M. Stallman <rms@gnu.org>
parents:
20497
diff
changeset
|
124 ;;; compress format; and .gz files, in gzip format, and .bz2 files in bzip fmt. |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
125 (defcustom jka-compr-compression-info-list |
6002 | 126 ;;[regexp |
7616
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
127 ;; compr-message compr-prog compr-args |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
128 ;; uncomp-message uncomp-prog uncomp-args |
6002 | 129 ;; can-append auto-mode-flag] |
8774
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
130 '(["\\.Z\\(~\\|\\.~[0-9]+~\\)?\\'" |
6002 | 131 "compressing" "compress" ("-c") |
132 "uncompressing" "uncompress" ("-c") | |
133 nil t] | |
23348
051cdf587a57
(jka-compr-compression-info-list): Remove "-c" from
Dave Love <fx@gnu.org>
parents:
22746
diff
changeset
|
134 ;; Formerly, these had an additional arg "-c", but that fails with |
051cdf587a57
(jka-compr-compression-info-list): Remove "-c" from
Dave Love <fx@gnu.org>
parents:
22746
diff
changeset
|
135 ;; "Version 0.1pl2, 29-Aug-97." (RedHat 5.1 GNU/Linux) and |
051cdf587a57
(jka-compr-compression-info-list): Remove "-c" from
Dave Love <fx@gnu.org>
parents:
22746
diff
changeset
|
136 ;; "Version 0.9.0b, 9-Sept-98". |
20873
d2b5d0e2607e
(jka-compr-compression-info-list): Handle bzip.
Richard M. Stallman <rms@gnu.org>
parents:
20497
diff
changeset
|
137 ["\\.bz2\\'" |
23348
051cdf587a57
(jka-compr-compression-info-list): Remove "-c" from
Dave Love <fx@gnu.org>
parents:
22746
diff
changeset
|
138 "bzip2ing" "bzip2" nil |
051cdf587a57
(jka-compr-compression-info-list): Remove "-c" from
Dave Love <fx@gnu.org>
parents:
22746
diff
changeset
|
139 "bunzip2ing" "bzip2" ("-d") |
20893
41ad3e101628
(jka-compr-compression-info-list): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
20873
diff
changeset
|
140 nil t] |
9493
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
141 ["\\.tgz\\'" |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
142 "zipping" "gzip" ("-c" "-q") |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
143 "unzipping" "gzip" ("-c" "-q" "-d") |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
144 t nil] |
8774
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
145 ["\\.gz\\(~\\|\\.~[0-9]+~\\)?\\'" |
6002 | 146 "zipping" "gzip" ("-c" "-q") |
147 "unzipping" "gzip" ("-c" "-q" "-d") | |
148 t t]) | |
149 | |
150 "List of vectors that describe available compression techniques. | |
151 Each element, which describes a compression technique, is a vector of | |
7616
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
152 the form [REGEXP COMPRESS-MSG COMPRESS-PROGRAM COMPRESS-ARGS |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
153 UNCOMPRESS-MSG UNCOMPRESS-PROGRAM UNCOMPRESS-ARGS |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
154 APPEND-FLAG EXTENSION], where: |
6002 | 155 |
156 regexp is a regexp that matches filenames that are | |
157 compressed with this format | |
158 | |
7616
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
159 compress-msg is the message to issue to the user when doing this |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
160 type of compression (nil means no message) |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
161 |
6002 | 162 compress-program is a program that performs this compression |
163 | |
164 compress-args is a list of args to pass to the compress program | |
165 | |
7616
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
166 uncompress-msg is the message to issue to the user when doing this |
b0098553bafe
(jka-compr-compression-info-list): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7066
diff
changeset
|
167 type of uncompression (nil means no message) |
6002 | 168 |
169 uncompress-program is a program that performs this compression | |
170 | |
171 uncompress-args is a list of args to pass to the uncompress program | |
172 | |
173 append-flag is non-nil if this compression technique can be | |
174 appended | |
175 | |
176 auto-mode flag non-nil means strip the regexp from file names | |
177 before attempting to set the mode. | |
178 | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
179 Because of the way `call-process' is defined, discarding the stderr output of |
6002 | 180 a program adds the overhead of starting a shell each time the program is |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
181 invoked." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
182 :type '(repeat (vector regexp |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
183 (choice :tag "Compress Message" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
184 (string :format "%v") |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
185 (const :tag "No Message" nil)) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
186 (string :tag "Compress Program") |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
187 (repeat :tag "Compress Arguments" string) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
188 (choice :tag "Uncompress Message" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
189 (string :format "%v") |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
190 (const :tag "No Message" nil)) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
191 (string :tag "Uncompress Program") |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
192 (repeat :tag "Uncompress Arguments" string) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
193 (boolean :tag "Append") |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
194 (boolean :tag "Auto Mode"))) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
195 :group 'jka-compr) |
6002 | 196 |
9493
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
197 (defvar jka-compr-mode-alist-additions |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
198 (list (cons "\\.tgz\\'" 'tar-mode)) |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
199 "A list of pairs to add to `auto-mode-alist' when jka-compr is installed.") |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
200 |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
201 ;; List of all the elements we actually added to file-coding-system-alist. |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
202 (defvar jka-compr-added-to-file-coding-system-alist nil) |
6002 | 203 |
7617
edc853e14f7b
(jka-compr-op-table, jka-compr-file-name-handler-entry): Move defvars.
Richard M. Stallman <rms@gnu.org>
parents:
7616
diff
changeset
|
204 (defvar jka-compr-file-name-handler-entry |
edc853e14f7b
(jka-compr-op-table, jka-compr-file-name-handler-entry): Move defvars.
Richard M. Stallman <rms@gnu.org>
parents:
7616
diff
changeset
|
205 nil |
edc853e14f7b
(jka-compr-op-table, jka-compr-file-name-handler-entry): Move defvars.
Richard M. Stallman <rms@gnu.org>
parents:
7616
diff
changeset
|
206 "The entry in `file-name-handler-alist' used by the jka-compr I/O functions.") |
edc853e14f7b
(jka-compr-op-table, jka-compr-file-name-handler-entry): Move defvars.
Richard M. Stallman <rms@gnu.org>
parents:
7616
diff
changeset
|
207 |
15083 | 208 ;;; Functions for accessing the return value of jka-compr-get-compression-info |
6002 | 209 (defun jka-compr-info-regexp (info) (aref info 0)) |
210 (defun jka-compr-info-compress-message (info) (aref info 1)) | |
211 (defun jka-compr-info-compress-program (info) (aref info 2)) | |
212 (defun jka-compr-info-compress-args (info) (aref info 3)) | |
213 (defun jka-compr-info-uncompress-message (info) (aref info 4)) | |
214 (defun jka-compr-info-uncompress-program (info) (aref info 5)) | |
215 (defun jka-compr-info-uncompress-args (info) (aref info 6)) | |
216 (defun jka-compr-info-can-append (info) (aref info 7)) | |
217 (defun jka-compr-info-strip-extension (info) (aref info 8)) | |
218 | |
219 | |
220 (defun jka-compr-get-compression-info (filename) | |
221 "Return information about the compression scheme of FILENAME. | |
222 The determination as to which compression scheme, if any, to use is | |
7066 | 223 based on the filename itself and `jka-compr-compression-info-list'." |
6002 | 224 (catch 'compression-info |
225 (let ((case-fold-search nil)) | |
226 (mapcar | |
227 (function (lambda (x) | |
228 (and (string-match (jka-compr-info-regexp x) filename) | |
229 (throw 'compression-info x)))) | |
230 jka-compr-compression-info-list) | |
231 nil))) | |
232 | |
233 | |
234 (put 'compression-error 'error-conditions '(compression-error file-error error)) | |
235 | |
236 | |
11635
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
237 (defvar jka-compr-acceptable-retval-list '(0 2 141)) |
6002 | 238 |
239 | |
240 (defun jka-compr-error (prog args infile message &optional errfile) | |
241 | |
242 (let ((errbuf (get-buffer-create " *jka-compr-error*")) | |
243 (curbuf (current-buffer))) | |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
244 (with-current-buffer errbuf |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
245 (widen) (erase-buffer) |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
246 (insert (format "Error while executing \"%s %s < %s\"\n\n" |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
247 prog |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
248 (mapconcat 'identity args " ") |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
249 infile)) |
6002 | 250 |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
251 (and errfile |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
252 (insert-file-contents errfile))) |
6002 | 253 (display-buffer errbuf)) |
254 | |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
255 (signal 'compression-error |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
256 (list "Opening input file" (format "error %s" message) infile))) |
6002 | 257 |
258 | |
259 (defvar jka-compr-dd-program | |
260 "/bin/dd") | |
261 | |
262 | |
6041
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
263 (defvar jka-compr-dd-blocksize 256) |
6002 | 264 |
265 | |
266 (defun jka-compr-partial-uncompress (prog message args infile beg len) | |
267 "Call program PROG with ARGS args taking input from INFILE. | |
268 Fourth and fifth args, BEG and LEN, specify which part of the output | |
8065
31eb7a0e2763
(jka-compr-partial-uncompress): Handle the case where
Richard M. Stallman <rms@gnu.org>
parents:
7976
diff
changeset
|
269 to keep: LEN chars starting BEG chars from the beginning." |
6002 | 270 (let* ((skip (/ beg jka-compr-dd-blocksize)) |
271 (prefix (- beg (* skip jka-compr-dd-blocksize))) | |
272 (count (and len (1+ (/ (+ len prefix) jka-compr-dd-blocksize)))) | |
273 (start (point)) | |
274 (err-file (jka-compr-make-temp-name)) | |
275 (run-string (format "%s %s 2> %s | %s bs=%d skip=%d %s 2> /dev/null" | |
276 prog | |
277 (mapconcat 'identity args " ") | |
278 err-file | |
279 jka-compr-dd-program | |
280 jka-compr-dd-blocksize | |
281 skip | |
6041
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
282 ;; dd seems to be unreliable about |
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
283 ;; providing the last block. So, always |
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
284 ;; read one more than you think you need. |
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
285 (if count (concat "count=" (1+ count)) "")))) |
6002 | 286 |
287 (unwind-protect | |
288 (or (memq (call-process jka-compr-shell | |
289 infile t nil "-c" | |
290 run-string) | |
291 jka-compr-acceptable-retval-list) | |
292 | |
293 (jka-compr-error prog args infile message err-file)) | |
294 | |
295 (jka-compr-delete-temp-file err-file)) | |
296 | |
8065
31eb7a0e2763
(jka-compr-partial-uncompress): Handle the case where
Richard M. Stallman <rms@gnu.org>
parents:
7976
diff
changeset
|
297 ;; Delete the stuff after what we want, if there is any. |
6002 | 298 (and |
6041
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
299 len |
8065
31eb7a0e2763
(jka-compr-partial-uncompress): Handle the case where
Richard M. Stallman <rms@gnu.org>
parents:
7976
diff
changeset
|
300 (< (+ start prefix len) (point)) |
6041
649926e9c1a8
(jka-compr-partial-uncompress): Make dd give you
Richard M. Stallman <rms@gnu.org>
parents:
6002
diff
changeset
|
301 (delete-region (+ start prefix len) (point))) |
6002 | 302 |
8065
31eb7a0e2763
(jka-compr-partial-uncompress): Handle the case where
Richard M. Stallman <rms@gnu.org>
parents:
7976
diff
changeset
|
303 ;; Delete the stuff before what we want. |
6002 | 304 (delete-region start (+ start prefix)))) |
305 | |
306 | |
307 (defun jka-compr-call-process (prog message infile output temp args) | |
308 (if jka-compr-use-shell | |
309 | |
18879
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
310 (let ((err-file (jka-compr-make-temp-name)) |
18906 | 311 (coding-system-for-read (or coding-system-for-read 'undecided)) |
22360
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
312 (coding-system-for-write 'no-conversion)) |
18879
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
313 |
6002 | 314 (unwind-protect |
315 | |
316 (or (memq | |
317 (call-process jka-compr-shell infile | |
318 (if (stringp output) nil output) | |
319 nil | |
320 "-c" | |
321 (format "%s %s 2> %s %s" | |
322 prog | |
323 (mapconcat 'identity args " ") | |
324 err-file | |
325 (if (stringp output) | |
326 (concat "> " output) | |
327 ""))) | |
328 jka-compr-acceptable-retval-list) | |
329 | |
330 (jka-compr-error prog args infile message err-file)) | |
331 | |
332 (jka-compr-delete-temp-file err-file))) | |
333 | |
334 (or (zerop | |
335 (apply 'call-process | |
336 prog | |
337 infile | |
338 (if (stringp output) temp output) | |
339 nil | |
340 args)) | |
341 (jka-compr-error prog args infile message)) | |
342 | |
343 (and (stringp output) | |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
344 (with-current-buffer temp |
6002 | 345 (write-region (point-min) (point-max) output) |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
346 (erase-buffer))))) |
6002 | 347 |
348 | |
349 ;;; Support for temp files. Much of this was inspired if not lifted | |
350 ;;; from ange-ftp. | |
351 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
352 (defcustom jka-compr-temp-name-template |
22100
eb3f36cc775f
(jka-compr-temp-name-template): Use temporary-file-directory.
Richard M. Stallman <rms@gnu.org>
parents:
22090
diff
changeset
|
353 (expand-file-name "jka-com" temporary-file-directory) |
17441
41a10d128e3b
(jka-compr-temp-name-template): Fix editing error.
Richard M. Stallman <rms@gnu.org>
parents:
17411
diff
changeset
|
354 "Prefix added to all temp files created by jka-compr. |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
355 There should be no more than seven characters after the final `/'." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
356 :type 'string |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16940
diff
changeset
|
357 :group 'jka-compr) |
6002 | 358 |
359 (defvar jka-compr-temp-name-table (make-vector 31 nil)) | |
360 | |
361 (defun jka-compr-make-temp-name (&optional local-copy) | |
362 "This routine will return the name of a new file." | |
363 (let* ((lastchar ?a) | |
364 (prevchar ?a) | |
365 (template (concat jka-compr-temp-name-template "aa")) | |
366 (lastpos (1- (length template))) | |
367 (not-done t) | |
368 file | |
369 entry) | |
370 | |
371 (while not-done | |
372 (aset template lastpos lastchar) | |
373 (setq file (concat (make-temp-name template) "#")) | |
374 (setq entry (intern file jka-compr-temp-name-table)) | |
375 (if (or (get entry 'active) | |
376 (file-exists-p file)) | |
377 | |
378 (progn | |
379 (setq lastchar (1+ lastchar)) | |
380 (if (> lastchar ?z) | |
381 (progn | |
382 (setq prevchar (1+ prevchar)) | |
383 (setq lastchar ?a) | |
384 (if (> prevchar ?z) | |
385 (error "Can't allocate temp file.") | |
386 (aset template (1- lastpos) prevchar))))) | |
387 | |
388 (put entry 'active (not local-copy)) | |
389 (setq not-done nil))) | |
390 | |
391 file)) | |
392 | |
393 | |
394 (defun jka-compr-delete-temp-file (temp) | |
395 | |
396 (put (intern temp jka-compr-temp-name-table) | |
397 'active nil) | |
398 | |
399 (condition-case () | |
400 (delete-file temp) | |
401 (error nil))) | |
402 | |
403 | |
404 (defun jka-compr-write-region (start end file &optional append visit) | |
405 (let* ((filename (expand-file-name file)) | |
406 (visit-file (if (stringp visit) (expand-file-name visit) filename)) | |
407 (info (jka-compr-get-compression-info visit-file))) | |
408 | |
409 (if info | |
410 | |
411 (let ((can-append (jka-compr-info-can-append info)) | |
412 (compress-program (jka-compr-info-compress-program info)) | |
413 (compress-message (jka-compr-info-compress-message info)) | |
414 (uncompress-program (jka-compr-info-uncompress-program info)) | |
415 (uncompress-message (jka-compr-info-uncompress-message info)) | |
416 (compress-args (jka-compr-info-compress-args info)) | |
417 (uncompress-args (jka-compr-info-uncompress-args info)) | |
418 (base-name (file-name-nondirectory visit-file)) | |
22360
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
419 temp-file temp-buffer |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
420 ;; we need to leave `last-coding-system-used' set to its |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
421 ;; value after calling write-region the first time, so |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
422 ;; that `basic-save-buffer' sees the right value. |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
423 (coding-system-used last-coding-system-used)) |
6002 | 424 |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
425 (setq temp-buffer (get-buffer-create " *jka-compr-wr-temp*")) |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
426 (with-current-buffer temp-buffer |
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
427 (widen) (erase-buffer)) |
6002 | 428 |
11635
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
429 (if (and append |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
430 (not can-append) |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
431 (file-exists-p filename)) |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
432 |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
433 (let* ((local-copy (file-local-copy filename)) |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
434 (local-file (or local-copy filename))) |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
435 |
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
436 (setq temp-file local-file)) |
6002 | 437 |
11635
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
438 (setq temp-file (jka-compr-make-temp-name))) |
6002 | 439 |
440 (and | |
441 compress-message | |
442 (message "%s %s..." compress-message base-name)) | |
11635
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
443 |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
444 (jka-compr-run-real-handler 'write-region |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
445 (list start end temp-file t 'dont)) |
22360
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
446 ;; save value used by the real write-region |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
447 (setq coding-system-used last-coding-system-used) |
6002 | 448 |
18906 | 449 ;; Here we must read the output of compress program as is |
450 ;; without any code conversion. | |
451 (let ((coding-system-for-read 'no-conversion)) | |
452 (jka-compr-call-process compress-program | |
453 (concat compress-message | |
454 " " base-name) | |
455 temp-file | |
456 temp-buffer | |
457 nil | |
458 compress-args)) | |
6002 | 459 |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
460 (with-current-buffer temp-buffer |
18879
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
461 (let ((coding-system-for-write 'no-conversion)) |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
462 (if (memq system-type '(ms-dos windows-nt)) |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
463 (setq buffer-file-type t) ) |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
464 (jka-compr-run-real-handler 'write-region |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
465 (list (point-min) (point-max) |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
466 filename |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
467 (and append can-append) 'dont)) |
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
468 (erase-buffer)) ) |
6002 | 469 |
470 (jka-compr-delete-temp-file temp-file) | |
471 | |
472 (and | |
473 compress-message | |
474 (message "%s %s...done" compress-message base-name)) | |
475 | |
476 (cond | |
477 ((eq visit t) | |
478 (setq buffer-file-name filename) | |
479 (set-visited-file-modtime)) | |
480 ((stringp visit) | |
481 (setq buffer-file-name visit) | |
482 (let ((buffer-file-name filename)) | |
483 (set-visited-file-modtime)))) | |
484 | |
485 (and (or (eq visit t) | |
486 (eq visit nil) | |
487 (stringp visit)) | |
488 (message "Wrote %s" visit-file)) | |
489 | |
22360
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
490 ;; ensure `last-coding-system-used' has an appropriate value |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
491 (setq last-coding-system-used coding-system-used) |
09dbe38a603f
(jka-compr-write-region): Ensure
Karl Heuer <kwzh@gnu.org>
parents:
22194
diff
changeset
|
492 |
6002 | 493 nil) |
494 | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
495 (jka-compr-run-real-handler 'write-region |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
496 (list start end filename append visit))))) |
6002 | 497 |
498 | |
6218
f4d5338c2142
(jka-compr-insert-file-contents): Handle 5th arg.
Richard M. Stallman <rms@gnu.org>
parents:
6041
diff
changeset
|
499 (defun jka-compr-insert-file-contents (file &optional visit beg end replace) |
6002 | 500 (barf-if-buffer-read-only) |
501 | |
502 (and (or beg end) | |
503 visit | |
504 (error "Attempt to visit less than an entire file")) | |
505 | |
506 (let* ((filename (expand-file-name file)) | |
507 (info (jka-compr-get-compression-info filename))) | |
508 | |
509 (if info | |
510 | |
511 (let ((uncompress-message (jka-compr-info-uncompress-message info)) | |
512 (uncompress-program (jka-compr-info-uncompress-program info)) | |
513 (uncompress-args (jka-compr-info-uncompress-args info)) | |
514 (base-name (file-name-nondirectory filename)) | |
515 (notfound nil) | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
516 (local-copy |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
517 (jka-compr-run-real-handler 'file-local-copy (list filename))) |
6002 | 518 local-file |
18879
8b226efb9a8b
(jka-compr-insert-file-contents): Bind coding-system-for-read.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
519 size start |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
520 (coding-system-for-read |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
521 (or coding-system-for-read |
20497
0d0951bf17fa
(jka-compr-insert-file-contents):
Richard M. Stallman <rms@gnu.org>
parents:
20132
diff
changeset
|
522 ;; If multibyte characters are disabled, |
0d0951bf17fa
(jka-compr-insert-file-contents):
Richard M. Stallman <rms@gnu.org>
parents:
20132
diff
changeset
|
523 ;; don't do that conversion. |
0d0951bf17fa
(jka-compr-insert-file-contents):
Richard M. Stallman <rms@gnu.org>
parents:
20132
diff
changeset
|
524 (and (null enable-multibyte-characters) |
0d0951bf17fa
(jka-compr-insert-file-contents):
Richard M. Stallman <rms@gnu.org>
parents:
20132
diff
changeset
|
525 'raw-text) |
22746
516b9dfa5d34
(jka-compr-insert-file-contents): Replace incorrect
Richard M. Stallman <rms@gnu.org>
parents:
22484
diff
changeset
|
526 (let ((coding (find-operation-coding-system |
516b9dfa5d34
(jka-compr-insert-file-contents): Replace incorrect
Richard M. Stallman <rms@gnu.org>
parents:
22484
diff
changeset
|
527 'insert-file-contents |
516b9dfa5d34
(jka-compr-insert-file-contents): Replace incorrect
Richard M. Stallman <rms@gnu.org>
parents:
22484
diff
changeset
|
528 (jka-compr-byte-compiler-base-file-name file)))) |
516b9dfa5d34
(jka-compr-insert-file-contents): Replace incorrect
Richard M. Stallman <rms@gnu.org>
parents:
22484
diff
changeset
|
529 (and (consp coding) (car coding))) |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
530 'undecided)) ) |
6002 | 531 |
532 (setq local-file (or local-copy filename)) | |
533 | |
534 (and | |
535 visit | |
536 (setq buffer-file-name filename)) | |
537 | |
538 (unwind-protect ; to make sure local-copy gets deleted | |
539 | |
540 (progn | |
541 | |
542 (and | |
543 uncompress-message | |
544 (message "%s %s..." uncompress-message base-name)) | |
545 | |
546 (condition-case error-code | |
547 | |
548 (progn | |
8774
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
549 (if replace |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
550 (goto-char (point-min))) |
6002 | 551 (setq start (point)) |
552 (if (or beg end) | |
553 (jka-compr-partial-uncompress uncompress-program | |
554 (concat uncompress-message | |
555 " " base-name) | |
556 uncompress-args | |
557 local-file | |
558 (or beg 0) | |
559 (if (and beg end) | |
560 (- end beg) | |
561 end)) | |
11621
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
562 ;; If visiting, bind off buffer-file-name so that |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
563 ;; file-locking will not ask whether we should |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
564 ;; really edit the buffer. |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
565 (let ((buffer-file-name |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
566 (if visit nil buffer-file-name))) |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
567 (jka-compr-call-process uncompress-program |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
568 (concat uncompress-message |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
569 " " base-name) |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
570 local-file |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
571 t |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
572 nil |
710b5ce824c2
(jka-compr-insert-file-contents): When visiting,
Richard M. Stallman <rms@gnu.org>
parents:
11296
diff
changeset
|
573 uncompress-args))) |
6002 | 574 (setq size (- (point) start)) |
8774
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
575 (if replace |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
576 (let* ((del-beg (point)) |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
577 (del-end (+ del-beg size))) |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
578 (delete-region del-beg |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
579 (min del-end (point-max))))) |
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
580 (goto-char start)) |
6002 | 581 (error |
582 (if (and (eq (car error-code) 'file-error) | |
583 (eq (nth 3 error-code) local-file)) | |
584 (if visit | |
585 (setq notfound error-code) | |
586 (signal 'file-error | |
587 (cons "Opening input file" | |
588 (nthcdr 2 error-code)))) | |
589 (signal (car error-code) (cdr error-code)))))) | |
590 | |
591 (and | |
592 local-copy | |
593 (file-exists-p local-copy) | |
594 (delete-file local-copy))) | |
595 | |
596 (and | |
597 visit | |
598 (progn | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
599 (unlock-buffer) |
6002 | 600 (setq buffer-file-name filename) |
601 (set-visited-file-modtime))) | |
602 | |
603 (and | |
604 uncompress-message | |
605 (message "%s %s...done" uncompress-message base-name)) | |
606 | |
607 (and | |
608 visit | |
609 notfound | |
610 (signal 'file-error | |
611 (cons "Opening input file" (nth 2 notfound)))) | |
612 | |
22484
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
613 ;; This is done in insert-file-contents after we return. |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
614 ;; That is a little weird, but better to go along with it now |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
615 ;; than to change it now. |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
616 |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
617 ;;; ;; Run the functions that insert-file-contents would. |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
618 ;;; (let ((p after-insert-file-functions) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
619 ;;; (insval size)) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
620 ;;; (while p |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
621 ;;; (setq insval (funcall (car p) size)) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
622 ;;; (if insval |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
623 ;;; (progn |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
624 ;;; (or (integerp insval) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
625 ;;; (signal 'wrong-type-argument |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
626 ;;; (list 'integerp insval))) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
627 ;;; (setq size insval))) |
661650f543ee
(jka-compr-insert-file-contents): Don't run
Richard M. Stallman <rms@gnu.org>
parents:
22360
diff
changeset
|
628 ;;; (setq p (cdr p)))) |
8774
ade4b542a74c
(jka-compr-compression-info-list): Expand regular
Richard M. Stallman <rms@gnu.org>
parents:
8593
diff
changeset
|
629 |
6002 | 630 (list filename size)) |
631 | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
632 (jka-compr-run-real-handler 'insert-file-contents |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
633 (list file visit beg end replace))))) |
6002 | 634 |
635 | |
636 (defun jka-compr-file-local-copy (file) | |
637 (let* ((filename (expand-file-name file)) | |
638 (info (jka-compr-get-compression-info filename))) | |
639 | |
640 (if info | |
641 | |
642 (let ((uncompress-message (jka-compr-info-uncompress-message info)) | |
643 (uncompress-program (jka-compr-info-uncompress-program info)) | |
644 (uncompress-args (jka-compr-info-uncompress-args info)) | |
645 (base-name (file-name-nondirectory filename)) | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
646 (local-copy |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
647 (jka-compr-run-real-handler 'file-local-copy (list filename))) |
6002 | 648 (temp-file (jka-compr-make-temp-name t)) |
11635
b56f6afa16ec
(jka-compr-write-region): Handle the append
Richard M. Stallman <rms@gnu.org>
parents:
11621
diff
changeset
|
649 (temp-buffer (get-buffer-create " *jka-compr-flc-temp*")) |
6002 | 650 (notfound nil) |
651 local-file) | |
652 | |
653 (setq local-file (or local-copy filename)) | |
654 | |
655 (unwind-protect | |
656 | |
16940
6d680b18a47b
(jka-compr-error): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16630
diff
changeset
|
657 (with-current-buffer temp-buffer |
6002 | 658 |
659 (and | |
660 uncompress-message | |
661 (message "%s %s..." uncompress-message base-name)) | |
662 | |
18906 | 663 ;; Here we must read the output of uncompress program |
664 ;; and write it to TEMP-FILE without any code | |
665 ;; conversion. An appropriate code conversion (if | |
666 ;; necessary) is done by the later I/O operation | |
667 ;; (e.g. load). | |
668 (let ((coding-system-for-read 'no-conversion) | |
669 (coding-system-for-write 'no-conversion)) | |
6002 | 670 |
18906 | 671 (jka-compr-call-process uncompress-program |
672 (concat uncompress-message | |
673 " " base-name) | |
674 local-file | |
675 t | |
676 nil | |
677 uncompress-args) | |
6002 | 678 |
18906 | 679 (and |
680 uncompress-message | |
681 (message "%s %s...done" uncompress-message base-name)) | |
682 | |
683 (write-region | |
684 (point-min) (point-max) temp-file nil 'dont))) | |
6002 | 685 |
686 (and | |
687 local-copy | |
688 (file-exists-p local-copy) | |
689 (delete-file local-copy)) | |
690 | |
691 (kill-buffer temp-buffer)) | |
692 | |
693 temp-file) | |
694 | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
695 (jka-compr-run-real-handler 'file-local-copy (list filename))))) |
6002 | 696 |
697 | |
698 ;;; Support for loading compressed files. | |
699 (defun jka-compr-load (file &optional noerror nomessage nosuffix) | |
700 "Documented as original." | |
701 | |
702 (let* ((local-copy (jka-compr-file-local-copy file)) | |
703 (load-file (or local-copy file))) | |
704 | |
705 (unwind-protect | |
706 | |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
707 (let (inhibit-file-name-operation |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
708 inhibit-file-name-handlers) |
6002 | 709 (or nomessage |
710 (message "Loading %s..." file)) | |
711 | |
12758
a285eaa710ac
(jka-compr-load): Bind load-force-doc-strings.
Richard M. Stallman <rms@gnu.org>
parents:
11635
diff
changeset
|
712 (let ((load-force-doc-strings t)) |
a285eaa710ac
(jka-compr-load): Bind load-force-doc-strings.
Richard M. Stallman <rms@gnu.org>
parents:
11635
diff
changeset
|
713 (load load-file noerror t t)) |
6002 | 714 |
715 (or nomessage | |
716 (message "Loading %s...done." file))) | |
717 | |
718 (jka-compr-delete-temp-file local-copy)) | |
719 | |
720 t)) | |
12922
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
721 |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
722 (defun jka-compr-byte-compiler-base-file-name (file) |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
723 (let ((info (jka-compr-get-compression-info file))) |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
724 (if (and info (jka-compr-info-strip-extension info)) |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
725 (save-match-data |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
726 (substring file 0 (string-match (jka-compr-info-regexp info) file))) |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
727 file))) |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
728 |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
729 (put 'write-region 'jka-compr 'jka-compr-write-region) |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
730 (put 'insert-file-contents 'jka-compr 'jka-compr-insert-file-contents) |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
731 (put 'file-local-copy 'jka-compr 'jka-compr-file-local-copy) |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
732 (put 'load 'jka-compr 'jka-compr-load) |
12922
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
733 (put 'byte-compiler-base-file-name 'jka-compr |
e171a85fd6b0
(jka-compr-byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12758
diff
changeset
|
734 'jka-compr-byte-compiler-base-file-name) |
6002 | 735 |
20132
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
736 (defvar jka-compr-inhibit nil |
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
737 "Non-nil means inhibit automatic uncompression temporarily. |
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
738 Lisp programs can bind this to t to do that. |
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
739 It is not recommended to set this variable permanently to anything but nil.") |
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
740 |
6002 | 741 (defun jka-compr-handler (operation &rest args) |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
742 (save-match-data |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
743 (let ((jka-op (get operation 'jka-compr))) |
20132
b691f68b0757
(jka-compr-inhibit): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
19004
diff
changeset
|
744 (if (and jka-op (not jka-compr-inhibit)) |
7976
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
745 (apply jka-op args) |
b72b84744a85
Use plists to record handlers.
Richard M. Stallman <rms@gnu.org>
parents:
7617
diff
changeset
|
746 (jka-compr-run-real-handler operation args))))) |
6002 | 747 |
7066 | 748 ;; If we are given an operation that we don't handle, |
749 ;; call the Emacs primitive for that operation, | |
750 ;; and manipulate the inhibit variables | |
751 ;; to prevent the primitive from calling our handler again. | |
752 (defun jka-compr-run-real-handler (operation args) | |
753 (let ((inhibit-file-name-handlers | |
754 (cons 'jka-compr-handler | |
755 (and (eq inhibit-file-name-operation operation) | |
756 inhibit-file-name-handlers))) | |
757 (inhibit-file-name-operation operation)) | |
758 (apply operation args))) | |
759 | |
13887
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
760 ;;;###autoload(defun auto-compression-mode (&optional arg) |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
761 ;;;###autoload "\ |
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
762 ;;;###autoloadToggle automatic file compression and uncompression. |
13887
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
763 ;;;###autoloadWith prefix argument ARG, turn auto compression on if positive, else off. |
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
764 ;;;###autoloadReturns the new status of auto compression (non-nil means on)." |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
765 ;;;###autoload (interactive "P") |
13887
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
766 ;;;###autoload (if (not (fboundp 'jka-compr-installed-p)) |
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
767 ;;;###autoload (progn |
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
768 ;;;###autoload (require 'jka-compr) |
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
769 ;;;###autoload ;; That turned the mode on, so make it initially off. |
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
770 ;;;###autoload (toggle-auto-compression))) |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
771 ;;;###autoload (toggle-auto-compression arg t)) |
13887
4362f8b4f83c
(auto-compression-mode): This is now a stub function
Richard M. Stallman <rms@gnu.org>
parents:
13514
diff
changeset
|
772 |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
773 (defun toggle-auto-compression (&optional arg message) |
13067
fef2a9095f0c
(auto-compression-mode): Add autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents:
12922
diff
changeset
|
774 "Toggle automatic file compression and uncompression. |
6002 | 775 With prefix argument ARG, turn auto compression on if positive, else off. |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
776 Returns the new status of auto compression (non-nil means on). |
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
777 If the argument MESSAGE is non-nil, it means to print a message |
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
778 saying whether the mode is now on or off." |
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
779 (interactive "P\np") |
6002 | 780 (let* ((installed (jka-compr-installed-p)) |
781 (flag (if (null arg) | |
782 (not installed) | |
783 (or (eq arg t) (listp arg) (and (integerp arg) (> arg 0)))))) | |
784 | |
785 (cond | |
786 ((and flag installed) t) ; already installed | |
787 | |
788 ((and (not flag) (not installed)) nil) ; already not installed | |
789 | |
790 (flag | |
791 (jka-compr-install)) | |
792 | |
793 (t | |
794 (jka-compr-uninstall))) | |
795 | |
796 | |
13900
37c5ece37d71
(auto-compression-mode): Add `interactive'.
Richard M. Stallman <rms@gnu.org>
parents:
13887
diff
changeset
|
797 (and message |
6002 | 798 (if flag |
799 (message "Automatic file (de)compression is now ON.") | |
800 (message "Automatic file (de)compression is now OFF."))) | |
801 | |
802 flag)) | |
803 | |
804 (defun jka-compr-build-file-regexp () | |
805 (concat | |
806 "\\(" | |
807 (mapconcat | |
808 'jka-compr-info-regexp | |
809 jka-compr-compression-info-list | |
810 "\\)\\|\\(") | |
811 "\\)")) | |
812 | |
813 | |
814 (defun jka-compr-install () | |
815 "Install jka-compr. | |
11296
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
816 This adds entries to `file-name-handler-alist' and `auto-mode-alist' |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
817 and `inhibit-first-line-modes-suffixes'." |
6002 | 818 |
819 (setq jka-compr-file-name-handler-entry | |
820 (cons (jka-compr-build-file-regexp) 'jka-compr-handler)) | |
821 | |
822 (setq file-name-handler-alist (cons jka-compr-file-name-handler-entry | |
823 file-name-handler-alist)) | |
824 | |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
825 (setq jka-compr-added-to-file-coding-system-alist nil) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
826 |
6002 | 827 (mapcar |
828 (function (lambda (x) | |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
829 ;; Don't do multibyte encoding on the compressed files. |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
830 (let ((elt (cons (jka-compr-info-regexp x) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
831 '(no-conversion . no-conversion)))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
832 (setq file-coding-system-alist |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
833 (cons elt file-coding-system-alist)) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
834 (setq jka-compr-added-to-file-coding-system-alist |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
835 (cons elt jka-compr-added-to-file-coding-system-alist))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
836 |
11179
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
837 (and (jka-compr-info-strip-extension x) |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
838 ;; Make entries in auto-mode-alist so that modes |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
839 ;; are chosen right according to the file names |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
840 ;; sans `.gz'. |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
841 (setq auto-mode-alist |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
842 (cons (list (jka-compr-info-regexp x) |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
843 nil 'jka-compr) |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
844 auto-mode-alist)) |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
845 ;; Also add these regexps to |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
846 ;; inhibit-first-line-modes-suffixes, so that a |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
847 ;; -*- line in the first file of a compressed tar |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
848 ;; file doesn't override tar-mode. |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
849 (setq inhibit-first-line-modes-suffixes |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
850 (cons (jka-compr-info-regexp x) |
9ff0cfb97106
(jka-compr-install): Add items to inhibit-first-line-modes-suffixes.
Richard M. Stallman <rms@gnu.org>
parents:
9493
diff
changeset
|
851 inhibit-first-line-modes-suffixes))))) |
9493
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
852 jka-compr-compression-info-list) |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
853 (setq auto-mode-alist |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
854 (append auto-mode-alist jka-compr-mode-alist-additions))) |
6002 | 855 |
856 | |
857 (defun jka-compr-uninstall () | |
858 "Uninstall jka-compr. | |
7066 | 859 This removes the entries in `file-name-handler-alist' and `auto-mode-alist' |
11296
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
860 and `inhibit-first-line-modes-suffixes' that were added |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
861 by `jka-compr-installed'." |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
862 ;; Delete from inhibit-first-line-modes-suffixes |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
863 ;; what jka-compr-install added. |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
864 (mapcar |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
865 (function (lambda (x) |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
866 (and (jka-compr-info-strip-extension x) |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
867 (setq inhibit-first-line-modes-suffixes |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
868 (delete (jka-compr-info-regexp x) |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
869 inhibit-first-line-modes-suffixes))))) |
c271ed10f874
(jka-compr-install): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11179
diff
changeset
|
870 jka-compr-compression-info-list) |
6002 | 871 |
872 (let* ((fnha (cons nil file-name-handler-alist)) | |
873 (last fnha)) | |
874 | |
875 (while (cdr last) | |
876 (if (eq (cdr (car (cdr last))) 'jka-compr-handler) | |
877 (setcdr last (cdr (cdr last))) | |
878 (setq last (cdr last)))) | |
879 | |
880 (setq file-name-handler-alist (cdr fnha))) | |
881 | |
882 (let* ((ama (cons nil auto-mode-alist)) | |
883 (last ama) | |
884 entry) | |
885 | |
886 (while (cdr last) | |
887 (setq entry (car (cdr last))) | |
9493
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
888 (if (or (member entry jka-compr-mode-alist-additions) |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
889 (and (consp (cdr entry)) |
0160fca3dee1
(jka-compr-mode-compression-info-list): Add .tgz extension.
Richard M. Stallman <rms@gnu.org>
parents:
9084
diff
changeset
|
890 (eq (nth 2 entry) 'jka-compr))) |
6002 | 891 (setcdr last (cdr (cdr last))) |
892 (setq last (cdr last)))) | |
893 | |
19004
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
894 (setq auto-mode-alist (cdr ama))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
895 |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
896 (let* ((ama (cons nil file-coding-system-alist)) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
897 (last ama) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
898 entry) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
899 |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
900 (while (cdr last) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
901 (setq entry (car (cdr last))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
902 (if (member entry jka-compr-added-to-file-coding-system-alist) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
903 (setcdr last (cdr (cdr last))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
904 (setq last (cdr last)))) |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
905 |
f2ce7e947ec9
(jka-compr-added-to-file-coding-system-alist): New var.
Richard M. Stallman <rms@gnu.org>
parents:
18906
diff
changeset
|
906 (setq file-coding-system-alist (cdr ama)))) |
6002 | 907 |
908 | |
909 (defun jka-compr-installed-p () | |
910 "Return non-nil if jka-compr is installed. | |
7066 | 911 The return value is the entry in `file-name-handler-alist' for jka-compr." |
6002 | 912 |
913 (let ((fnha file-name-handler-alist) | |
914 (installed nil)) | |
915 | |
916 (while (and fnha (not installed)) | |
917 (and (eq (cdr (car fnha)) 'jka-compr-handler) | |
918 (setq installed (car fnha))) | |
919 (setq fnha (cdr fnha))) | |
920 | |
921 installed)) | |
922 | |
923 | |
924 ;;; Add the file I/O hook if it does not already exist. | |
925 ;;; Make sure that jka-compr-file-name-handler-entry is eq to the | |
926 ;;; entry for jka-compr in file-name-handler-alist. | |
927 (and (jka-compr-installed-p) | |
928 (jka-compr-uninstall)) | |
929 | |
930 (jka-compr-install) | |
931 | |
932 | |
933 (provide 'jka-compr) | |
934 | |
935 ;; jka-compr.el ends here. |