annotate lisp/code-files.el @ 4614:afbfad080ddd

The URLs in our current config.guess and config.sub files are obsolete. Update to the latest upstream release to get correct URLs, as well as fixes and enhancements to those scripts.
author Jerry James <james@xemacs.org>
date Wed, 11 Feb 2009 11:09:35 -0700
parents 7a8c613ee283
children a90b63846dc4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; code-files.el --- File I/O functions for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1992,93,94,95 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1995 Amdahl Corporation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995 Sun Microsystems.
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
6 ;; Copyright (C) 2001, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
21 ;; along with XEmacs; see the file COPYING. If not, write to the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Synched up with: Not synched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; Derived from mule.el in the original Mule but heavily modified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; by Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;; 1997/3/11 modified by MORIOKA Tomohiko to sync with Emacs 20 API.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; This file was derived from the former mule-files.el which has been removed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; as of XEmacs 21.2.15.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 (put 'buffer-file-coding-system 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
41 (defvar buffer-file-coding-system-when-loaded nil
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
42 "Coding system used when current buffer's file was read in.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
43
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
44 Automatically buffer-local when set in any fashion. This is set
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
45 automatically when a file is loaded and is used when the file needs to be
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
46 reloaded (e.g. `revert-buffer'). Normally this will have the same value as
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
47 `buffer-file-coding-system', but the latter may be changed because it's
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
48 also used to specify the encoding when the file is written out.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
49 (make-variable-buffer-local 'buffer-file-coding-system-when-loaded)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
50 (put 'buffer-file-coding-system-when-loaded 'permanent-local t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
51
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 (define-obsolete-variable-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 'file-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 'buffer-file-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (define-obsolete-variable-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 'overriding-file-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 'coding-system-for-read)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
60 ;; NOTE: The real default value is set in code-init.el.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
61 (defvar buffer-file-coding-system-for-read nil
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
62 "Default coding system used when reading a file.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 This provides coarse-grained control; for finer-grained control, use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 `file-coding-system-alist'. From a Lisp program, if you wish to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 unilaterally specify the coding system used for one particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 operation, you should bind the variable `coding-system-for-read'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 rather than setting this variable, which is intended to be used for
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
68 global environment specification.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
69
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
70 See `insert-file-contents' for a full description of how a file's
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
71 coding system is determined when it is read in.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (define-obsolete-variable-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 'file-coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 'buffer-file-coding-system-for-read)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (defvar file-coding-system-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 `(
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 ;; This must not be necessary, slb suggests -kkm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 ;; ("loaddefs.el$" . (binary . binary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 ,@(mapcar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #'(lambda (regexp) (cons regexp 'binary)) binary-file-regexps)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 ("TUTORIAL\\.\\(?:hr\\|pl\\|ro\\)\\'" . iso-8859-2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 ;; ("\\.\\(el\\|emacs\\|info\\(-[0-9]+\\)?\\|texi\\)$" . iso-2022-8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 ;; ("\\(ChangeLog\\|CHANGES-beta\\)$" . iso-2022-8)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
86
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
87 ;; This idea is totally broken, and the code didn't work anyway.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
88 ;; Mailboxes should be decoded by mail clients, who actually know
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
89 ;; how to deal with them. Otherwise, their contents should be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
90 ;; treated as `binary'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
91 ;("/spool/mail/.*$" . convert-mbox-coding-system)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
92 )
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 "Alist to decide a coding system to use for a file I/O operation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 The format is ((PATTERN . VAL) ...),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 where PATTERN is a regular expression matching a file name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 VAL is a coding system, a cons of coding systems, or a function symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 If VAL is a coding system, it is used for both decoding and encoding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 the file contents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 If VAL is a cons of coding systems, the car part is used for decoding,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 and the cdr part is used for encoding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 If VAL is a function symbol, the function must return a coding system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 or a cons of coding systems which are used as above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 This overrides the more general specification in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 `buffer-file-coding-system-for-read', but is overridden by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 `coding-system-for-read'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
108 (defun set-buffer-file-coding-system (coding-system &optional force nomodify)
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
109 "Set the file coding-system of the current buffer to CODING-SYSTEM.
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
110 This means that when you save the buffer, it will be converted
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
111 according to CODING-SYSTEM. For a list of possible values of CODING-SYSTEM,
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
112 use \\[list-coding-systems].
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
113
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
114 If CODING-SYSTEM leaves the text conversion unspecified, or if it
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
115 leaves the end-of-line conversion unspecified, FORCE controls what to
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
116 do. If FORCE is nil, get the unspecified aspect (or aspects) from the
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
117 buffer's previous `buffer-file-coding-system' value (if it is
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
118 specified there). Otherwise, leave it unspecified.
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
119
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
120 This marks the buffer modified so that the succeeding \\[save-buffer]
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
121 surely saves the buffer with CODING-SYSTEM. From a program, if you
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
122 don't want to mark the buffer modified, specify t for NOMODIFY.
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
123 If you know exactly what coding system you want to use,
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
124 just set the variable `buffer-file-coding-system' directly."
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
125 (interactive "zCoding system for saving file (default nil): \nP")
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
126 (check-coding-system coding-system)
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
127 (if (and coding-system buffer-file-coding-system (null force))
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
128 (setq coding-system
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (subsidiary-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (coding-system-eol-type buffer-file-coding-system))))
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
132 (setq buffer-file-coding-system coding-system)
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
133 ;; XEmacs change; remove a call to ucs-set-table-for-input, which we don't
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
134 ;; have.
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
135 (unless nomodify
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
136 (set-buffer-modified-p t))
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
137 (force-mode-line-update))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (defun toggle-buffer-file-coding-system ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 "Set EOL type of buffer-file-coding-system of the current buffer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 something other than what it is at the moment."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 (let ((eol-type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 (coding-system-eol-type buffer-file-coding-system)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 (setq buffer-file-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 (subsidiary-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (coding-system-base buffer-file-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (cond ((eq eol-type 'lf) 'crlf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 ((eq eol-type 'crlf) 'lf)
673
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 502
diff changeset
150 ((eq eol-type 'cr) 'lf))))
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 502
diff changeset
151 (set-buffer-modified-p t)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (define-obsolete-function-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 'set-file-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 'set-buffer-file-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 (defun set-buffer-file-coding-system-for-read (coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 "Set the coding system used when reading in a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 This is equivalent to setting the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 `buffer-file-coding-system-for-read'. You can also use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 `file-coding-system-alist' to specify the coding system for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 particular files."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (interactive "zFile coding system for read: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (get-coding-system coding-system) ;; correctness check
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 (setq buffer-file-coding-system-for-read coding-system))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 (define-obsolete-function-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 'set-file-coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 'set-buffer-file-coding-system-for-read)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (defun set-default-buffer-file-coding-system (coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 "Set the default value of `buffer-file-coding-system' to CODING-SYSTEM.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 The default value is used both for buffers without associated files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 and for files with no apparent coding system (i.e. primarily ASCII).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 See `buffer-file-coding-system' for more information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (interactive "zDefault file coding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (setq-default buffer-file-coding-system coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (redraw-modeline t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (define-obsolete-function-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 'set-default-file-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 'set-default-buffer-file-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (defun find-file-coding-system-for-read-from-filename (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 "Look up coding system to read a file in `file-coding-system-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 The return value will be nil (no applicable entry) or a coding system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 object (the entry specified a coding system)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (let ((alist file-coding-system-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (found nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (codesys nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 (let ((case-fold-search nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (setq filename (file-name-sans-versions filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (while (and (not found) alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (if (string-match (car (car alist)) filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (setq codesys (cdr (car alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 found t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (setq alist (cdr alist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (when codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (if (functionp codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 (setq codesys (funcall codesys 'insert-file-contents filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (cond ((consp codesys) (find-coding-system (car codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 ((find-coding-system codesys))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 ))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (define-obsolete-function-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 'find-file-coding-system-from-filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 'find-file-coding-system-for-read-from-filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (defun find-file-coding-system-for-write-from-filename (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 "Look up coding system to write a file in `file-coding-system-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 The return value will be nil (no applicable entry) or a coding system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 object (the entry specified a coding system)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (let ((alist file-coding-system-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (found nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (codesys nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (let ((case-fold-search nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (setq filename (file-name-sans-versions filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (while (and (not found) alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (if (string-match (car (car alist)) filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (setq codesys (cdr (car alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 found t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 (setq alist (cdr alist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (when codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 (if (functionp codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 (setq codesys (funcall codesys 'write-region filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 (cond ((consp codesys) (find-coding-system (cdr codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 ((find-coding-system codesys))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 ))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
232 ;; This was completely broken, not only in implementation (does not
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
233 ;; understand MIME), but in concept -- such high-level decoding should
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
234 ;; be done by mail readers, not by IO code! Removed 2000-04-18.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
235
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
236 ;(defun convert-mbox-coding-system (filename visit start end) ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
4385
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
238 (defun load (filename &optional noerror nomessage nosuffix)
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
239 "Execute a file of Lisp code named FILENAME, or load a binary module.
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
240 First tries to find a Lisp file FILENAME with .elc appended, then with .el, then with
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
241 FILENAME unmodified. If unsuccessful, tries to find a binary module FILE with
1733
5903b079bee1 [xemacs-hg @ 2003-10-07 21:52:12 by james]
james
parents: 1699
diff changeset
242 the elements of `module-extensions' appended, one at a time.
5903b079bee1 [xemacs-hg @ 2003-10-07 21:52:12 by james]
james
parents: 1699
diff changeset
243 Searches directories in load-path for Lisp files, and in `module-load-path'
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
244 for binary modules.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 If optional second arg NOERROR is non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 report no error if FILE doesn't exist.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 Print messages at start and end of loading unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 optional third arg NOMESSAGE is non-nil.
1733
5903b079bee1 [xemacs-hg @ 2003-10-07 21:52:12 by james]
james
parents: 1699
diff changeset
249 If optional fourth arg NOSUFFIX is non-nil, don't try adding suffixes
5903b079bee1 [xemacs-hg @ 2003-10-07 21:52:12 by james]
james
parents: 1699
diff changeset
250 .elc, .el, or elements of `module-extensions' to the specified name FILE.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 Return t if file exists."
1111
184461bc8de4 [xemacs-hg @ 2002-11-18 06:52:23 by ben]
ben
parents: 996
diff changeset
252 (declare (special load-modules-quietly))
4385
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
253 (let ((handler (find-file-name-handler filename 'load))
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
254 (path nil))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (funcall handler 'load filename noerror nomessage nosuffix)
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
257 ;; First try to load a Lisp file
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
258 (if (and (> (length filename) 0)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
259 (setq path (locate-file filename load-path
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
260 (and (not nosuffix)
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
261 '(".elc" ".el" "")))))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
262 ;; now use the internal load to actually load the file.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
263 (load-internal
4385
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
264 filename noerror nomessage nosuffix
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
265 (let ((elc ; use string= instead of string-match to keep match-data.
4385
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
266 (equalp ".elc" (substring path -4))))
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
267 (or (and (not elc) coding-system-for-read) ;prefer for source file
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
268 ;; find magic-cookie
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
269 (let ((codesys
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
270 (find-coding-system-magic-cookie-in-file path)))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
271 (when codesys
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
272 (setq codesys (intern codesys))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
273 (if (find-coding-system codesys) codesys)))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
274 (if elc
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
275 ;; if reading a byte-compiled file and we didn't find
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
276 ;; a coding-system magic cookie, then use `binary'.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
277 ;; We need to guarantee that we never do autodetection
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
278 ;; on byte-compiled files because confusion here would
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
279 ;; be a very bad thing. Pre-existing byte-compiled
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
280 ;; files are always in the `binary' coding system.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
281 ;; Also, byte-compiled files always use `lf' to terminate
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
282 ;; a line; don't risk confusion here either.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
283 'binary
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
284 (or (find-file-coding-system-for-read-from-filename path)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
285 ;; looking up in `file-coding-system-alist'.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
286 ;; otherwise use `buffer-file-coding-system-for-read',
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
287 ;; as normal
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
288 buffer-file-coding-system-for-read)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
289 ))))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
290 ;; The file name is invalid, or we want to load a binary module
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
291 (if (and (> (length filename) 0)
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 883
diff changeset
292 (locate-file filename module-load-path
1733
5903b079bee1 [xemacs-hg @ 2003-10-07 21:52:12 by james]
james
parents: 1699
diff changeset
293 (and (not nosuffix) module-extensions)))
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
294 (if (featurep 'modules)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
295 (let ((load-modules-quietly nomessage))
1111
184461bc8de4 [xemacs-hg @ 2002-11-18 06:52:23 by ben]
ben
parents: 996
diff changeset
296 (declare-fboundp (load-module filename)))
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
297 (signal 'file-error '("This XEmacs does not support modules")))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
298 (and (null noerror)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
299 (signal 'file-error (list "Cannot open load file" filename))))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 863
diff changeset
300 ))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (defvar insert-file-contents-access-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 "A hook to make a file accessible before reading it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 `insert-file-contents' calls this hook before doing anything else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 Called with two arguments: FILENAME and VISIT, the same as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 corresponding arguments in the call to `insert-file-contents'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (defvar insert-file-contents-pre-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 "A special hook to decide the coding system used for reading in a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 Before reading a file, `insert-file-contents' calls the functions on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 this hook with arguments FILENAME and VISIT, the same as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 corresponding arguments in the call to `insert-file-contents'. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 these functions, you may refer to the global variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 `buffer-file-coding-system-for-read'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 The return value of the functions should be either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 -- nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 -- A coding system or a symbol denoting it, indicating the coding system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 to be used for reading the file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 -- A list of two elements (absolute pathname and length of data inserted),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 which is used as the return value to `insert-file-contents'. In this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 case, `insert-file-contents' assumes that the function has inserted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 the file for itself and suppresses further reading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 If any function returns non-nil, the remaining functions are not called.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (defvar insert-file-contents-error-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 "A hook to set `buffer-file-coding-system' when a read error has occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 When a file error (e.g. nonexistent file) occurs while read a file,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 `insert-file-contents' calls the functions on this hook with three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 arguments: FILENAME and VISIT (the same as the corresponding arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 in the call to `insert-file-contents') and a cons (SIGNALED-CONDITIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 . SIGNAL-DATA).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 After calling this hook, the error is signalled for real and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 propagates to the caller of `insert-file-contents'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (defvar insert-file-contents-post-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 "A hook to set `buffer-file-coding-system' for the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 After successful reading, `insert-file-contents' calls the functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 on this hook with four arguments: FILENAME and VISIT (the same as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 corresponding arguments in the call to `insert-file-contents'),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 CODING-SYSTEM (the actual coding system used to decode the file), and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 a cons of absolute pathname and length of data inserted (the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 thing as will be returned from `insert-file-contents').")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
351 (defun insert-file-contents (filename &optional visit start end replace)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 "Insert contents of file FILENAME after point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 Returns list of absolute file name and length of data inserted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 If second argument VISIT is non-nil, the buffer's visited filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 and last save file modtime are set, and it is marked unmodified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 If visiting and the file does not exist, visiting is completed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 before the error is signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
4205
579f03038f61 [xemacs-hg @ 2007-10-02 20:08:57 by aidan]
aidan
parents: 3950
diff changeset
359 The optional third and fourth arguments START and END specify what portion
579f03038f61 [xemacs-hg @ 2007-10-02 20:08:57 by aidan]
aidan
parents: 3950
diff changeset
360 of the file to insert, and start at zero, in direct and needless contrast to
579f03038f61 [xemacs-hg @ 2007-10-02 20:08:57 by aidan]
aidan
parents: 3950
diff changeset
361 buffer offsets. That is, values of 0 and 10 for START and END respectively
579f03038f61 [xemacs-hg @ 2007-10-02 20:08:57 by aidan]
aidan
parents: 3950
diff changeset
362 will give the first ten octets of a file.
579f03038f61 [xemacs-hg @ 2007-10-02 20:08:57 by aidan]
aidan
parents: 3950
diff changeset
363
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
364 If VISIT is non-nil, START and END must be nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 If optional fifth argument REPLACE is non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 it means replace the current buffer contents (in the accessible portion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 with the file contents. This is better than simply deleting and inserting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 the whole thing because (1) it preserves some marker positions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 and (2) it puts less data in the undo list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 The coding system used for decoding the file is determined as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
373 1. `coding-system-for-read', if non-nil. (Intended as a temporary overriding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
374 mechanism for use by Lisp code.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
375 2. The result of `insert-file-contents-pre-hook', if non-nil. (Intended for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
376 handling tricky cases where the coding system of the file cannot be
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
377 determined just by looking at the filename's extension and the standard
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
378 auto-detection mechanism isn't suitable, so more clever code is required.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
379 In general, this hook should rarely be used.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
380 3. The matching value for this filename from `file-coding-system-alist',
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
381 if any. (Intended as the standard way of determining encoding from
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
382 the name, or esp. the extension, of the file. Akin to the way
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
383 file-name extensions are used under MS Windows to determine how to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
384 handle the file, but more flexible.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
385 4. `buffer-file-coding-system-for-read', if non-nil. (Intended to be where
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
386 the global default coding system is set. Usually, you want to use
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
387 the value `undecided', to let the system auto-detect according to the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
388 priorities set up by `set-coding-priority-list'. This is usually
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
389 initialized from the `coding-system' property of the current language
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
390 environment.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 5. The coding system 'raw-text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 If a local value for `buffer-file-coding-system' in the current buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 does not exist, it is set to the coding system which was actually used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 for reading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
397 #### This should explain in more detail the exact workings of the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
398 coding-system determination procedure.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 748
diff changeset
399
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 See also `insert-file-contents-access-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 `insert-file-contents-pre-hook', `insert-file-contents-error-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 and `insert-file-contents-post-hook'."
4385
7a8c613ee283 Don't call substitute-in-file-name haphazardly.
Mike Sperber <sperber@deinprogramm.de>
parents: 4308
diff changeset
403 (let ((handler (find-file-name-handler filename 'insert-file-contents)))
3722
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
404 (if handler
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
405 (funcall handler 'insert-file-contents filename visit start end replace)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
406 (let (return-val coding-system used-codesys)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
407 ;; OK, first load the file.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
408 (condition-case err
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
409 (progn
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
410 (run-hook-with-args 'insert-file-contents-access-hook
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
411 filename visit)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
412 ;; determine the coding system to use, as described above.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
413 (setq coding-system
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
414 (or
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
415 ;; #1.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
416 coding-system-for-read
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
417 ;; #2.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
418 (run-hook-with-args-until-success
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
419 'insert-file-contents-pre-hook
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
420 filename visit)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
421 ;; #3.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
422 (find-file-coding-system-for-read-from-filename filename)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
423 ;; #4.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
424 buffer-file-coding-system-for-read
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
425 ;; #5.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
426 'raw-text))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
427 (if (consp coding-system)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
428 (setq return-val coding-system)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
429 (if (null (find-coding-system coding-system))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
430 (progn
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
431 (lwarn 'coding-system 'notice
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
432 "Invalid coding-system (%s), using 'undecided"
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
433 coding-system)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
434 (setq coding-system 'undecided)))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
435 (setq return-val
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
436 (insert-file-contents-internal filename visit start end
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
437 replace coding-system
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
438 ;; store here!
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
439 'used-codesys))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
440 ))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
441 (file-error
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
442 (run-hook-with-args 'insert-file-contents-error-hook
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
443 filename visit err)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
444 (signal (car err) (cdr err))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
445 (setq coding-system used-codesys)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
446 ;; call any `post-read-conversion' for the coding system that
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
447 ;; was used ...
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
448 (let ((func
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
449 (coding-system-property coding-system 'post-read-conversion))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
450 (endmark (make-marker)))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
451 (set-marker endmark (+ (point) (nth 1 return-val)))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
452 (if func
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
453 (unwind-protect
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
454 (save-excursion
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
455 (let (buffer-read-only)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
456 (if (>= (function-max-args func) 2)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
457 ;; #### fuckme! Someone at FSF changed the calling
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
458 ;; convention of post-read-conversion. We try to
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
459 ;; support the old way. #### Should we kill this?
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
460 (funcall func (point) (marker-position endmark))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
461 (funcall func (- (marker-position endmark) (point))))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
462 (if visit
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
463 (progn
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
464 (set-buffer-auto-saved)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
465 (set-buffer-modified-p nil)))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
466 (setcar (cdr return-val) (- (marker-position endmark) (point))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
467 ;; now finally set the buffer's `buffer-file-coding-system' ...
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
468 (if (run-hook-with-args-until-success 'insert-file-contents-post-hook
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
469 filename visit return-val)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
470 nil
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
471 (if (local-variable-p 'buffer-file-coding-system (current-buffer))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
472 ;; if buffer-file-coding-system is already local, just
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
473 ;; set its eol type to what was found, if it wasn't
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
474 ;; set already.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
475 (set-buffer-file-coding-system
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
476 (subsidiary-coding-system
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
477 buffer-file-coding-system
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
478 (coding-system-eol-type coding-system)) t t)
3722
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
479 ;; otherwise actually set buffer-file-coding-system.
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
480 (set-buffer-file-coding-system coding-system t t)))
3722
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
481 ;; ... and `buffer-file-coding-system-when-loaded'. the machinations
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
482 ;; of set-buffer-file-coding-system cause the actual coding system
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
483 ;; object to be stored, so do that here, too.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
484 (setq buffer-file-coding-system-when-loaded
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
485 (get-coding-system coding-system))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
486 return-val))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (defvar write-region-pre-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 "A special hook to decide the coding system used for writing out a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
491 Before writing a file, `write-region' calls the functions on this hook with
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 801
diff changeset
492 arguments START, END, FILENAME, APPEND, VISIT, LOCKNAME and CODING-SYSTEM,
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
493 the same as the corresponding arguments in the call to `write-region'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
495 The return value of each function should be one of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 -- nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 -- A coding system or a symbol denoting it, indicating the coding system
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 801
diff changeset
499 to be used for writing the file
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 -- A list of two elements (absolute pathname and length of data written),
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 801
diff changeset
501 which is used as the return value to `write-region'. In this case,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 801
diff changeset
502 `write-region' assumes that the function has written the file and
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 801
diff changeset
503 returns.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 If any function returns non-nil, the remaining functions are not called.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (defvar write-region-post-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 "A hook called by `write-region' after a file has been written out.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 The functions on this hook are called with arguments START, END,
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
511 FILENAME, APPEND, VISIT, LOCKNAME, and CODING-SYSTEM, the same as the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 corresponding arguments in the call to `write-region'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
514 (defun write-region (start end filename &optional append visit lockname
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
515 coding-system-or-mustbenew)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 "Write current region into specified file.
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
517 Called interactively, prompts for a file name.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
518 With a prefix arg, prompts for a coding system as well.
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
519
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
520 When called from a program, takes three required arguments:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 START, END and FILENAME. START and END are buffer positions.
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
522 APPEND, if non-nil, means append to existing file contents (if any), else
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
523 the file's existing contents are replaced by the specified region.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
524 VISIT, if non-nil, should be a string naming a file. The buffer is marked
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
525 as visiting VISIT. VISIT is also the file name to lock
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
526 and unlock for clash detection.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
527 LOCKNAME, if non-nil, specifies the name to use for locking and unlocking,
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
528 overriding FILENAME and VISIT.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
529 CODING-SYSTEM-OR-MUSTBENEW specifies the coding system used to encode the
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
530 text written. It defaults to the value of `buffer-file-coding-system'
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
531 in the current buffer.
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
532
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
533 For compatibility with GNU Emacs, several arguments are overloaded:
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
534 START may be a string, which is written to the file. END is ignored.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
535 VISIT may take the value t, meaning to set last-save-file-modtime of buffer
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
536 to this file's modtime and mark buffer not modified. With any other
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
537 non-nil value of VISIT, suppress printing of the \"Wrote file\" message.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
538 CODING-SYSTEM-OR-MUSTBENEW may be a non-nil, non-coding-system value.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
539 If it is `excl' and FILENAME already exists, signal `file-already-exists'.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
540 Otherwise, if FILENAME already exists, ask for confirmation before
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
541 writing, and signal `file-already-exists' if not confirmed.
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
542
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 See also `write-region-pre-hook' and `write-region-post-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (interactive "r\nFWrite region to file: \ni\ni\ni\nZCoding-system: ")
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
545 (let (mustbenew coding-system func hook-result)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
546 (setq hook-result
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
547 (or coding-system-for-write
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
548 (run-hook-with-args-until-success
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
549 'write-region-pre-hook
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
550 start end filename append visit lockname
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
551 coding-system-or-mustbenew)
4271
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
552 (if (and coding-system-or-mustbenew
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
553 (coding-system-p
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
554 (find-coding-system coding-system-or-mustbenew)))
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
555 coding-system-or-mustbenew)
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
556 buffer-file-coding-system
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
557 (find-file-coding-system-for-write-from-filename filename)))
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
558 (if (consp hook-result)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
559 ;; One of the `write-region-pre-hook' functions wrote the file.
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
560 hook-result
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
561 ;; The hooks didn't do the work; do it ourselves.
4271
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
562 (setq hook-result (find-coding-system hook-result)
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
563 mustbenew (unless (coding-system-p
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
564 (find-coding-system coding-system-or-mustbenew))
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
565 coding-system-or-mustbenew)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
566 coding-system (cond ((coding-system-p hook-result) hook-result)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
567 ((null mustbenew) coding-system-or-mustbenew))
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
568 func (coding-system-property coding-system 'pre-write-conversion))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (if func
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (let ((curbuf (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (tempbuf (generate-new-buffer " *temp-write-buffer*"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (modif (buffer-modified-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (set-buffer tempbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (insert-buffer-substring curbuf start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (funcall func (point-min) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (write-region-internal (point-min) (point-max) filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 append
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (if (eq visit t) nil visit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 lockname
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
583 coding-system
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
584 mustbenew))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 ;; leaving a buffer associated with file will cause problems
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 ;; when next visiting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (kill-buffer tempbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (if (or visit (null modif))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (set-buffer-auto-saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (set-buffer-modified-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (if (buffer-file-name) (set-visited-file-modtime))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 (write-region-internal start end filename append visit lockname
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
594 coding-system mustbenew)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (run-hook-with-args 'write-region-post-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 start end filename append visit lockname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 coding-system)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 ;;; code-files.el ends here