annotate lisp/code-files.el @ 4792:95b04754ea8c

Make #'equalp more compatible with CL; add a compiler macro, test & doc it. lisp/ChangeLog addition: 2009-11-08 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (cl-string-vector-equalp) (cl-bit-vector-vector-equalp, cl-vector-array-equalp) (cl-hash-table-contents-equalp): New functions, to implement equalp treating arrays with identical contents as equivalent, as specified by Common Lisp. (equalp): Revise this function to implement array equivalence, and the hash-table equalp behaviour specified by CL. * cl-macs.el (equalp): Add a compiler macro for this function, used when one of the arguments is constant, and as such, its type is known at compile time. man/ChangeLog addition: 2009-11-08 Aidan Kehoe <kehoea@parhasard.net> * lispref/objects.texi (Equality Predicates): Document #'equalp here, as well as #'equal and #'eq. tests/ChangeLog addition: 2009-12-31 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Test much of the functionality of equalp; add a pointer to Paul Dietz' ANSI test suite for this function, converted to Emacs Lisp. Not including the tests themselves in XEmacs because who owns the copyright on the files is unclear and the GCL people didn't respond to my queries.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 31 Dec 2009 15:09:41 +0000
parents 8905163c49c5
children 308d34e9f07d
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
4650
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
442 ;; If we error, which we may if the file does not exist, we still
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
443 ;; want to set the buffer-file-coding-system if that is
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
444 ;; appropriate:
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
445 (when (eq 'undecided (coding-system-type coding-system))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
446 (setq used-codesys (coding-system-property coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
447 'coding-system))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
448 (if (and used-codesys
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
449 (not (eq 'undecided (coding-system-type used-codesys))))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
450 ;; If this property is available, and not undecided, it should
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
451 ;; be a coding system that we can use to write a file (as
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
452 ;; opposed to the true undecided coding system, which trashes
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
453 ;; non-Latin-1 on writing). It might just be the value of
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
454 ;; coding-system passed to #'insert-file-contents-internal.
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
455 (setq coding-system used-codesys)
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
456 ;; Otherwise, take the value normally specified by the
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
457 ;; language environment:
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
458 (setq coding-system (default-value
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
459 'buffer-file-coding-system))))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
460 (if (local-variable-p 'buffer-file-coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
461 (current-buffer))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
462 (set-buffer-file-coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
463 (subsidiary-coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
464 buffer-file-coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
465 (coding-system-eol-type coding-system)) t t)
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
466 (set-buffer-file-coding-system coding-system t t))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
467 (setq buffer-file-coding-system-when-loaded
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
468 coding-system)
3722
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
469 (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
470 filename visit err)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
471 (signal (car err) (cdr err))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
472 (setq coding-system used-codesys)
4641
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
473 ;; If the file was zero-length, used-codesys is undecided. Set it to
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
474 ;; a more sane value.
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
475 (when (eq 'undecided (coding-system-type coding-system))
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
476 (unless (zerop (buffer-size))
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
477 (warn "%s: autodetection failed: setting to default."
a90b63846dc4 Set buffer-file-coding-system more sensibly with zero-length files.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4385
diff changeset
478 (file-name-nondirectory (buffer-file-name))))
4650
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
479 (setq used-codesys (coding-system-property coding-system
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
480 'coding-system))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
481 (if (and used-codesys
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
482 (not (eq 'undecided (coding-system-type used-codesys))))
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
483 ;; If this property is available, and not undecided, it should
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
484 ;; be a coding system that we can use to write a file (as
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
485 ;; opposed to the true undecided coding system, which trashes
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
486 ;; non-Latin-1 on writing). It might just be the value of
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
487 ;; coding-system passed to #'insert-file-contents-internal.
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
488 (setq coding-system used-codesys)
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
489 ;; Otherwise, take the value normally specified by the
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
490 ;; language environment:
8905163c49c5 #'find-file: set b-f-c-s even on error (cf. non-existent files),
Aidan Kehoe <kehoea@parhasard.net>
parents: 4647
diff changeset
491 (setq coding-system (default-value 'buffer-file-coding-system))))
3722
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
492 ;; 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
493 ;; was used ...
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
494 (let ((func
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
495 (coding-system-property coding-system 'post-read-conversion))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
496 (endmark (make-marker)))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
497 (set-marker endmark (+ (point) (nth 1 return-val)))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
498 (if func
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
499 (unwind-protect
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
500 (save-excursion
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
501 (let (buffer-read-only)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
502 (if (>= (function-max-args func) 2)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
503 ;; #### fuckme! Someone at FSF changed the calling
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
504 ;; convention of post-read-conversion. We try to
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
505 ;; support the old way. #### Should we kill this?
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
506 (funcall func (point) (marker-position endmark))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
507 (funcall func (- (marker-position endmark) (point))))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
508 (if visit
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
509 (progn
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
510 (set-buffer-auto-saved)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
511 (set-buffer-modified-p nil)))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
512 (setcar (cdr return-val) (- (marker-position endmark) (point))))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
513 ;; 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
514 (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
515 filename visit return-val)
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
516 nil
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
517 (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
518 ;; 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
519 ;; 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
520 ;; set already.
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
521 (set-buffer-file-coding-system
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
522 (subsidiary-coding-system
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
523 buffer-file-coding-system
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
524 (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
525 ;; otherwise actually set buffer-file-coding-system.
3950
4cc3828e29bb [xemacs-hg @ 2007-05-12 13:12:26 by aidan]
aidan
parents: 3722
diff changeset
526 (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
527 ;; ... 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
528 ;; 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
529 ;; 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
530 (setq buffer-file-coding-system-when-loaded
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
531 (get-coding-system coding-system))
a0adf5f08c44 [xemacs-hg @ 2006-12-05 08:20:54 by michaels]
michaels
parents: 1733
diff changeset
532 return-val))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (defvar write-region-pre-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 "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
536
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
537 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
538 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
539 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
540
748
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
541 The return value of each function should be one of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 -- nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 -- 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
545 to be used for writing the file
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 -- 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
547 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
548 `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
549 returns.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 If any function returns non-nil, the remaining functions are not called.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (defvar write-region-post-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 "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
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 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
557 FILENAME, APPEND, VISIT, LOCKNAME, and CODING-SYSTEM, the same as the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 corresponding arguments in the call to `write-region'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
560 (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
561 coding-system-or-mustbenew)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 "Write current region into specified file.
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
563 Called interactively, prompts for a file name.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
564 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
565
ca2d04c5710a [xemacs-hg @ 2002-02-12 14:24:39 by stephent]
stephent
parents: 673
diff changeset
566 When called from a program, takes three required arguments:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 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
568 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
569 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
570 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
571 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
572 and unlock for clash detection.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
573 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
574 overriding FILENAME and VISIT.
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
575 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
576 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
577 in the current buffer.
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
578
4308
41e88d0c934e [xemacs-hg @ 2007-12-05 19:22:03 by aidan]
aidan
parents: 4271
diff changeset
579 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
580 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
581 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
582 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
583 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
584 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
585 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
586 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
587 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
588
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 See also `write-region-pre-hook' and `write-region-post-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (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
591 (let (mustbenew coding-system func hook-result)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
592 (setq hook-result
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
593 (or coding-system-for-write
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
594 (run-hook-with-args-until-success
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
595 'write-region-pre-hook
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
596 start end filename append visit lockname
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
597 coding-system-or-mustbenew)
4271
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
598 (if (and coding-system-or-mustbenew
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
599 (coding-system-p
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
600 (find-coding-system coding-system-or-mustbenew)))
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
601 coding-system-or-mustbenew)
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
602 buffer-file-coding-system
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
603 (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
604 (if (consp hook-result)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
605 ;; 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
606 hook-result
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
607 ;; 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
608 (setq hook-result (find-coding-system hook-result)
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
609 mustbenew (unless (coding-system-p
fdf43260ae29 [xemacs-hg @ 2007-11-15 15:24:20 by aidan]
aidan
parents: 4266
diff changeset
610 (find-coding-system coding-system-or-mustbenew))
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
611 coding-system-or-mustbenew)
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
612 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
613 ((null mustbenew) coding-system-or-mustbenew))
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
614 func (coding-system-property coding-system 'pre-write-conversion))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (if func
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 (let ((curbuf (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (tempbuf (generate-new-buffer " *temp-write-buffer*"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 (modif (buffer-modified-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 (set-buffer tempbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (insert-buffer-substring curbuf start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (funcall func (point-min) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (write-region-internal (point-min) (point-max) filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 append
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (if (eq visit t) nil visit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 lockname
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
629 coding-system
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4205
diff changeset
630 mustbenew))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 ;; leaving a buffer associated with file will cause problems
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 ;; when next visiting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (kill-buffer tempbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (if (or visit (null modif))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (set-buffer-auto-saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (set-buffer-modified-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (if (buffer-file-name) (set-visited-file-modtime))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (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
640 coding-system mustbenew)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (run-hook-with-args 'write-region-post-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 start end filename append visit lockname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 coding-system)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 ;;; code-files.el ends here