;;; jka-cmpr-hook.el --- preloaded code to enable jka-compr.el
;; Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2002, 2003,
-;; 2004, 2005, 2006 Free Software Foundation, Inc.
+;; 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: jka@ece.cmu.edu (Jay K. Adams)
;; Maintainer: FSF
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
"jka-compr customization."
:group 'compression)
-;; I have this defined so that .Z files are assumed to be in unix
-;; compress format; and .gz files, in gzip format, and .bz2 files in bzip fmt.
-(defcustom jka-compr-compression-info-list
- ;;[regexp
- ;; compr-message compr-prog compr-args
- ;; uncomp-message uncomp-prog uncomp-args
- ;; can-append auto-mode-flag strip-extension-flag file-magic-bytes]
- '(["\\.Z\\(~\\|\\.~[0-9]+~\\)?\\'"
- "compressing" "compress" ("-c")
- "uncompressing" "uncompress" ("-c")
- nil t "\037\235"]
- ;; Formerly, these had an additional arg "-c", but that fails with
- ;; "Version 0.1pl2, 29-Aug-97." (RedHat 5.1 GNU/Linux) and
- ;; "Version 0.9.0b, 9-Sept-98".
- ["\\.bz2\\'"
- "bzip2ing" "bzip2" nil
- "bunzip2ing" "bzip2" ("-d")
- nil t "BZh"]
- ["\\.tbz\\'"
- "bzip2ing" "bzip2" nil
- "bunzip2ing" "bzip2" ("-d")
- nil nil "BZh"]
- ["\\.tgz\\'"
- "compressing" "gzip" ("-c" "-q")
- "uncompressing" "gzip" ("-c" "-q" "-d")
- t nil "\037\213"]
- ["\\.g?z\\(~\\|\\.~[0-9]+~\\)?\\'"
- "compressing" "gzip" ("-c" "-q")
- "uncompressing" "gzip" ("-c" "-q" "-d")
- t t "\037\213"]
- ;; dzip is gzip with random access. Its compression program can't
- ;; read/write stdin/out, so .dz files can only be viewed without
- ;; saving, having their contents decompressed with gzip.
- ["\\.dz\\'"
- nil nil nil
- "uncompressing" "gzip" ("-c" "-q" "-d")
- nil t "\037\213"])
-
- "List of vectors that describe available compression techniques.
-Each element, which describes a compression technique, is a vector of
-the form [REGEXP COMPRESS-MSG COMPRESS-PROGRAM COMPRESS-ARGS
-UNCOMPRESS-MSG UNCOMPRESS-PROGRAM UNCOMPRESS-ARGS
-APPEND-FLAG STRIP-EXTENSION-FLAG FILE-MAGIC-CHARS], where:
-
- regexp is a regexp that matches filenames that are
- compressed with this format
-
- compress-msg is the message to issue to the user when doing this
- type of compression (nil means no message)
-
- compress-program is a program that performs this compression
- (nil means visit file in read-only mode)
-
- compress-args is a list of args to pass to the compress program
-
- uncompress-msg is the message to issue to the user when doing this
- type of uncompression (nil means no message)
-
- uncompress-program is a program that performs this compression
-
- uncompress-args is a list of args to pass to the uncompress program
-
- append-flag is non-nil if this compression technique can be
- appended
-
- strip-extension-flag non-nil means strip the regexp from file names
- before attempting to set the mode.
-
- file-magic-chars is a string of characters that you would find
- at the beginning of a file compressed in this way.
-
-Because of the way `call-process' is defined, discarding the stderr output of
-a program adds the overhead of starting a shell each time the program is
-invoked.
-
-If you set this outside Custom while Auto Compression mode is
-already enabled \(as it is by default), you have to call
-`jka-compr-update' after setting it to properly update other
-variables. Setting this through Custom does that automatically."
- :type '(repeat (vector regexp
- (choice :tag "Compress Message"
- (string :format "%v")
- (const :tag "No Message" nil))
- (choice :tag "Compress Program"
- (string)
- (const :tag "None" nil))
- (repeat :tag "Compress Arguments" string)
- (choice :tag "Uncompress Message"
- (string :format "%v")
- (const :tag "No Message" nil))
- (choice :tag "Uncompress Program"
- (string)
- (const :tag "None" nil))
- (repeat :tag "Uncompress Arguments" string)
- (boolean :tag "Append")
- (boolean :tag "Strip Extension")
- (string :tag "Magic Bytes")))
- :set 'jka-compr-set
- :group 'jka-compr)
-
-(defcustom jka-compr-mode-alist-additions
- (list (cons "\\.tgz\\'" 'tar-mode) (cons "\\.tbz\\'" 'tar-mode))
- "List of pairs added to `auto-mode-alist' when installing jka-compr.
-Uninstalling jka-compr removes all pairs from `auto-mode-alist' that
-installing added.
-
-If you set this outside Custom while Auto Compression mode is
-already enabled \(as it is by default), you have to call
-`jka-compr-update' after setting it to properly update other
-variables. Setting this through Custom does that automatically."
- :type '(repeat (cons string symbol))
- :set 'jka-compr-set
- :group 'jka-compr)
-
-(defcustom jka-compr-load-suffixes '(".gz")
- "List of compression related suffixes to try when loading files.
-Enabling Auto Compression mode appends this list to `load-file-rep-suffixes',
-which see. Disabling Auto Compression mode removes all suffixes
-from `load-file-rep-suffixes' that enabling added.
-
-If you set this outside Custom while Auto Compression mode is
-already enabled \(as it is by default), you have to call
-`jka-compr-update' after setting it to properly update other
-variables. Setting this through Custom does that automatically."
- :type '(repeat string)
- :set 'jka-compr-set
- :group 'jka-compr)
-
;; List of all the elements we actually added to file-coding-system-alist.
(defvar jka-compr-added-to-file-coding-system-alist nil)
based on the filename itself and `jka-compr-compression-info-list'."
(catch 'compression-info
(let ((case-fold-search nil))
- (mapcar
+ (mapc
(function (lambda (x)
(and (string-match (jka-compr-info-regexp x) filename)
(throw 'compression-info x))))
(set-default variable value)
(jka-compr-update))
+;; I have this defined so that .Z files are assumed to be in unix
+;; compress format; and .gz files, in gzip format, and .bz2 files in bzip fmt.
+
+;; FIXME? It seems ugly that one has to add "\\(~\\|\\.~[0-9]+~\\)?" to
+;; all the regexps here, in order to match backup files etc.
+;; It's trivial to modify jka-compr-get-compression-info to match
+;; regexps against file-name-sans-versions, but this regexp is also
+;; used to build a file-name-handler-alist entry.
+;; find-file-name-handler does not use file-name-sans-versions.
+;; Perhaps it should,
+;; http://lists.gnu.org/archive/html/emacs-devel/2008-02/msg00812.html,
+;; but it's used all over the place and there are probably other ramifications.
+;; One could modify jka-compr-build-file-regexp to add the backup regexp,
+;; but jka-compr-compression-info-list is a defcustom to which
+;; anything could be added, so it's easiest to leave things as they are.
+(defcustom jka-compr-compression-info-list
+ ;;[regexp
+ ;; compr-message compr-prog compr-args
+ ;; uncomp-message uncomp-prog uncomp-args
+ ;; can-append strip-extension-flag file-magic-bytes]
+ '(["\\.Z\\(~\\|\\.~[0-9]+~\\)?\\'"
+ "compressing" "compress" ("-c")
+ ;; gzip is more common than uncompress. It can only read, not write.
+ "uncompressing" "gzip" ("-c" "-q" "-d")
+ nil t "\037\235"]
+ ;; Formerly, these had an additional arg "-c", but that fails with
+ ;; "Version 0.1pl2, 29-Aug-97." (RedHat 5.1 GNU/Linux) and
+ ;; "Version 0.9.0b, 9-Sept-98".
+ ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
+ "bzip2ing" "bzip2" nil
+ "bunzip2ing" "bzip2" ("-d")
+ nil t "BZh"]
+ ["\\.tbz\\'"
+ "bzip2ing" "bzip2" nil
+ "bunzip2ing" "bzip2" ("-d")
+ nil nil "BZh"]
+ ["\\.\\(?:tgz\\|svgz\\|sifz\\)\\(~\\|\\.~[0-9]+~\\)?\\'"
+ "compressing" "gzip" ("-c" "-q")
+ "uncompressing" "gzip" ("-c" "-q" "-d")
+ t nil "\037\213"]
+ ["\\.g?z\\(~\\|\\.~[0-9]+~\\)?\\'"
+ "compressing" "gzip" ("-c" "-q")
+ "uncompressing" "gzip" ("-c" "-q" "-d")
+ t t "\037\213"]
+ ;; dzip is gzip with random access. Its compression program can't
+ ;; read/write stdin/out, so .dz files can only be viewed without
+ ;; saving, having their contents decompressed with gzip.
+ ["\\.dz\\'"
+ nil nil nil
+ "uncompressing" "gzip" ("-c" "-q" "-d")
+ nil t "\037\213"])
+
+ "List of vectors that describe available compression techniques.
+Each element, which describes a compression technique, is a vector of
+the form [REGEXP COMPRESS-MSG COMPRESS-PROGRAM COMPRESS-ARGS
+UNCOMPRESS-MSG UNCOMPRESS-PROGRAM UNCOMPRESS-ARGS
+APPEND-FLAG STRIP-EXTENSION-FLAG FILE-MAGIC-CHARS], where:
+
+ regexp is a regexp that matches filenames that are
+ compressed with this format
+
+ compress-msg is the message to issue to the user when doing this
+ type of compression (nil means no message)
+
+ compress-program is a program that performs this compression
+ (nil means visit file in read-only mode)
+
+ compress-args is a list of args to pass to the compress program
+
+ uncompress-msg is the message to issue to the user when doing this
+ type of uncompression (nil means no message)
+
+ uncompress-program is a program that performs this compression
+
+ uncompress-args is a list of args to pass to the uncompress program
+
+ append-flag is non-nil if this compression technique can be
+ appended
+
+ strip-extension-flag non-nil means strip the regexp from file names
+ before attempting to set the mode.
+
+ file-magic-chars is a string of characters that you would find
+ at the beginning of a file compressed in this way.
+
+If you set this outside Custom while Auto Compression mode is
+already enabled \(as it is by default), you have to call
+`jka-compr-update' after setting it to properly update other
+variables. Setting this through Custom does that automatically."
+ :type '(repeat (vector regexp
+ (choice :tag "Compress Message"
+ (string :format "%v")
+ (const :tag "No Message" nil))
+ (choice :tag "Compress Program"
+ (string)
+ (const :tag "None" nil))
+ (repeat :tag "Compress Arguments" string)
+ (choice :tag "Uncompress Message"
+ (string :format "%v")
+ (const :tag "No Message" nil))
+ (choice :tag "Uncompress Program"
+ (string)
+ (const :tag "None" nil))
+ (repeat :tag "Uncompress Arguments" string)
+ (boolean :tag "Append")
+ (boolean :tag "Strip Extension")
+ (string :tag "Magic Bytes")))
+ :set 'jka-compr-set
+ :group 'jka-compr)
+
+(defcustom jka-compr-mode-alist-additions
+ (list (cons "\\.tgz\\'" 'tar-mode) (cons "\\.tbz\\'" 'tar-mode))
+ "List of pairs added to `auto-mode-alist' when installing jka-compr.
+Uninstalling jka-compr removes all pairs from `auto-mode-alist' that
+installing added.
+
+If you set this outside Custom while Auto Compression mode is
+already enabled \(as it is by default), you have to call
+`jka-compr-update' after setting it to properly update other
+variables. Setting this through Custom does that automatically."
+ :type '(repeat (cons string symbol))
+ :set 'jka-compr-set
+ :group 'jka-compr)
+
+(defcustom jka-compr-load-suffixes '(".gz")
+ "List of compression related suffixes to try when loading files.
+Enabling Auto Compression mode appends this list to `load-file-rep-suffixes',
+which see. Disabling Auto Compression mode removes all suffixes
+from `load-file-rep-suffixes' that enabling added.
+
+If you set this outside Custom while Auto Compression mode is
+already enabled \(as it is by default), you have to call
+`jka-compr-update' after setting it to properly update other
+variables. Setting this through Custom does that automatically."
+ :type '(repeat string)
+ :set 'jka-compr-set
+ :group 'jka-compr)
+
(define-minor-mode auto-compression-mode
"Toggle automatic file compression and uncompression.
With prefix argument ARG, turn auto compression on if positive, else off.