annotate lisp/files.el @ 826:6728e641994e

[xemacs-hg @ 2002-05-05 11:30:15 by ben] syntax cache, 8-bit-format, lots of code cleanup README.packages: Update info about --package-path. i.c: Create an inheritable event and pass it on to XEmacs, so that ^C can be handled properly. Intercept ^C and signal the event. "Stop Build" in VC++ now works. bytecomp-runtime.el: Doc string changes. compat.el: Some attempts to redo this to make it truly useful and fix the "multiple versions interacting with each other" problem. Not yet done. Currently doesn't work. files.el: Use with-obsolete-variable to avoid warnings in new revert-buffer code. xemacs.mak: Split up CFLAGS into a version without flags specifying the C library. The problem seems to be that minitar depends on zlib, which depends specifically on libc.lib, not on any of the other C libraries. Unless you compile with libc.lib, you get errors -- specifically, no _errno in the other libraries, which must make it something other than an int. (#### But this doesn't seem to obtain in XEmacs, which also uses zlib, and can be linked with any of the C libraries. Maybe zlib is used differently and doesn't need errno, or maybe XEmacs provides an int errno; ... I don't understand. Makefile.in.in: Fix so that packages are around when testing. abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, callint.c, casefiddle.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.h, console-stream.c, console-x.c, console.c, console.h, data.c, device-msw.c, device.c, device.h, dialog-msw.c, dialog-x.c, dired-msw.c, dired.c, doc.c, doprnt.c, dumper.c, editfns.c, elhash.c, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, events.c, events.h, extents.c, extents.h, faces.c, file-coding.c, file-coding.h, fileio.c, fns.c, font-lock.c, frame-gtk.c, frame-msw.c, frame-x.c, frame.c, frame.h, glade.c, glyphs-gtk.c, glyphs-msw.c, glyphs-msw.h, glyphs-x.c, glyphs.c, glyphs.h, gui-msw.c, gui-x.c, gui.h, gutter.h, hash.h, indent.c, insdel.c, intl-win32.c, intl.c, keymap.c, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-ccl.c, mule-charset.c, mule-coding.c, mule-wnnfns.c, nas.c, objects-msw.c, objects-x.c, opaque.c, postgresql.c, print.c, process-nt.c, process-unix.c, process.c, process.h, profile.c, rangetab.c, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-x.c, redisplay.c, redisplay.h, regex.c, regex.h, scrollbar-msw.c, search.c, select-x.c, specifier.c, specifier.h, symbols.c, symsinit.h, syntax.c, syntax.h, syswindows.h, tests.c, text.c, text.h, tooltalk.c, ui-byhand.c, ui-gtk.c, unicode.c, win32.c, window.c: Another big Ben patch. -- FUNCTIONALITY CHANGES: add partial support for 8-bit-fixed, 16-bit-fixed, and 32-bit-fixed formats. not quite done yet. (in particular, needs functions to actually convert the buffer.) NOTE: lots of changes to regex.c here. also, many new *_fmt() inline funs that take an Internal_Format argument. redo syntax cache code. make the cache per-buffer; keep the cache valid across calls to functions that use it. also keep it valid across insertions/deletions and extent changes, as much as is possible. eliminate the junky regex-reentrancy code by passing in the relevant lisp info to the regex routines as local vars. add general mechanism in extents code for signalling extent changes. fix numerous problems with the case-table implementation; yoshiki never properly transferred many algorithms from old-style to new-style case tables. redo char tables to support a default argument, so that mapping only occurs over changed args. change many chartab functions to accept Lisp_Object instead of Lisp_Char_Table *. comment out the code in font-lock.c by default, because font-lock.el no longer uses it. we should consider eliminating it entirely. Don't output bell as ^G in console-stream when not a TTY. add -mswindows-termination-handle to interface with i.c, so we can properly kill a build. add more error-checking to buffer/string macros. add some additional buffer_or_string_() funs. -- INTERFACE CHANGES AFFECTING MORE CODE: switch the arguments of write_c_string and friends to be consistent with write_fmt_string, which must have printcharfun first. change BI_* macros to BYTE_* for increased clarity; similarly for bi_* local vars. change VOID_TO_LISP to be a one-argument function. eliminate no-longer-needed CVOID_TO_LISP. -- char/string macro changes: rename MAKE_CHAR() to make_emchar() for slightly less confusion with make_char(). (The former generates an Emchar, the latter a Lisp object. Conceivably we should rename make_char() -> wrap_char() and similarly for make_int(), make_float().) Similar changes for other *CHAR* macros -- we now consistently use names with `emchar' whenever we are working with Emchars. Any remaining name with just `char' always refers to a Lisp object. rename macros with XSTRING_* to string_* except for those that reference actual fields in the Lisp_String object, following conventions used elsewhere. rename set_string_{data,length} macros (the only ones to work with a Lisp_String_* instead of a Lisp_Object) to set_lispstringp_* to make the difference clear. try to be consistent about caps vs. lowercase in macro/inline-fun names for chars and such, which wasn't the case before. we now reserve caps either for XFOO_ macros that reference object fields (e.g. XSTRING_DATA) or for things that have non-function semantics, e.g. directly modifying an arg (BREAKUP_EMCHAR) or evaluating an arg (any arg) more than once. otherwise, use lowercase. here is a summary of most of the macros/inline funs changed by all of the above changes: BYTE_*_P -> byte_*_p XSTRING_BYTE -> string_byte set_string_data/length -> set_lispstringp_data/length XSTRING_CHAR_LENGTH -> string_char_length XSTRING_CHAR -> string_emchar INTBYTE_FIRST_BYTE_P -> intbyte_first_byte_p INTBYTE_LEADING_BYTE_P -> intbyte_leading_byte_p charptr_copy_char -> charptr_copy_emchar LEADING_BYTE_* -> leading_byte_* CHAR_* -> EMCHAR_* *_CHAR_* -> *_EMCHAR_* *_CHAR -> *_EMCHAR CHARSET_BY_ -> charset_by_* BYTE_SHIFT_JIS* -> byte_shift_jis* BYTE_BIG5* -> byte_big5* REP_BYTES_BY_FIRST_BYTE -> rep_bytes_by_first_byte char_to_unicode -> emchar_to_unicode valid_char_p -> valid_emchar_p Change intbyte_strcmp -> qxestrcmp_c (duplicated functionality). -- INTERFACE CHANGES AFFECTING LESS CODE: use DECLARE_INLINE_HEADER in various places. remove '#ifdef emacs' from XEmacs-only files. eliminate CHAR_TABLE_VALUE(), which duplicated the functionality of get_char_table(). add BUFFER_TEXT_LOOP to simplify iterations over buffer text. define typedefs for signed and unsigned types of fixed sizes (INT_32_BIT, UINT_32_BIT, etc.). create ALIGN_FOR_TYPE as a higher-level interface onto ALIGN_SIZE; fix code to use it. add charptr_emchar_len to return the text length of the character pointed to by a ptr; use it in place of charcount_to_bytecount(..., 1). add emchar_len to return the text length of a given character. add types Bytexpos and Charxpos to generalize Bytebpos/Bytecount and Charbpos/Charcount, in code (particularly, the extents code and redisplay code) that works with either kind of index. rename redisplay struct params with names such as `charbpos' to e.g. `charpos' when they are e.g. a Charxpos, not a Charbpos. eliminate xxDEFUN in place of DEFUN; no longer necessary with changes awhile back to doc.c. split up big ugly combined list of EXFUNs in lisp.h on a file-by-file basis, since other prototypes are similarly split. rewrite some "*_UNSAFE" macros as inline funs and eliminate the _UNSAFE suffix. move most string code from lisp.h to text.h; the string code and text.h code is now intertwined in such a fashion that they need to be in the same place and partially interleaved. (you can't create forward references for inline funs) automated/lisp-tests.el, automated/symbol-tests.el, automated/test-harness.el: Fix test harness to output FAIL messages to stderr when in batch mode. Fix up some problems in lisp-tests/symbol-tests that were causing spurious failures.
author ben
date Sun, 05 May 2002 11:33:57 +0000
parents 6504113e7c2d
children bf645ed7cfe3
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 ;;; files.el --- file input and output commands 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) 1985-1987, 1992-1995, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1995 Sun Microsystems.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
5 ;; Copyright (C) 2001, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Keywords: extensions, dumped
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 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; 02111-1307, USA.
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 ;;; Synched up with: FSF 20.3 (but diverging)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;;; Warning: Merging this file is tough. Beware.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;;; Commentary:
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 ;; This file is dumped with XEmacs.
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 ;; Defines most of XEmacs's file- and directory-handling functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; including basic file visiting, backup generation, link handling,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; ITS-id version control, load- and write-hook handling, and the like.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 ;; XEmacs: Avoid compilation warnings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 (defvar coding-system-for-read)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 (defvar buffer-file-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 (defgroup files nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 "Support editing files."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 :group 'emacs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (defgroup backup nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 "Backups of edited data files."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 :group 'files)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 (defgroup find-file nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 "Finding and editing files."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 :group 'files)
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 ;; XEmacs: In buffer.c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 ;(defconst delete-auto-save-files t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 ; "*Non-nil means delete auto-save file when a buffer is saved or killed.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 ;; FSF has automount-dir-prefix. Our directory-abbrev-alist is more general.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 ;; note: tmp_mnt bogosity conversion is established in paths.el.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (defcustom directory-abbrev-alist nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 "*Alist of abbreviations for file directories.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 A list of elements of the form (FROM . TO), each meaning to replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 FROM with TO when it appears in a directory name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 This replacement is done when setting up the default directory of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 newly visited file. *Every* FROM string should start with \\\\` or ^.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Use this feature when you have directories which you normally refer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 via absolute symbolic links or to eliminate automounter mount points
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 from the beginning of your filenames. Make TO the name of the link,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 and FROM the name it is linked to."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 :type '(repeat (cons :format "%v"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 :value ("\\`" . "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (regexp :tag "From")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (regexp :tag "To")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (defcustom make-backup-files t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 "*Non-nil means make a backup of a file the first time it is saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 This can be done by renaming the file or by copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 Renaming means that XEmacs renames the existing file so that it is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 backup file, then writes the buffer into a new file. Any other names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 that the old file had will now refer to the backup file. The new file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 is owned by you and its group is defaulted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 Copying means that XEmacs copies the existing file into the backup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 file, then writes the buffer on top of the existing file. Any other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 names that the old file had will now refer to the new (edited) file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 The file's owner and group are unchanged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 The choice of renaming or copying is controlled by the variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 `backup-by-copying', `backup-by-copying-when-linked' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 `backup-by-copying-when-mismatch'. See also `backup-inhibited'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 ;; Do this so that local variables based on the file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 ;; are not overridden by the major mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (defvar backup-inhibited nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 "Non-nil means don't make a backup, regardless of the other parameters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 This variable is intended for use by making it local to a buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 But it is local only if you make it local.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (put 'backup-inhibited 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (defcustom backup-by-copying nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 "*Non-nil means always use copying to create backup files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 See documentation of variable `make-backup-files'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 (defcustom backup-by-copying-when-linked nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 "*Non-nil means use copying to create backups for files with multiple names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 This causes the alternate names to refer to the latest version as edited.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 This variable is relevant only if `backup-by-copying' is nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 (defcustom backup-by-copying-when-mismatch nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 "*Non-nil means create backups by copying if this preserves owner or group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 Renaming may still be used (subject to control of other variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 when it would not result in changing the owner or group of the file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 that is, for files which are owned by you and whose group matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 the default for a new file created there by you.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 This variable is relevant only if `backup-by-copying' is nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (defvar backup-enable-predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 #'(lambda (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 (not (or (null name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (string-match "^/tmp/" name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (let ((tmpdir (temp-directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (and tmpdir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (string-match (concat "\\`" (regexp-quote tmpdir) "/")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 tmpdir))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 "Predicate that looks at a file name and decides whether to make backups.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Called with an absolute file name as argument, it returns t to enable backup.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (defcustom buffer-offer-save nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 "*Non-nil in a buffer means offer to save the buffer on exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 even if the buffer is not visiting a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 Automatically local in all buffers."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (make-variable-buffer-local 'buffer-offer-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 ;; FSF uses normal defconst
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (defvaralias 'find-file-visit-truename 'find-file-use-truenames)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (defvaralias 'find-file-existing-other-name 'find-file-compare-truenames)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (defcustom revert-without-query nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 "*Specify which files should be reverted without query.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 The value is a list of regular expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 If the file name matches one of these regular expressions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 then `revert-buffer' reverts the file without querying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 if the file has changed on disk and you have not edited the buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 :type '(repeat (regexp ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (defvar buffer-file-number nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 "The device number and file number of the file visited in the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 The value is a list of the form (FILENUM DEVNUM).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 This pair of numbers uniquely identifies the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 If the buffer is visiting a new file, the value is nil.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (make-variable-buffer-local 'buffer-file-number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (put 'buffer-file-number 'permanent-local t)
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 (defvar buffer-file-numbers-unique (not (memq system-type '(windows-nt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 "Non-nil means that buffer-file-number uniquely identifies files.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (defcustom file-precious-flag nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 "*Non-nil means protect against I/O errors while saving files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 Some modes set this non-nil in particular buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 This feature works by writing the new contents into a temporary file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 and then renaming the temporary file to replace the original.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 In this way, any I/O error in writing leaves the original untouched,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 and there is never any instant where the file is nonexistent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 Note that this feature forces backups to be made by copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 Yet, at the same time, saving a precious file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 breaks any hard links between it and other files."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (defcustom version-control nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 "*Control use of version numbers for backup files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 t means make numeric backup versions unconditionally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 nil means make them for files that have some already.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 `never' means do not make them."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 :group 'backup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 :group 'vc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 ;; This is now defined in efs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 ;(defvar dired-kept-versions 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 ; "*When cleaning directory, number of versions to keep.")
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 (defcustom delete-old-versions nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 "*If t, delete excess backup versions silently.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 If nil, ask confirmation. Any other value prevents any trimming."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 :type '(choice (const :tag "Delete" t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (const :tag "Ask" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 (sexp :tag "Leave" :format "%t\n" other))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 :group 'backup)
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 (defcustom kept-old-versions 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 "*Number of oldest versions to keep when a new numbered backup is made."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 :type 'integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (defcustom kept-new-versions 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 "*Number of newest versions to keep when a new numbered backup is made.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 Includes the new backup. Must be > 0"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 :type 'integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 :group 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (defcustom require-final-newline nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 "*Value of t says silently ensure a file ends in a newline when it is saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 Non-nil but not t says ask user whether to add a newline when there isn't one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 nil means don't add newlines."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 :type '(choice (const :tag "Off" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 (const :tag "Add" t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (sexp :tag "Ask" :format "%t\n" ask))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 :group 'editing-basics)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (defcustom auto-save-default t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 "*Non-nil says by default do auto-saving of every file-visiting buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 :group 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (defcustom auto-save-visited-file-name nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 "*Non-nil says auto-save a buffer in the file it is visiting, when practical.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 Normally auto-save files are written under other names."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 :group 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 (defcustom save-abbrevs nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 "*Non-nil means save word abbrevs too when files are saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 Loading an abbrev file sets this to t."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 :group 'abbrev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (defcustom find-file-run-dired t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 "*Non-nil says run dired if `find-file' is given the name of a directory."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ;;;It is not useful to make this a local variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 ;;;(put 'find-file-not-found-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (defvar find-file-not-found-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 "List of functions to be called for `find-file' on nonexistent file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 These functions are called as soon as the error is detected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 `buffer-file-name' is already set up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 The functions are called in the order given until one of them returns non-nil.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;;;It is not useful to make this a local variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 ;;;(put 'find-file-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (defvar find-file-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 "List of functions to be called after a buffer is loaded from a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 The buffer's local variables (if any) will have been processed before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 functions are called.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (defvar write-file-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 "List of functions to be called before writing out a buffer to a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 If one of them returns non-nil, the file is considered already written
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 and the rest are not called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 These hooks are considered to pertain to the visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 So this list is cleared if you change the visited file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 See also `write-contents-hooks' and `continue-save-buffer'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 ;;; However, in case someone does make it local...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (put 'write-file-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 (defvar local-write-file-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 "Just like `write-file-hooks', except intended for per-buffer use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 The functions in this list are called before the ones in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 `write-file-hooks'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 This variable is meant to be used for hooks that have to do with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 particular visited file. Therefore, it is a permanent local, so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 changing the major mode does not clear it. However, calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 `set-visited-file-name' does clear it.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 (make-variable-buffer-local 'local-write-file-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 (put 'local-write-file-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 ;; #### think about this (added by Sun).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 (put 'after-set-visited-file-name-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (defvar after-set-visited-file-name-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 "List of functions to be called after \\[set-visited-file-name]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 or during \\[write-file].
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
295 You can use this hook to restore local values of `write-file-hooks',
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
296 `after-save-hook', and `revert-buffer-function', which pertain
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 to a specific file and therefore are normally killed by a rename.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
298 Put hooks pertaining to the buffer contents on `write-contents-hooks'
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
299 and `revert-buffer-insert-file-contents-function'.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (defvar write-contents-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 "List of functions to be called before writing out a buffer to a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 If one of them returns non-nil, the file is considered already written
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 and the rest are not called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 These hooks are considered to pertain to the buffer's contents,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 not to the particular visited file; thus, `set-visited-file-name' does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 not clear this variable, but changing the major mode does clear it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 See also `write-file-hooks' and `continue-save-buffer'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 ;; XEmacs addition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 ;; Energize needed this to hook into save-buffer at a lower level; we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 ;; to provide a new output method, but don't want to have to duplicate all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 ;; of the backup file and file modes logic.that does not occur if one uses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 ;; a write-file-hook which returns non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (put 'write-file-data-hooks 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (defvar write-file-data-hooks nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 "List of functions to be called to put the bytes on disk.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 These functions receive the name of the file to write to as argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 The default behavior is to call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (write-region (point-min) (point-max) filename nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 If one of them returns non-nil, the file is considered already written
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 and the rest are not called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 These hooks are considered to pertain to the visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 So this list is cleared if you change the visited file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 See also `write-file-hooks'.")
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 (defcustom enable-local-variables t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 "*Control use of local-variables lists in files you visit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 The value can be t, nil or something else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 A value of t means local-variables lists are obeyed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 nil means they are ignored; anything else means query.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 The command \\[normal-mode] always obeys local-variables lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 and ignores this variable."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 :type '(choice (const :tag "Obey" t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (const :tag "Ignore" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 (sexp :tag "Query" :format "%t\n" other))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (defcustom enable-local-eval 'maybe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 "*Control processing of the \"variable\" `eval' in a file's local variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 The value can be t, nil or something else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 A value of t means obey `eval' variables;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 nil means ignore them; anything else means query.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 The command \\[normal-mode] always obeys local-variables lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 and ignores this variable."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 :type '(choice (const :tag "Obey" t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (const :tag "Ignore" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (sexp :tag "Query" :format "%t\n" other))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 ;; Avoid losing in versions where CLASH_DETECTION is disabled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (or (fboundp 'lock-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (defalias 'lock-buffer 'ignore))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (or (fboundp 'unlock-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (defalias 'unlock-buffer 'ignore))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 ;;FSFmacs bastardized ange-ftp cruft
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 ;; This hook function provides support for ange-ftp host name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 ;; completion. It runs the usual ange-ftp hook, but only for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 ;; completion operations. Having this here avoids the need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 ;; to load ange-ftp when it's not really in use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 ;(defun ange-ftp-completion-hook-function (op &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 ; (if (memq op '(file-name-completion file-name-all-completions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 ; (apply 'ange-ftp-hook-function op args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 ; (let ((inhibit-file-name-handlers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 ; (cons 'ange-ftp-completion-hook-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 ; (and (eq inhibit-file-name-operation op)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 ; inhibit-file-name-handlers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 ; (inhibit-file-name-operation op))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 ; (apply op args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (defun convert-standard-filename (filename)
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
375 "Convert a standard file's name to something suitable for the current OS."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
376 (if (eq system-type 'windows-nt)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
377 (let ((name (copy-sequence filename))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
378 (start 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
379 ;; leave ':' if part of drive specifier
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
380 (if (and (> (length name) 1)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
381 (eq (aref name 1) ?:))
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
382 (setq start 2))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
383 ;; destructively replace invalid filename characters with !
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
384 (while (string-match "[?*:<>|\"\000-\037]" name start)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
385 (aset name (match-beginning 0) ?!)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
386 (setq start (match-end 0)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
387 ;; FSF: [convert directory separators to Windows format ...]
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
388 ;; unneeded in XEmacs.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
389 name)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
390 filename))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
391
428
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 (defun pwd ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 "Show the current default directory."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (interactive nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (message "Directory %s" default-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (defvar cd-path nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 "Value of the CDPATH environment variable, as a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 Not actually set up until the first time you use it.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 (defvar cdpath-previous nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 "Prior value of the CDPATH environment variable.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (defun parse-colon-path (cd-path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 "Explode a colon-separated search path into a list of directory names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 If you think you want to use this, you probably don't. This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 is provided for backward compatibility. A more robust implementation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 of the same functionality is available as `split-path', which see."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (and cd-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (let (cd-list (cd-start 0) cd-colon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (setq cd-path (concat cd-path path-separator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (while (setq cd-colon (string-match path-separator cd-path cd-start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (setq cd-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (nconc cd-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (list (if (= cd-start cd-colon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (substitute-in-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (substring cd-path cd-start cd-colon)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 (setq cd-start (+ cd-colon 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 cd-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (defun cd-absolute (dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 "Change current directory to given absolute file name DIR."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 ;; Put the name into directory syntax now,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 ;; because otherwise expand-file-name may give some bad results.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (setq dir (file-name-as-directory dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 ;; XEmacs change: stig@hackvan.com
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (if find-file-use-truenames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (setq dir (file-truename dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (setq dir (abbreviate-file-name (expand-file-name dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (cond ((not (file-directory-p dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 (error "%s is not a directory" dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 ;; this breaks ange-ftp, which doesn't (can't?) overload `file-executable-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 ;;((not (file-executable-p dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 ;; (error "Cannot cd to %s: Permission denied" dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (setq default-directory dir))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (defun cd (dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 "Make DIR become the current buffer's default directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 If your environment includes a `CDPATH' variable, try each one of that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 colon-separated list of directories when resolving a relative directory name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 ;; XEmacs change? (read-file-name => read-directory-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (list (read-directory-name "Change default directory: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 default-directory default-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (and (member cd-path '(nil ("./")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (null (getenv "CDPATH"))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (if (file-name-absolute-p dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (cd-absolute (expand-file-name dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 ;; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (unless (and cd-path (equal (getenv "CDPATH") cdpath-previous))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 ;;#### Unix-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (let ((trypath (parse-colon-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (setq cdpath-previous (getenv "CDPATH")))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 (setq cd-path (or trypath (list "./")))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 (or (catch 'found
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (mapcar #'(lambda (x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (let ((f (expand-file-name (concat x dir))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (if (file-directory-p f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (cd-absolute f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (throw 'found t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 cd-path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 ;; jwz: give a better error message to those of us with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 ;; good taste not to use a kludge like $CDPATH.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (if (equal cd-path '("./"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 (error "No such directory: %s" (expand-file-name dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (error "Directory not found in $CDPATH: %s" dir)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (defun load-file (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 "Load the Lisp file named FILE."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (interactive "fLoad file: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (load (expand-file-name file) nil nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 ; We now dump utils/lib-complete.el which has improved versions of this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 ;(defun load-library (library)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 ; "Load the library named LIBRARY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 ;This is an interface to the function `load'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ; (interactive "sLoad library: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 ; (load library))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 ;(defun find-library (library)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 ; "Find the library of Lisp code named LIBRARY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 ;This searches `load-path' for a file named either \"LIBRARY\" or \"LIBRARY.el\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 ; (interactive "sFind library file: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 ; (let ((f (locate-file library load-path ":.el:")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 ; (if f
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 ; (find-file f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 ; (error "Couldn't locate library %s" library))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (defun file-local-copy (file &optional buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 "Copy the file FILE into a temporary file on this machine.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 Returns the name of the local copy, or nil, if FILE is directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 accessible."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (let ((handler (find-file-name-handler file 'file-local-copy)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (funcall handler 'file-local-copy file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 nil)))
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 ;; XEmacs change block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 ; We have this in C and use the realpath() system call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 ;(defun file-truename (filename &optional counter prev-dirs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 ; [... lots of code snipped ...]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 ; filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 ;; XEmacs addition. Called from `insert-file-contents-internal'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 ;; at the appropriate time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (defun compute-buffer-file-truename (&optional buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 "Recompute BUFFER's value of `buffer-file-truename'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 based on the current value of `buffer-file-name'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 BUFFER defaults to the current buffer if unspecified."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (set-buffer (or buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (cond ((null buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (setq buffer-file-truename nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 ((setq buffer-file-truename (file-truename buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 ;; it exists, we're done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 ;; the file doesn't exist, but maybe the directory does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (let* ((dir (file-name-directory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (truedir (file-truename dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (if truedir (setq dir truedir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (setq buffer-file-truename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (expand-file-name (file-name-nondirectory buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 dir)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (if (and find-file-use-truenames buffer-file-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (setq buffer-file-name (abbreviate-file-name buffer-file-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 default-directory (file-name-directory buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 buffer-file-truename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 ;; End XEmacs change block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 (defun file-chase-links (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 "Chase links in FILENAME until a name that is not a link.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 Does not examine containing directories for links,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 unlike `file-truename'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (let (tem (count 100) (newname filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (while (setq tem (file-symlink-p newname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (if (= count 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 (error "Apparent cycle of symbolic links for %s" filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 ;; In the context of a link, `//' doesn't mean what XEmacs thinks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (while (string-match "//+" tem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (setq tem (concat (substring tem 0 (1+ (match-beginning 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (substring tem (match-end 0)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 ;; Handle `..' by hand, since it needs to work in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 ;; target of any directory symlink.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 ;; This code is not quite complete; it does not handle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 ;; embedded .. in some cases such as ./../foo and foo/bar/../../../lose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (while (string-match "\\`\\.\\./" tem) ;#### Unix specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (setq tem (substring tem 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (setq newname (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 ;; Do the .. by hand.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (directory-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (file-name-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 ;; Chase links in the default dir of the symlink.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (file-chase-links
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (directory-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (file-name-directory newname))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (setq newname (expand-file-name tem (file-name-directory newname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (setq count (1- count))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 newname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (defun switch-to-other-buffer (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 "Switch to the previous buffer. With a numeric arg, n, switch to the nth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 most recent buffer. With an arg of 0, buries the current buffer at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 bottom of the buffer stack."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (if (eq arg 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (bury-buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (switch-to-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (if (<= arg 1) (other-buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (nth (1+ arg) (buffer-list)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (defun switch-to-buffer-other-window (buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 "Select buffer BUFFER in another window."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (interactive "BSwitch to buffer in other window: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (let ((pop-up-windows t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 ;; XEmacs: this used to have (selected-frame) as the third argument,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 ;; but this is obnoxious. If the user wants the buffer in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 ;; different frame, then it should be this way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 ;; Change documented above undone --mrb
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (pop-to-buffer buffer t (selected-frame))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (defun switch-to-buffer-other-frame (buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 "Switch to buffer BUFFER in a newly-created frame."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (interactive "BSwitch to buffer in other frame: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (let* ((name (get-frame-name-for-buffer buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (frame (make-frame (if name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (list (cons 'name (symbol-name name)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (pop-to-buffer buffer t frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (make-frame-visible frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
602 (defun switch-to-next-buffer (&optional n)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
603 "Switch to the next-most-recent buffer.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
604 This essentially rotates the buffer list forward.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
605 N (interactively, the prefix arg) specifies how many times to rotate
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
606 forward, and defaults to 1. Buffers whose name begins with a space
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
607 \(i.e. \"invisible\" buffers) are ignored."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
608 ;; Here is a different interactive spec. Look up the function
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
609 ;; `interactive' (i.e. `C-h f interactive') to understand how this
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
610 ;; all works.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
611 (interactive "p")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
612 (dotimes (n (or n 1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
613 (loop
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
614 do (bury-buffer (car (buffer-list)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
615 while (funcall buffers-tab-omit-function (car (buffer-list))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
616 (switch-to-buffer (car (buffer-list)))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
617
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
618 (defun switch-to-previous-buffer (&optional n)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
619 "Switch to the previously most-recent buffer.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
620 This essentially rotates the buffer list backward.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
621 N (interactively, the prefix arg) specifies how many times to rotate
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
622 backward, and defaults to 1. Buffers whose name begins with a space
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
623 \(i.e. \"invisible\" buffers) are ignored."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
624 (interactive "p")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
625 (dotimes (n (or n 1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
626 (loop
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
627 do (switch-to-buffer (car (last (buffer-list))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
628 while (funcall buffers-tab-omit-function (car (buffer-list))))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
629
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
630 (defun switch-to-next-buffer-in-group (&optional n)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
631 "Switch to the next-most-recent buffer in the current group.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
632 This essentially rotates the buffer list forward.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
633 N (interactively, the prefix arg) specifies how many times to rotate
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
634 forward, and defaults to 1. Buffers whose name begins with a space
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
635 \(i.e. \"invisible\" buffers) are ignored."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
636 (interactive "p")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
637 (dotimes (n (or n 1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
638 (let ((curbuf (car (buffer-list))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
639 (loop
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
640 do (bury-buffer (car (buffer-list)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
641 while (or (funcall buffers-tab-omit-function (car (buffer-list)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
642 (not (funcall buffers-tab-selection-function
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
643 curbuf (car (buffer-list)))))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
644 (switch-to-buffer (car (buffer-list)))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
645
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
646 (defun switch-to-previous-buffer-in-group (&optional n)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
647 "Switch to the previously most-recent buffer in the current group.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
648 This essentially rotates the buffer list backward.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
649 N (interactively, the prefix arg) specifies how many times to rotate
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
650 backward, and defaults to 1. Buffers whose name begins with a space
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
651 \(i.e. \"invisible\" buffers) are ignored."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
652 (interactive "p")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
653 (dotimes (n (or n 1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
654 (let ((curbuf (car (buffer-list))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
655 (loop
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
656 do (switch-to-buffer (car (last (buffer-list))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
657 while (or (funcall buffers-tab-omit-function (car (buffer-list)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
658 (not (funcall buffers-tab-selection-function
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
659 curbuf (car (buffer-list)))))))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
660
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 (defun find-file (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 "Edit file FILENAME.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
663 Switch to a buffer visiting file FILENAME, creating one if none already
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
664 exists. Optional second argument specifies the coding system to use when
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
665 decoding the file. Interactively, with a prefix argument, you will be
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
666 prompted for the coding system.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
667
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
668 If you do not explicitly specify a coding system, the coding system
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
669 is determined as follows:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
670
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
671 1. `coding-system-for-read', if non-nil. (This is used by Lisp programs to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
672 temporarily set an overriding coding system and should almost never
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
673 apply here in `find-file'.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
674 2. The result of `insert-file-contents-pre-hook', if non-nil. (This is a
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
675 complex interface for handling special cases.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
676 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: 727
diff changeset
677 if any. (This lets you specify the coding system to be used for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
678 files with particular extensions, names, etc.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
679 4. `buffer-file-coding-system-for-read', if non-nil. (This is the global
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
680 default -- normally `undecided', so the built-in auto-detection
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
681 mechanism can do its thing.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
682 5. The coding system 'raw-text.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
683
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
684 See `insert-file-contents' for more details about how the process of
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
685 determining the coding system works."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 (interactive "FFind file: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 (switch-to-buffer (find-file-noselect filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 (switch-to-buffer (find-file-noselect filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 (defun find-file-other-window (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 "Edit file FILENAME, in another window.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
695 May create a new window, or reuse an existing one. See the function
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
696 `display-buffer'. Optional second argument specifies the coding system to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
697 use when decoding the file. Interactively, with a prefix argument, you
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
698 will be prompted for the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 (interactive "FFind file in other window: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (switch-to-buffer-other-window (find-file-noselect filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 (switch-to-buffer-other-window (find-file-noselect filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 (defun find-file-other-frame (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 "Edit file FILENAME, in a newly-created frame.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
708 Optional second argument specifies the coding system to use when decoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
709 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
710 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 (interactive "FFind file in other frame: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 (switch-to-buffer-other-frame (find-file-noselect filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (switch-to-buffer-other-frame (find-file-noselect filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (defun find-file-read-only (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 "Edit file FILENAME but don't allow changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 Like \\[find-file] but marks buffer as read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 Use \\[toggle-read-only] to permit editing.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
722 Optional second argument specifies the coding system to use when decoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
723 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
724 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 (interactive "fFind file read-only: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (find-file filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 (find-file filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 (defun find-file-read-only-other-window (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 "Edit file FILENAME in another window but don't allow changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 Like \\[find-file-other-window] but marks buffer as read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 Use \\[toggle-read-only] to permit editing.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
738 Optional second argument specifies the coding system to use when decoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
739 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
740 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 (interactive "fFind file read-only other window: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 (find-file-other-window filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 (find-file-other-window filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 (defun find-file-read-only-other-frame (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 "Edit file FILENAME in another frame but don't allow changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 Like \\[find-file-other-frame] but marks buffer as read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 Use \\[toggle-read-only] to permit editing.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
754 Optional second argument specifies the coding system to use when decoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
755 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
756 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 (interactive "fFind file read-only other frame: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 (find-file-other-frame filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 (find-file-other-frame filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (defun find-alternate-file-other-window (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 "Find file FILENAME as a replacement for the file in the next window.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
768 This command does not select that window. Optional second argument
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
769 specifies the coding system to use when decoding the file. Interactively,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 with a prefix argument, you will be prompted for the coding system."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (other-window 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (let ((file buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 (file-dir nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (and file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 (setq file-name (file-name-nondirectory file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 file-dir (file-name-directory file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (list (read-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 "Find alternate file: " file-dir nil nil file-name)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
782 (if current-prefix-arg (read-coding-system "Coding-system: "))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (if (one-window-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 (find-file-other-window filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (other-window 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (find-alternate-file filename codesys))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 (defun find-alternate-file (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 "Find file FILENAME, select its buffer, kill previous buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 If the current buffer now contains an empty file that you just visited
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
792 \(presumably by mistake), use this command to visit the file you really
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
793 want. Optional second argument specifies the coding system to use when
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
794 decoding the file. Interactively, with a prefix argument, you will be
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
795 prompted for the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 (let ((file buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 (file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 (file-dir nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (and file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (setq file-name (file-name-nondirectory file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 file-dir (file-name-directory file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 (list (read-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 "Find alternate file: " file-dir nil nil file-name)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
805 (if current-prefix-arg (read-coding-system "Coding-system: ")))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 (and (buffer-modified-p) (buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 ;; (not buffer-read-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 (not (yes-or-no-p (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 "Buffer %s is modified; kill anyway? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (buffer-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 (error "Aborted"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (let ((obuf (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 (ofile buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 (onum buffer-file-number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 (otrue buffer-file-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (oname (buffer-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 (if (get-buffer " **lose**")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 (kill-buffer " **lose**"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 (rename-buffer " **lose**")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (setq buffer-file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 (setq buffer-file-number nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (setq buffer-file-truename nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (unlock-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (find-file filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 (find-file filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 (cond ((eq obuf (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 (setq buffer-file-name ofile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 (setq buffer-file-number onum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 (setq buffer-file-truename otrue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 (lock-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (rename-buffer oname))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 (or (eq (current-buffer) obuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 (kill-buffer obuf))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (defun create-file-buffer (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 "Create a suitably named buffer for visiting FILENAME, and return it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 FILENAME (sans directory) is used unchanged if that name is free;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 otherwise a string <2> or <3> or ... is appended to get an unused name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 (let ((handler (find-file-name-handler filename 'create-file-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (funcall handler 'create-file-buffer filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 (let ((lastname (file-name-nondirectory filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (if (string= lastname "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 (setq lastname filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (generate-new-buffer lastname)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 (defun generate-new-buffer (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 "Create and return a buffer with a name based on NAME.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 Choose the buffer's name using `generate-new-buffer-name'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 (get-buffer-create (generate-new-buffer-name name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 (defvar abbreviated-home-dir nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 "The user's homedir abbreviated according to `directory-abbrev-alist'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 (defun abbreviate-file-name (filename &optional hack-homedir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 "Return a version of FILENAME shortened using `directory-abbrev-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 See documentation of variable `directory-abbrev-alist' for more information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 If optional argument HACK-HOMEDIR is non-nil, then this also substitutes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 \"~\" for the user's home directory."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 (let ((handler (find-file-name-handler filename 'abbreviate-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (funcall handler 'abbreviate-file-name filename hack-homedir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 ;; Get rid of the prefixes added by the automounter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 ;;(if (and (string-match automount-dir-prefix filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 ;; (file-exists-p (file-name-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 ;; (substring filename (1- (match-end 0))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 ;; (setq filename (substring filename (1- (match-end 0)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 (let ((tail directory-abbrev-alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 ;; If any elt of directory-abbrev-alist matches this name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 ;; abbreviate accordingly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (while tail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (when (string-match (car (car tail)) filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 (setq filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 (concat (cdr (car tail)) (substring filename (match-end 0)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 (setq tail (cdr tail))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 (when hack-homedir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 ;; Compute and save the abbreviated homedir name.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
883 ;; We defer computing this until the first time it's needed,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
884 ;; to give time for directory-abbrev-alist to be set properly.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
885 ;; We include the separator at the end, to avoid spurious
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
886 ;; matches such as `/usr/foobar' when the home dir is
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
887 ;; `/usr/foo'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 (or abbreviated-home-dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 (setq abbreviated-home-dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 (let ((abbreviated-home-dir "$foo"))
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
891 (concat "\\`"
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
892 (regexp-quote
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
893 (abbreviate-file-name (expand-file-name "~")))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
894 "\\("
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
895 (regexp-quote (string directory-sep-char))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
896 "\\|\\'\\)"))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 ;; If FILENAME starts with the abbreviated homedir,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 ;; make it start with `~' instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (if (and (string-match abbreviated-home-dir filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 ;; If the home dir is just /, don't change it.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
901 (not (and (= (match-end 0) 1)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
902 (= (aref filename 0) directory-sep-char)))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
903 (not (and (eq system-type 'windows-nt)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 (save-match-data
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
905 (string-match (concat "\\`[a-zA-Z]:"
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
906 (regexp-quote
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
907 (string directory-sep-char))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
908 "\\'")
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
909 filename)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 (setq filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 (concat "~"
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
912 (match-string 1 filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 (substring filename (match-end 0))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 (defcustom find-file-not-true-dirname-list nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 "*List of logical names for which visiting shouldn't save the true dirname."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 :type '(repeat (string :tag "Name"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 :group 'find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 ;; This function is needed by FSF vc.el. I hope somebody can make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 ;; work for XEmacs. -sb.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 ;; #### In what way does it not work? --hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 (defun find-buffer-visiting (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 "Return the buffer visiting file FILENAME (a string).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 This is like `get-file-buffer', except that it checks for any buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 visiting the same file, possibly under a different name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 If there is no such live buffer, return nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 (let ((buf (get-file-buffer filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 (truename (abbreviate-file-name (file-truename filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 (or buf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 (let ((list (buffer-list)) found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 (while (and (not found) list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 (set-buffer (car list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 (if (and buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 (string= buffer-file-truename truename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 (setq found (car list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 (setq list (cdr list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 (let ((number (nthcdr 10 (file-attributes truename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 (list (buffer-list)) found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 (and buffer-file-numbers-unique
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 (while (and (not found) list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 (set-buffer (car list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 (if (and buffer-file-number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 (equal buffer-file-number number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 ;; Verify this buffer's file number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 ;; still belongs to its file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (file-exists-p buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 (equal (nthcdr 10 (file-attributes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 number))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 (setq found (car list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 (setq list (cdr list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 found))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
959 (defun insert-file-contents-literally (filename &optional visit start end replace)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 "Like `insert-file-contents', q.v., but only reads in the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 A buffer may be modified in several ways after reading into the buffer due
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
962 to advanced Emacs features, such as format decoding, character code
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
963 conversion, find-file-hooks, automatic uncompression, etc.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
964
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 This function ensures that none of these modifications will take place."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
966 (let ((wrap-func (find-file-name-handler filename
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
967 'insert-file-contents-literally)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
968 (if wrap-func
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
969 (funcall wrap-func 'insert-file-contents-literally filename
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
970 visit start end replace)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
971 (let ((file-name-handler-alist nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
972 (format-alist nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
973 (after-insert-file-functions nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
974 (coding-system-for-read 'binary)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
975 (coding-system-for-write 'binary)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
976 (find-buffer-file-type-function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
977 (if (fboundp 'find-buffer-file-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
978 (symbol-function 'find-buffer-file-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
979 nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
980 (unwind-protect
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
981 (progn
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
982 (fset 'find-buffer-file-type (lambda (filename) t))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
983 (insert-file-contents filename visit start end replace))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
984 (if find-buffer-file-type-function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
985 (fset 'find-buffer-file-type find-buffer-file-type-function)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
986 (fmakunbound 'find-buffer-file-type)))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 (defun find-file-noselect (filename &optional nowarn rawfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 "Read file FILENAME into a buffer and return the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 If a buffer exists visiting FILENAME, return that one, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 verify that the file has not changed since visited or saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 The buffer is not selected, just returned to the caller.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 If NOWARN is non-nil, warning messages will be suppressed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 If RAWFILE is non-nil, the file is read literally."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 (setq filename (abbreviate-file-name (expand-file-name filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 (if (file-directory-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 (if (and (fboundp 'dired-noselect) find-file-run-dired)
526
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
998 (declare-fboundp
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
999 (dired-noselect (if find-file-use-truenames
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
1000 (abbreviate-file-name (file-truename filename))
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
1001 filename)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 (error "%s is a directory" filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 (let* ((buf (get-file-buffer filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 (truename (abbreviate-file-name (file-truename filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 (number (nthcdr 10 (file-attributes truename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 ; ;; Find any buffer for a file which has same truename.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 ; (other (and (not buf) (find-buffer-visiting filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (error nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 ; ;; Let user know if there is a buffer with the same truename.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 ; (if (and (not buf) same-truename (not nowarn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 ; (message "%s and %s are the same file (%s)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 ; filename (buffer-file-name same-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 ; truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 ; (if (and (not buf) same-number (not nowarn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 ; (message "%s and %s are the same file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 ; filename (buffer-file-name same-number))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 ; ;; Optionally also find that buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 ; (if (or find-file-existing-other-name find-file-visit-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 ; (setq buf (or same-truename same-number)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 (when (and buf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 (or find-file-compare-truenames find-file-use-truenames)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 (not nowarn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 (if (not (string-equal buffer-file-name filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 (message "%s and %s are the same file (%s)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 filename buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 buffer-file-truename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 (if buf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 (or nowarn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 (verify-visited-file-modtime buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 (cond ((not (file-exists-p filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 (error "File %s no longer exists!" filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 ;; Certain files should be reverted automatically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 ;; if they have changed on disk and not in the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 ((and (not (buffer-modified-p buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 (dolist (rx revert-without-query nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 (when (string-match rx filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 (return t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 (with-current-buffer buf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 (message "Reverting file %s..." filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 (revert-buffer t t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 (message "Reverting file %s... done" filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 ((yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (if (string= (file-name-nondirectory filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 (buffer-name buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (if (buffer-modified-p buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 (gettext "File %s changed on disk. Discard your edits? ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 (gettext "File %s changed on disk. Reread from disk? "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 (file-name-nondirectory filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 (if (buffer-modified-p buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 (gettext "File %s changed on disk. Discard your edits in %s? ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 (gettext "File %s changed on disk. Reread from disk into %s? "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 (file-name-nondirectory filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 (buffer-name buf))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 (with-current-buffer buf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 (revert-buffer t t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 ;; Else: we must create a new buffer for filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 ;;; The truename stuff makes this obsolete.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 ;;; (let* ((link-name (car (file-attributes filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 ;;; (linked-buf (and (stringp link-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 ;;; (get-file-buffer link-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 ;;; (if (bufferp linked-buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 ;;; (message "Symbolic link to file in buffer %s"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 ;;; (buffer-name linked-buf))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 (setq buf (create-file-buffer filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 ;; Catch various signals, such as QUIT, and kill the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 ;; in that case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 (condition-case data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 (set-buffer-major-mode buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 (if rawfile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 (insert-file-contents-literally filename t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 (insert-file-contents filename t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 (when (and (file-exists-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 (not (file-readable-p filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 (signal 'file-error (list "File is not readable" filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 (if rawfile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 ;; Unconditionally set error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 (setq error t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 (or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 ;; Run find-file-not-found-hooks until one returns non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 (run-hook-with-args-until-success 'find-file-not-found-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 ;; If they fail too, set error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 (setq error t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 ;; Find the file's truename, and maybe use that as visited name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 ;; automatically computed in XEmacs, unless jka-compr was used!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 (unless buffer-file-truename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 (setq buffer-file-truename truename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 (setq buffer-file-number number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 (and find-file-use-truenames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 ;; This should be in C. Put pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 ;; abbreviations that have been explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 ;; requested back into the pathname. Most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 ;; importantly, strip out automounter /tmp_mnt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 ;; directories so that auto-save will work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 (setq buffer-file-name (abbreviate-file-name buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 ;; Set buffer's default directory to that of the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 (setq default-directory (file-name-directory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 ;; Turn off backup files for certain file names. Since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 ;; this is a permanent local, the major mode won't eliminate it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 (and (not (funcall backup-enable-predicate buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 (make-local-variable 'backup-inhibited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 (setq backup-inhibited t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 (if rawfile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 ;; #### FSF 20.3 sets buffer-file-coding-system to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 ;; `no-conversion' here. Should we copy? It also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 ;; makes `find-file-literally' a local variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 ;; and sets it to t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 (after-find-file error (not nowarn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 (setq buf (current-buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 (kill-buffer buf)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1126 (signal (car data) (cdr data))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1127 ))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 ;; FSF has `insert-file-literally' and `find-file-literally' here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 (defvar after-find-file-from-revert-buffer nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 (defun after-find-file (&optional error warn noauto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 after-find-file-from-revert-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 nomodes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 "Called after finding a file and by the default revert function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 Sets buffer mode, parses local variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 Optional args ERROR, WARN, and NOAUTO: ERROR non-nil means there was an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 error in reading the file. WARN non-nil means warn if there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 exists an auto-save file more recent than the visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 NOAUTO means don't mess with auto-save mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 Fourth arg AFTER-FIND-FILE-FROM-REVERT-BUFFER non-nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 means this call was from `revert-buffer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 Fifth arg NOMODES non-nil means don't alter the file's modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 Finishes by calling the functions in `find-file-hooks'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 (setq buffer-read-only (not (file-writable-p buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 (if noninteractive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 (let* (not-serious
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 (msg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 (cond ((and error (file-attributes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 (gettext "File exists, but cannot be read."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 ((not buffer-read-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 (if (and warn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 (file-newer-than-file-p (make-auto-save-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 (format "%s has auto save data; consider M-x recover-file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 (file-name-nondirectory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 (setq not-serious t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 (if error (gettext "(New file)") nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 ((not error)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 (setq not-serious t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 (gettext "Note: file is write protected"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 ((file-attributes (directory-file-name default-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 (gettext "File not found and directory write-protected"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 ((file-exists-p (file-name-directory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 (setq buffer-read-only nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 ;; If the directory the buffer is in doesn't exist,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 ;; offer to create it. It's better to do this now
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 ;; than when we save the buffer, because we want
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 ;; autosaving to work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 ;; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 (or (file-exists-p (file-name-directory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 (if (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 "\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 The directory containing %s does not exist. Create? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 (abbreviate-file-name buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 (make-directory (file-name-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 (quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 (kill-buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 (signal 'quit nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 (if msg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 (message "%s" msg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 (or not-serious (sit-for 1 t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 (if (and auto-save-default (not noauto))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 (auto-save-mode t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 (unless nomodes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 (normal-mode t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 (run-hooks 'find-file-hooks)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 (defun normal-mode (&optional find-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 "Choose the major mode for this buffer automatically.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 Also sets up any specified local variables of the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 Uses the visited file name, the -*- line, and the local variables spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 This function is called automatically from `find-file'. In that case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 we may set up specified local variables depending on the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 `enable-local-variables': if it is t, we do; if it is nil, we don't;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 otherwise, we query. `enable-local-variables' is ignored if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 run `normal-mode' explicitly."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 (or find-file (funcall (or default-major-mode 'fundamental-mode)))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1213 (and (with-trapping-errors
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1214 :operation "File mode specification"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1215 :class 'file-mode-spec
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1216 :error-form nil
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1217 (set-auto-mode)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1218 t)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1219 (with-trapping-errors
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1220 :operation "File local-variables"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1221 :class 'local-variables
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1222 :error-form nil
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
1223 (hack-local-variables (not find-file)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 ;; #### This variable sucks in the package model. There should be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 ;; way for new packages to add their entries to auto-mode-alist in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 ;; clean way. Per Abrahamsen suggested splitting auto-mode-alist to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 ;; several distinct variables such as, in order of precedence,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 ;; `user-auto-mode-alist' for users, `package-auto-mode-alist' for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 ;; packages and `auto-mode-alist' (which might also be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 ;; `default-auto-mode-alist') for default stuff, such as some of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 ;; entries below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 (defvar auto-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 '(("\\.te?xt\\'" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 ("\\.[chi]\\'" . c-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 ("\\.el\\'" . emacs-lisp-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 ("\\.\\(?:[CH]\\|cc\\|hh\\)\\'" . c++-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 ("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . c++-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 ("\\.java\\'" . java-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 ("\\.idl\\'" . idl-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 ("\\.f\\(?:or\\)?\\'" . fortran-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 ("\\.F\\(?:OR\\)?\\'" . fortran-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 ("\\.[fF]90\\'" . f90-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 ;;; Less common extensions come here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 ;;; so more common ones above are found faster.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 ("\\.\\([pP][Llm]\\|al\\)\\'" . perl-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 ("\\.py\\'" . python-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 ("\\.texi\\(?:nfo\\)?\\'" . texinfo-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 ("\\.ad[abs]\\'" . ada-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 ("\\.c?l\\(?:i?sp\\)?\\'" . lisp-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 ("\\.p\\(?:as\\)?\\'" . pascal-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 ("\\.ltx\\'" . latex-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 ("\\.[sS]\\'" . asm-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 ("[Cc]hange.?[Ll]og?\\(?:.[0-9]+\\)?\\'" . change-log-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 ("\\$CHANGE_LOG\\$\\.TXT" . change-log-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 ("\\.scm?\\(?:\\.[0-9]*\\)?\\'" . scheme-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 ("\\.e\\'" . eiffel-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 ("\\.mss\\'" . scribe-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 ("\\.m\\(?:[mes]\\|an\\)\\'" . nroff-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 ("\\.icn\\'" . icon-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 ("\\.\\(?:[ckz]?sh\\|shar\\)\\'" . sh-mode)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1263 ("\\.[Pp][Rr][Oo]\\'" . idlwave-mode)
792
4e83fdb13eb9 [xemacs-hg @ 2002-03-23 05:08:47 by youngs]
youngs
parents: 776
diff changeset
1264 ("\\.si\\(v\\|eve\\)\\'" . sieve-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 ;; #### Unix-specific!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 ("/\\.\\(?:bash_\\|z\\)?\\(profile\\|login\\|logout\\)\\'" . sh-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 ("/\\.\\(?:[ckz]sh\\|bash\\|tcsh\\|es\\|xinit\\|startx\\)rc\\'" . sh-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 ("/\\.\\(?:[kz]shenv\\|xsession\\)\\'" . sh-mode)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1269 ("\\.m?spec$" .sh-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 ;; The following come after the ChangeLog pattern for the sake of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 ;; ChangeLog.1, etc. and after the .scm.[0-9] pattern too.
688
c9d38610941f [xemacs-hg @ 2001-12-05 12:29:17 by michaels]
michaels
parents: 663
diff changeset
1272 ("\\.[123456789]\\'" . nroff-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 ("\\.[tT]e[xX]\\'" . tex-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 ("\\.\\(?:sty\\|cls\\|bbl\\)\\'" . latex-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 ("\\.bib\\'" . bibtex-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 ("\\.article\\'" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 ("\\.letter\\'" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 ("\\.\\(?:tcl\\|exp\\)\\'" . tcl-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 ("\\.wrl\\'" . vrml-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 ("\\.awk\\'" . awk-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 ("\\.prolog\\'" . prolog-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 ("\\.\\(?:arc\\|zip\\|lzh\\|zoo\\)\\'" . archive-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 ;; Mailer puts message to be edited in /tmp/Re.... or Message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 ;; #### Unix-specific!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 ("\\`/tmp/Re" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 ("/Message[0-9]*\\'" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 ("/drafts/[0-9]+\\'" . mh-letter-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 ;; some news reader is reported to use this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 ("^/tmp/fol/" . text-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 ("\\.y\\'" . c-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 ("\\.lex\\'" . c-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 ("\\.m\\'" . objc-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 ("\\.oak\\'" . scheme-mode)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1294 ("\\.[sj]?html?\\'" . html-mode)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1295 ("\\.jsp\\'" . html-mode)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1296 ("\\.xml\\'" . xml-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 ("\\.\\(?:sgml?\\|dtd\\)\\'" . sgml-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 ("\\.c?ps\\'" . postscript-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 ;; .emacs following a directory delimiter in either Unix or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 ;; Windows syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 ("[/\\][._].*emacs\\'" . emacs-lisp-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 ("\\.m4\\'" . autoconf-mode)
663
ebdebdbf3f84 [xemacs-hg @ 2001-09-17 07:48:36 by didierv]
didierv
parents: 613
diff changeset
1303 ("configure\\.\\(in\\|ac\\)\\'" . autoconf-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 ("\\.ml\\'" . lisp-mode)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1305 ("\\.ma?ke?\\'" . makefile-mode)
774
703228f54913 [xemacs-hg @ 2002-03-14 03:54:10 by stephent]
stephent
parents: 771
diff changeset
1306 ("\\(GNU\\)?[Mm]akefile\\(\\.\\|\\'\\)" . makefile-mode)
703228f54913 [xemacs-hg @ 2002-03-14 03:54:10 by stephent]
stephent
parents: 771
diff changeset
1307 ("[./\\]X\\(defaults\\|environment\\|resources\\|modmap\\)\\'" . xrdb-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 ;; #### The following three are Unix-specific (but do we care?)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 ("/app-defaults/" . xrdb-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 ("\\.[^/]*wm2?\\(?:rc\\)?\\'" . winmgr-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 ("\\.\\(?:jpe?g\\|JPE?G\\|png\\|PNG\\|gif\\|GIF\\|tiff?\\|TIFF?\\)\\'" . image-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 "Alist of filename patterns vs. corresponding major mode functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 Each element looks like (REGEXP . FUNCTION) or (REGEXP FUNCTION NON-NIL).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 \(NON-NIL stands for anything that is not nil; the value does not matter.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 Visiting a file whose name matches REGEXP specifies FUNCTION as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 mode function to use. FUNCTION will be called, unless it is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 If the element has the form (REGEXP FUNCTION NON-NIL), then after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 calling FUNCTION (if it's not nil), we delete the suffix that matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 REGEXP and search the list again for another match.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 (defvar interpreter-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 '(("^#!.*csh" . sh-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 ("^#!.*\\b\\(scope\\|wish\\|tcl\\|tclsh\\|expect\\)" . tcl-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 ("^#!.*sh\\b" . sh-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 ("perl" . perl-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 ("python" . python-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 ("awk\\b" . awk-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 ("rexx" . rexx-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 ("scm\\|guile" . scheme-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 ("emacs" . emacs-lisp-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 ("make" . makefile-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 ("^:" . sh-mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 "Alist mapping interpreter names to major modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 This alist is used to guess the major mode of a file based on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 contents of the first line. This line often contains something like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 #!/bin/sh
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 but may contain something more imaginative like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 #! /bin/env python
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 eval 'exec perl -w -S $0 ${1+\"$@\"}'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 Each alist element looks like (INTERPRETER . MODE).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 The car of each element is a regular expression which is compared
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 with the name of the interpreter specified in the first line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 If it matches, mode MODE is selected.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 (defvar binary-file-regexps
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1350 '("\\.\\(?:bz2\\|elc\\|g\\(if\\|z\\)\\|jp\\(eg\\|g\\)\\|png\\|t\\(ar\\|gz\\|iff\\)\\|[Zo]\\)\\'")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 "List of regexps of filenames containing binary (non-text) data.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 ; (eval-when-compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 ; (require 'regexp-opt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 ; (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 ; (format "\\.\\(?:%s\\)\\'"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 ; (regexp-opt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 ; '("tar"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 ; "tgz"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 ; "gz"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 ; "bz2"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 ; "Z"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 ; "o"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 ; "elc"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 ; "png"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 ; "gif"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 ; "tiff"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 ; "jpg"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 ; "jpeg"))))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1370
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 (defvar inhibit-first-line-modes-regexps
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1372 binary-file-regexps
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 "List of regexps; if one matches a file name, don't look for `-*-'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 (defvar inhibit-first-line-modes-suffixes nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 "List of regexps for what to ignore, for `inhibit-first-line-modes-regexps'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 When checking `inhibit-first-line-modes-regexps', we first discard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 from the end of the file name anything that matches one of these regexps.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 (defvar user-init-file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 nil ; set by command-line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 "File name including directory of user's initialization file.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 (defun set-auto-mode (&optional just-from-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 "Select major mode appropriate for current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 This checks for a -*- mode tag in the buffer's text,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 compares the filename against the entries in `auto-mode-alist',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 or checks the interpreter that runs this file against
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 `interpreter-mode-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 It does not check for the `mode:' local variable in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 Local Variables section of the file; for that, use `hack-local-variables'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 If `enable-local-variables' is nil, this function does not check for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 -*- mode tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 If the optional argument JUST-FROM-FILE-NAME is non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 then we do not set anything but the major mode,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 and we don't even do that unless it would come from the file name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 ;; Look for -*-MODENAME-*- or -*- ... mode: MODENAME; ... -*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 ;; Do this by calling the hack-local-variables helper to avoid redundancy.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 ;; We bind enable-local-variables to nil this time because we're going to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 ;; call hack-local-variables-prop-line again later, "for real." Note that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 ;; this temporary binding does not prevent hack-local-variables-prop-line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 ;; from setting the major mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 (or (and enable-local-variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 (let ((enable-local-variables nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 (hack-local-variables-prop-line nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 ;; It's not in the -*- line, so check the auto-mode-alist, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 ;; this buffer isn't associated with a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 (null buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 (let ((name (file-name-sans-versions buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 (keep-going t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 (while keep-going
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 (setq keep-going nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 (let ((alist auto-mode-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 (mode nil))
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1420
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 ;; Find first matching alist entry.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1422
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1423 ;; #### This is incorrect. In NT, case sensitivity is a volume
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1424 ;; property. For instance, NFS mounts *are* case sensitive.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1425 ;; Need internal function (file-name-case-sensitive f), F
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1426 ;; being file or directory name. - kkm
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 (let ((case-fold-search
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1428 (eq system-type 'windows-nt)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 (while (and (not mode) alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 (if (string-match (car (car alist)) name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 (if (and (consp (cdr (car alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 (nth 2 (car alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 (setq mode (car (cdr (car alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 name (substring name 0 (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 keep-going t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 (setq mode (cdr (car alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 keep-going nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 (setq alist (cdr alist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 (unless just-from-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 ;; If we can't deduce a mode from the file name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 ;; look for an interpreter specified in the first line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 (if (and (null mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 (save-excursion ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 (looking-at "#!")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 (let ((firstline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 (buffer-substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 (point-min)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 (goto-char (point-min)) (end-of-line) (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 (setq alist interpreter-mode-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 (while alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 (if (string-match (car (car alist)) firstline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 (setq mode (cdr (car alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 (setq alist nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 (setq alist (cdr alist)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 (if mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 (if (not (fboundp mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 (let ((name (package-get-package-provider mode)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 (if name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 (message "Mode %s is not installed. Download package %s" mode name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 (message "Mode %s either doesn't exist or is not a known package" mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 (sit-for 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 (error "%s" mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 (unless (and just-from-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 (or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 ;; Don't reinvoke major mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 (eq mode major-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 ;; Don't lose on minor modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 (assq mode minor-mode-alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 (funcall mode))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 (defvar hack-local-variables-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 "Normal hook run after processing a file's local variables specs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 Major modes can use this to examine user-specified local variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 in order to initialize other data structure based on them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 This hook runs even if there were no local variables or if their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 evaluation was suppressed. See also `enable-local-variables' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 `enable-local-eval'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 (defun hack-local-variables (&optional force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 "Parse, and bind or evaluate as appropriate, any local variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 for current buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 ;; Don't look for -*- if this file name matches any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 ;; of the regexps in inhibit-first-line-modes-regexps.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 (if (or (null buffer-file-name) ; don't lose if buffer has no file!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 (not (let ((temp inhibit-first-line-modes-regexps)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 (name (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 (file-name-sans-versions buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 (buffer-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 (while (let ((sufs inhibit-first-line-modes-suffixes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 (while (and sufs (not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 (string-match (car sufs) name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 (setq sufs (cdr sufs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 sufs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 (setq name (substring name 0 (match-beginning 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 (while (and temp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 (not (string-match (car temp) name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 (setq temp (cdr temp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 temp))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 ;; Look for variables in the -*- line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 (hack-local-variables-prop-line force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 ;; Look for "Local variables:" block in last page.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 (hack-local-variables-last-page force)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 (run-hooks 'hack-local-variables-hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 ;;; Local variables may be specified in the last page of the file (within 3k
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 ;;; from the end of the file and after the last ^L) in the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 ;;; Local variables:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 ;;; variable-name: variable-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 ;;; end:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 ;;; The lines may begin with a common prefix, like ";;; " in the above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 ;;; example. They may also have a common suffix (" */" for example). In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 ;;; this form, the local variable "mode" can be used to change the major
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 ;;; mode, and the local variable "eval" can be used to evaluate an arbitrary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 ;;; form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 ;;; Local variables may also be specified in the first line of the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 ;;; Embedded in this line are a pair of "-*-" sequences. What lies between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 ;;; them are variable-name/variable-value pairs, like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 ;;; -*- mode: emacs-lisp -*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 ;;; or -*- mode: postscript; version-control: never -*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 ;;; or -*- tags-file-name: "/foo/bar/TAGS" -*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 ;;; The local variable "eval" is not used with this form. For hysterical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 ;;; reasons, the syntax "-*- modename -*-" is allowed as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 (defun hack-local-variables-p (modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 (or (eq enable-local-variables t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 (and enable-local-variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 (switch-to-buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 ;; If we fail to switch in the selected window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 ;; it is probably a minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 ;; So try another window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 (switch-to-buffer-other-window (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 (switch-to-buffer-other-frame (current-buffer))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 (or modeline (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 (set-window-start (selected-window) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 (y-or-n-p (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 "Set local variables as specified %s of %s? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 (if modeline "in -*- line" "at end")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 (file-name-nondirectory buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 (concat "buffer " (buffer-name)))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 (defun hack-local-variables-last-page (&optional force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 ;; Set local variables set in the "Local Variables:" block of the last page.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 (if (let ((case-fold-search t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 (and (search-forward "Local Variables:" nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 (or force
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 (hack-local-variables-p nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 (let ((continue t)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1570 prefix prefixlen suffix start
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 (enable-local-eval enable-local-eval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 ;; The prefix is what comes before "local variables:" in its line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 ;; The suffix is what comes after "local variables:" in its line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 (or (eolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 (setq suffix (buffer-substring (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 (progn (end-of-line) (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 (goto-char (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 (or (bolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 (setq prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 (buffer-substring (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 (progn (beginning-of-line) (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 (if prefix (setq prefixlen (length prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 prefix (regexp-quote prefix)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 (if suffix (setq suffix (concat (regexp-quote suffix) "$")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 (while continue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 ;; Look at next local variable spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 (if selective-display (re-search-forward "[\n\C-m]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 ;; Skip the prefix, if any.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 (if prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 (if (looking-at prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 (forward-char prefixlen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 (error "Local variables entry is missing the prefix")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 ;; Find the variable name; strip whitespace.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 (skip-chars-forward " \t")
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1597 (setq start (point))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 (skip-chars-forward "^:\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 (if (eolp) (error "Missing colon in local variables entry"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 (skip-chars-backward " \t")
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1601 (let* ((str (buffer-substring start (point)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 (var (read str))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 ;; Setting variable named "end" means end of list.
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 793
diff changeset
1605 (if (equalp str "end")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 (setq continue nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 ;; Otherwise read the variable value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 (skip-chars-forward "^:")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 (forward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 (setq val (read (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 (skip-chars-backward "\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 (or (if suffix (looking-at suffix) (eolp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 (error "Local variables entry is terminated incorrectly"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 ;; Set the variable. "Variables" mode and eval are funny.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 (hack-one-local-variable var val))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 ;; jwz - New Version 20.1/19.15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 (defun hack-local-variables-prop-line (&optional force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 ;; Set local variables specified in the -*- line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 ;; Returns t if mode was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 (let ((result nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 (skip-chars-forward " \t\n\r")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 (let ((end (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 ;; If the file begins with "#!"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 ;; (un*x exec interpreter magic), look
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 ;; for mode frobs in the first two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 ;; lines. You cannot necessarily
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 ;; put them in the first line of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 ;; such a file without screwing up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 ;; the interpreter invocation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 (end-of-line (and (looking-at "^#!") 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 ;; Parse the -*- line into the `result' alist.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 (cond ((not (search-forward "-*-" end t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 ;; doesn't have one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 (setq force t))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1640 ((looking-at "[ \t]*\\([^ \t\n\r:;]+?\\)\\([ \t]*-\\*-\\)")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 ;; Antiquated form: "-*- ModeName -*-".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 (setq result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 (list (cons 'mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 (intern (buffer-substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 (match-beginning 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 (match-end 1)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 ;; Usual form: '-*-' [ <variable> ':' <value> ';' ]* '-*-'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 ;; (last ";" is optional).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 (if (search-forward "-*-" end t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 (setq end (- (point) 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 (error "-*- not terminated before end of line")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 (while (< (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 (or (looking-at "[ \t]*\\([^ \t\n:]+\\)[ \t]*:[ \t]*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 (error "malformed -*- line"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 (goto-char (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 ;; There used to be a downcase here,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 ;; but the manual didn't say so,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 ;; and people want to set var names that aren't all lc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 (let ((key (intern (buffer-substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 (match-beginning 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 (match-end 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 (val (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 (narrow-to-region (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 (read (current-buffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 ;; Case sensitivity! Icepicks in my forehead!
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 793
diff changeset
1669 (if (equalp (symbol-name key) "mode")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 (setq key 'mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 (setq result (cons (cons key val) result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 (skip-chars-forward " \t;")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 (setq result (nreverse result))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 (let ((set-any-p (or force
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 ;; It's OK to force null specifications.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 (null result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 ;; It's OK to force mode-only specifications.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 (let ((remaining result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 (mode-specs-only t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 (while remaining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 (if (eq (car (car remaining)) 'mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 (setq remaining (cdr remaining))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 ;; Otherwise, we have a real local.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 (setq mode-specs-only nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 remaining nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 mode-specs-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 ;; Otherwise, check.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 (hack-local-variables-p t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 (mode-p nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 (while result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 (let ((key (car (car result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 (val (cdr (car result))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 (cond ((eq key 'mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 (setq mode-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 (let ((mode (intern (concat (downcase (symbol-name val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 "-mode"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 ;; Without this guard, `normal-mode' would potentially run
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 ;; the major mode function twice: once via `set-auto-mode'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 ;; and once via `hack-local-variables'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 (if (not (eq mode major-mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 (funcall mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 (set-any-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 (hack-one-local-variable key val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 (setq result (cdr result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 mode-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 (defconst ignored-local-variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 (list 'enable-local-eval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 "Variables to be ignored in a file's local variable spec.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 ;; Get confirmation before setting these variables as locals in a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 (put 'debugger 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 (put 'enable-local-eval 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 (put 'ignored-local-variables 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 (put 'eval 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 (put 'file-name-handler-alist 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 (put 'minor-mode-map-alist 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 (put 'after-load-alist 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 (put 'buffer-file-name 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 (put 'buffer-auto-save-file-name 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 (put 'buffer-file-truename 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 (put 'exec-path 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 (put 'load-path 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 (put 'exec-directory 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 (put 'process-environment 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 ;; Don't wait for outline.el to be loaded, for the sake of outline-minor-mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 (put 'outline-level 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 (put 'rmail-output-file-alist 'risky-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 ;; This one is safe because the user gets to check it before it is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 (put 'compile-command 'safe-local-variable t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 ;(defun hack-one-local-variable-quotep (exp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 ; (and (consp exp) (eq (car exp) 'quote) (consp (cdr exp))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 ;; "Set" one variable in a local variables spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 ;; A few variable names are treated specially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 (defun hack-one-local-variable (var val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 (cond ((eq var 'mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 (funcall (intern (concat (downcase (symbol-name val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 "-mode"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 ((memq var ignored-local-variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 ;; "Setting" eval means either eval it or do nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 ;; Likewise for setting hook variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 ((or (get var 'risky-local-variable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 (and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 (string-match "-hooks?$\\|-functions?$\\|-forms?$\\|-program$\\|-command$"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 (symbol-name var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 (not (get var 'safe-local-variable))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 ; ;; Permit evaling a put of a harmless property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 ; ;; if the args do nothing tricky.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 ; (if (or (and (eq var 'eval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 ; (consp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 ; (eq (car val) 'put)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 ; (hack-one-local-variable-quotep (nth 1 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 ; (hack-one-local-variable-quotep (nth 2 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 ; ;; Only allow safe values of lisp-indent-hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 ; ;; not functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 ; (or (numberp (nth 3 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 ; (equal (nth 3 val) ''defun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 ; (memq (nth 1 (nth 2 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 ; '(lisp-indent-hook)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 (if (and (not (zerop (user-uid)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 (or (eq enable-local-eval t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 (and enable-local-eval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 (switch-to-buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 (set-window-start (selected-window) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 (setq enable-local-eval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 (y-or-n-p (format "Process `eval' or hook local variables in file %s? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 (file-name-nondirectory buffer-file-name))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 (if (eq var 'eval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 (save-excursion (eval val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 (make-local-variable var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 (set var val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 (message "Ignoring `eval:' in file's local variables")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 ;; Ordinary variable, really set it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 (t (make-local-variable var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 (set var val))))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1788
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1789 (defun find-coding-system-magic-cookie-in-file (file)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1790 "Look for the coding-system magic cookie in FILE.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1791 The coding-system magic cookie is either the local variable specification
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1792 -*- ... coding: ... -*- on the first line, or the exact string
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1793 \";;;###coding system: \" somewhere within the first 3000 characters
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1794 of the file. If found, the coding system name (as a string) is returned;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1795 otherwise nil is returned. Note that it is extremely unlikely that
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1796 either such string would occur coincidentally as the result of encoding
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1797 some characters in a non-ASCII charset, and that the spaces make it
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1798 even less likely since the space character is not a valid octet in any
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1799 ISO 2022 encoding of most non-ASCII charsets."
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1800 (save-excursion
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1801 (with-temp-buffer
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1802 (let ((coding-system-for-read 'raw-text))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1803 (insert-file-contents file nil 1 3001))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1804 (goto-char (point-min))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1805 (or (and (looking-at
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1806 "^[^\n]*-\\*-[^\n]*coding: \\([^ \t\n;]+\\)[^\n]*-\\*-")
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1807 (buffer-substring (match-beginning 1) (match-end 1)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1808 ;; (save-excursion
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1809 ;; (let (start end)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1810 ;; (and (re-search-forward "^;+[ \t]*Local Variables:" nil t)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1811 ;; (setq start (match-end 0))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1812 ;; (re-search-forward "\n;+[ \t]*End:")
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1813 ;; (setq end (match-beginning 0))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1814 ;; (save-restriction
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1815 ;; (narrow-to-region start end)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1816 ;; (goto-char start)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1817 ;; (re-search-forward "^;;; coding: \\([^\n]+\\)$" nil t)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1818 ;; )
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1819 ;; (let ((codesys
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1820 ;; (intern (buffer-substring
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1821 ;; (match-beginning 1)(match-end 1)))))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1822 ;; (if (find-coding-system codesys) codesys))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1823 ;; )))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1824 (let ((case-fold-search nil))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1825 (if (search-forward
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1826 ";;;###coding system: " (+ (point-min) 3000) t)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1827 (let ((start (point))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1828 (end (progn
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1829 (skip-chars-forward "^ \t\n\r")
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1830 (point))))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1831 (if (> end start) (buffer-substring start end))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1832 )))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1833 ))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 (defcustom change-major-mode-with-file-name t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 "*Non-nil means \\[write-file] should set the major mode from the file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 However, the mode will not be changed if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 \(1) a local variables list or the `-*-' line specifies a major mode, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 \(2) the current major mode is a \"special\" mode,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 \ not suitable for ordinary files, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 \(3) the new file name does not particularly specify any mode."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 :group 'editing-basics)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 (defun set-visited-file-name (filename &optional no-query along-with-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 "Change name of file visited in current buffer to FILENAME.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 The next time the buffer is saved it will go in the newly specified file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 nil or empty string as argument means make buffer not be visiting any file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 Remember to delete the initial contents of the minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 if you wish to pass an empty string as the argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 The optional second argument NO-QUERY, if non-nil, inhibits asking for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 confirmation in the case where another buffer is already visiting FILENAME.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 The optional third argument ALONG-WITH-FILE, if non-nil, means that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 the old visited file has been renamed to the new name FILENAME."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 (interactive "FSet visited file name: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 (if (buffer-base-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 (error "An indirect buffer cannot visit a file"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 (let (truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 (if filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 (setq filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 (if (string-equal filename "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 (expand-file-name filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 (if filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 (setq truename (file-truename filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 ;; #### Do we need to check if truename is non-nil?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 (if find-file-use-truenames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 (setq filename truename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 (let ((buffer (and filename (find-buffer-visiting filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 (and buffer (not (eq buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 (not no-query)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 (not (y-or-n-p (message "A buffer is visiting %s; proceed? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 (error "Aborted")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 (or (equal filename buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 (and filename (lock-buffer filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 (unlock-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 (setq buffer-file-name filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 (if filename ; make buffer name reflect filename.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 (let ((new-name (file-name-nondirectory buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 (if (string= new-name "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 (error "Empty file name"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 (setq default-directory (file-name-directory buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 (or (string= new-name (buffer-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 (rename-buffer new-name t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 (setq buffer-backed-up nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 (or along-with-file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 (clear-visited-file-modtime))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 (compute-buffer-file-truename) ; insert-file-contents does this too.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 ; ;; Abbreviate the file names of the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 ; (if truename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 ; (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 ; (setq buffer-file-truename (abbreviate-file-name truename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 ; (if find-file-visit-truename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 ; (setq buffer-file-name buffer-file-truename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 (setq buffer-file-number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 (if filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 (nthcdr 10 (file-attributes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 ;; write-file-hooks is normally used for things like ftp-find-file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 ;; that visit things that are not local files as if they were files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 ;; Changing to visit an ordinary local file instead should flush the hook.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 (kill-local-variable 'write-file-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 (kill-local-variable 'after-save-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 (kill-local-variable 'local-write-file-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 (kill-local-variable 'write-file-data-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 (kill-local-variable 'revert-buffer-function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 (kill-local-variable 'backup-inhibited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 ;; If buffer was read-only because of version control,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 ;; that reason is gone now, so make it writable.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1915 (if-boundp 'vc-mode
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1916 (progn
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1917 (if vc-mode
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1918 (setq buffer-read-only nil))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
1919 (kill-local-variable 'vc-mode)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 ;; Turn off backup files for certain file names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 ;; Since this is a permanent local, the major mode won't eliminate it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 (and buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 (not (funcall backup-enable-predicate buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 (make-local-variable 'backup-inhibited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 (setq backup-inhibited t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 (let ((oauto buffer-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 ;; If auto-save was not already on, turn it on if appropriate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 (if (not buffer-auto-save-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 (and buffer-file-name auto-save-default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 (auto-save-mode t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 ;; If auto save is on, start using a new name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 ;; We deliberately don't rename or delete the old auto save
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 ;; for the old visited file name. This is because perhaps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 ;; the user wants to save the new state and then compare with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 ;; previous state from the auto save file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 (setq buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 (make-auto-save-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 ;; Rename the old auto save file if any.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 (and oauto buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 (file-exists-p oauto)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 (rename-file oauto buffer-auto-save-file-name t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 (not along-with-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 (set-buffer-modified-p t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 ;; Update the major mode, if the file name determines it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 ;; Don't change the mode if it is special.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 (or (not change-major-mode-with-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 (get major-mode 'mode-class)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 ;; Don't change the mode if the local variable list specifies it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 (hack-local-variables t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 (set-auto-mode t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 (error nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 ;; #### ??
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 (run-hooks 'after-set-visited-file-name-hooks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 (defun write-file (filename &optional confirm codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 "Write current buffer into file FILENAME.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1960 Makes buffer visit that file, and marks it not modified. If the buffer is
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1961 already visiting a file, you can specify a directory name as FILENAME, to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1962 write a file of the same old name in that directory.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1963
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1964 If optional second arg CONFIRM is non-nil, ask for confirmation for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1965 overwriting an existing file.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1966
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1967 Optional third argument specifies the coding system to use when encoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1968 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1969 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 ;; (interactive "FWrite file: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 (list (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 (read-file-name "Write file: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 nil nil nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 (read-file-name "Write file: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 (cdr (assq 'default-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 (buffer-local-variables)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 nil nil (buffer-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 t
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
1980 (if current-prefix-arg (read-coding-system "Coding system: "))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 (and (eq (current-buffer) mouse-grabbed-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 (error "Can't write minibuffer window"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 (or (null filename) (string-equal filename "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 ;; If arg is just a directory,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 ;; use same file name, but in that directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 (if (and (file-directory-p filename) buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 (setq filename (concat (file-name-as-directory filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 (file-name-nondirectory buffer-file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 (and confirm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 (file-exists-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 (or (y-or-n-p (format "File `%s' exists; overwrite? " filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 (error "Canceled")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 (set-visited-file-name filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 (set-buffer-modified-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 (let ((buffer-file-coding-system (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 (save-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 (save-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 (defun backup-buffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 "Make a backup of the disk file visited by the current buffer, if appropriate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 This is normally done before saving the buffer the first time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 If the value is non-nil, it is the result of `file-modes' on the original file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 this means that the caller, after saving the buffer, should change the modes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 of the new file to agree with the old modes."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 (let ((handler (find-file-name-handler buffer-file-name 'backup-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 (funcall handler 'backup-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 (if (and make-backup-files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 (not backup-inhibited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 (not buffer-backed-up)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 (file-exists-p buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 (memq (aref (elt (file-attributes buffer-file-name) 8) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 '(?- ?l)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 (let ((real-file-name buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 backup-info backupname targets setmodes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 ;; If specified name is a symbolic link, chase it to the target.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 ;; Thus we make the backups in the directory where the real file is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 (setq real-file-name (file-chase-links real-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 (setq backup-info (find-backup-file-name real-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 backupname (car backup-info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 targets (cdr backup-info))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 ;;; (if (file-directory-p buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 ;;; (error "Cannot save buffer in directory %s" buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 (if backup-info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 (let ((delete-old-versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 ;; If have old versions to maybe delete,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 ;; ask the user to confirm now, before doing anything.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2033 ;; But don't actually delete till later.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 (and targets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 (or (eq delete-old-versions t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 (eq delete-old-versions nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 (or delete-old-versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 (y-or-n-p (format "Delete excess backup versions of %s? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 real-file-name))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 ;; Actually write the back up file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 (if (or file-precious-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 ; (file-symlink-p buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 backup-by-copying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 (and backup-by-copying-when-linked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 (> (file-nlinks real-file-name) 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 (and backup-by-copying-when-mismatch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 (let ((attr (file-attributes real-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 (or (nth 9 attr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 (not (file-ownership-preserved-p real-file-name))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 (copy-file real-file-name backupname t t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 ;; If copying fails because file BACKUPNAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 ;; is not writable, delete that file and try again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 (if (and (file-exists-p backupname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 (not (file-writable-p backupname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 (delete-file backupname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 (copy-file real-file-name backupname t t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 ;; rename-file should delete old backup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 (rename-file real-file-name backupname t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 (setq setmodes (file-modes backupname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 ;; If trouble writing the backup, write it in ~.
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
2065 (setq backupname
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
2066 (expand-file-name
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
2067 (convert-standard-filename "~/%backup%~")))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
2068 (lwarn 'file 'alert "Cannot write backup file; backing up in ~/%%backup%%~")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 (sleep-for 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 (copy-file real-file-name backupname t t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 ;; If copying fails because file BACKUPNAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 ;; is not writable, delete that file and try again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 (if (and (file-exists-p backupname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 (not (file-writable-p backupname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 (delete-file backupname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 (copy-file real-file-name backupname t t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 (setq buffer-backed-up t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 ;; Now delete the old versions, if desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 (if delete-old-versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 (while targets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 (ignore-file-errors (delete-file (car targets)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 (setq targets (cdr targets))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 setmodes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 (file-error nil)))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 (defun file-name-sans-versions (name &optional keep-backup-version)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 "Return FILENAME sans backup versions or strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 This is a separate procedure so your site-init or startup file can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 redefine it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 If the optional argument KEEP-BACKUP-VERSION is non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 we do not remove backup version numbers, only true file version numbers."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 (let ((handler (find-file-name-handler name 'file-name-sans-versions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 (funcall handler 'file-name-sans-versions name keep-backup-version)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 (substring name 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 (if keep-backup-version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 (length name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 (or (string-match "\\.~[0-9.]+~\\'" name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 ;; XEmacs - VC uses extensions like ".~tagname~" or ".~1.1.5.2~"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 (let ((pos (string-match "\\.~\\([^.~ \t]+\\|[0-9.]+\\)~\\'" name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 (and pos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 ;; #### - is this filesystem check too paranoid?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 (file-exists-p (substring name 0 pos))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 pos))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 (string-match "~\\'" name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 (length name)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 (defun file-ownership-preserved-p (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 "Return t if deleting FILE and rewriting it would preserve the owner."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 (let ((handler (find-file-name-handler file 'file-ownership-preserved-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 (funcall handler 'file-ownership-preserved-p file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 (let ((attributes (file-attributes file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 ;; Return t if the file doesn't exist, since it's true that no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 ;; information would be lost by an (attempted) delete and create.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 (or (null attributes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 (= (nth 2 attributes) (user-uid)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 (defun file-name-sans-extension (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 "Return FILENAME sans final \"extension\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 The extension, in a file name, is the part that follows the last `.'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 (let ((file (file-name-sans-versions (file-name-nondirectory filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 (if (string-match "\\.[^.]*\\'" file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 (if (setq directory (file-name-directory filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 (expand-file-name (substring file 0 (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 (substring file 0 (match-beginning 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 (defun file-name-extension (filename &optional period)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 "Return FILENAME's final \"extension\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 The extension, in a file name, is the part that follows the last `.'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 Return nil for extensionless file names such as `foo'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 Return the empty string for file names such as `foo.'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 If PERIOD is non-nil, then the returned value includes the period
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 that delimits the extension, and if FILENAME has no extension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 the value is \"\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 (if (string-match "\\.[^.]*\\'" file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 (substring file (+ (match-beginning 0) (if period 0 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 (if period
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 "")))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 (defun make-backup-file-name (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 "Create the non-numeric backup file name for FILE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 This is a separate function so you can redefine it for customization."
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
2153 ;; FSF has code here for MS-DOS short filenames, not supported in XEmacs.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2154 (concat file "~"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 (defun backup-file-name-p (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 "Return non-nil if FILE is a backup file name (numeric or not).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 This is a separate function so you can redefine it for customization.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 You may need to redefine `file-name-sans-versions' as well."
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2160 (string-match "~\\'" file))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 ;; This is used in various files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 ;; The usage of bv-length is not very clean,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 ;; but I can't see a good alternative,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 ;; so as of now I am leaving it alone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 (defun backup-extract-version (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 "Given the name of a numeric backup file, return the backup number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 Uses the free variable `bv-length', whose value should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 the index in the name where the version number begins."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 (declare (special bv-length))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 (if (and (string-match "[0-9]+~\\'" fn bv-length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 (= (match-beginning 0) bv-length))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 (string-to-int (substring fn bv-length -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 (defun find-backup-file-name (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 "Find a file name for a backup file, and suggestions for deletions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 Value is a list whose car is the name for the backup file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 and whose cdr is a list of old versions to consider deleting now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 If the value is nil, don't make a backup."
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
2181 (declare (special bv-length))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 (let ((handler (find-file-name-handler fn 'find-backup-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 ;; Run a handler for this function so that ange-ftp can refuse to do it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 (funcall handler 'find-backup-file-name fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 (if (eq version-control 'never)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 (list (make-backup-file-name fn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 (let* ((base-versions (concat (file-name-nondirectory fn) ".~"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 ;; used by backup-extract-version:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 (bv-length (length base-versions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 possibilities
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 (versions nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 (high-water-mark 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 (deserve-versions-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 (number-to-delete 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 (setq possibilities (file-name-all-completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 base-versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 (file-name-directory fn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 versions (sort (mapcar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 #'backup-extract-version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 possibilities)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 '<)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 high-water-mark (apply #'max 0 versions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 deserve-versions-p (or version-control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 (> high-water-mark 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 number-to-delete (- (length versions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 kept-old-versions kept-new-versions -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 (setq possibilities nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 (if (not deserve-versions-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 (list (make-backup-file-name fn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 (cons (concat fn ".~" (int-to-string (1+ high-water-mark)) "~")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 (if (and (> number-to-delete 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 ;; Delete nothing if there is overflow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 ;; in the number of versions to keep.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 (>= (+ kept-new-versions kept-old-versions -1) 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 (mapcar #'(lambda (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 (concat fn ".~" (int-to-string n) "~"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 (let ((v (nthcdr kept-old-versions versions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 (rplacd (nthcdr (1- number-to-delete) v) ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 v))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 (defun file-nlinks (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 "Return number of names file FILENAME has."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 (car (cdr (file-attributes filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 (defun file-relative-name (filename &optional directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 "Convert FILENAME to be relative to DIRECTORY (default: default-directory).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 This function returns a relative file name which is equivalent to FILENAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 when used with that default directory as the default.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2232 If this is impossible (which can happen on MS Windows when the file name
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2233 and directory use different drive names) then it returns FILENAME."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 (let ((fname (expand-file-name filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 (setq directory (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 (expand-file-name (or directory default-directory))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 ;; On Microsoft OSes, if FILENAME and DIRECTORY have different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 ;; drive names, they can't be relative, so return the absolute name.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2240 (if (and (eq system-type 'windows-nt)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 (not (string-equal (substring fname 0 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 (substring directory 0 2))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 (let ((ancestor ".")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 (fname-dir (file-name-as-directory fname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 (while (and (not (string-match (concat "^" (regexp-quote directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 fname-dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 (not (string-match (concat "^" (regexp-quote directory)) fname)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 (setq directory (file-name-directory (substring directory 0 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 ancestor (if (equal ancestor ".")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 ".."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 (concat "../" ancestor))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 ;; Now ancestor is empty, or .., or ../.., etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 (if (string-match (concat "^" (regexp-quote directory)) fname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 ;; We matched within FNAME's directory part.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 ;; Add the rest of FNAME onto ANCESTOR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 (let ((rest (substring fname (match-end 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 (if (and (equal ancestor ".")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 (not (equal rest "")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 ;; But don't bother with ANCESTOR if it would give us `./'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 (concat (file-name-as-directory ancestor) rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 ;; We matched FNAME's directory equivalent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 ancestor))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 (defun save-buffer (&optional args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 "Save current buffer in visited file if modified. Versions described below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 By default, makes the previous version into a backup file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 if previously requested or if this is the first save.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 With 1 or 3 \\[universal-argument]'s, marks this version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 to become a backup when the next save is done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 With 2 or 3 \\[universal-argument]'s,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 unconditionally makes the previous version into a backup file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 With argument of 0, never makes the previous version into a backup file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 If a file's name is FOO, the names of its numbered backup versions are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 FOO.~i~ for various integers i. A non-numbered backup file is called FOO~.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 Numeric backups (rather than FOO~) will be made if value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 `version-control' is not the atom `never' and either there are already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 numeric versions of the file being backed up, or `version-control' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 We don't want excessive versions piling up, so there are variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 `kept-old-versions', which tells XEmacs how many oldest versions to keep,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 and `kept-new-versions', which tells how many newest versions to keep.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 Defaults are 2 old versions and 2 new.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 `dired-kept-versions' controls dired's clean-directory (.) command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 If `delete-old-versions' is nil, system will query user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 before trimming versions. Otherwise it does it silently."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 (interactive "_p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 (let ((modp (buffer-modified-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 (large (> (buffer-size) 50000))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 (make-backup-files (or (and make-backup-files (not (eq args 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 (memq args '(16 64)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 (and modp (memq args '(16 64)) (setq buffer-backed-up nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 (if (and modp large) (display-message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 'progress (format "Saving file %s..."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 (buffer-file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 (basic-save-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 (and modp (memq args '(4 64)) (setq buffer-backed-up nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 (defun delete-auto-save-file-if-necessary (&optional force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 "Delete auto-save file for current buffer if `delete-auto-save-files' is t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 Normally delete only if the file was written by this XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 since the last real save, but optional arg FORCE non-nil means delete anyway."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 (and buffer-auto-save-file-name delete-auto-save-files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 (not (string= buffer-file-name buffer-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 (or force (recent-auto-save-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 (ignore-file-errors (delete-file buffer-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 (set-buffer-auto-saved))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 ;; XEmacs change (from Sun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 ;; used to communicate with continue-save-buffer:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 (defvar continue-save-buffer-hooks-tail nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 ;; Not in FSFmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 (defun basic-write-file-data (realname truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 ;; call the hooks until the bytes are put
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 ;; call write-region as a last resort
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 (let ((region-written nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 (hooks write-file-data-hooks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 (while (and hooks (not region-written))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 (setq region-written (funcall (car hooks) realname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 hooks (cdr hooks)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 (if (not region-written)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 (write-region (point-min) (point-max) realname nil t truename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 (put 'after-save-hook 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 (defvar after-save-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 "Normal hook that is run after a buffer is saved to its file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 These hooks are considered to pertain to the visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 So this list is cleared if you change the visited file name.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 (defun files-fetch-hook-value (hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 (let ((localval (symbol-value hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 (globalval (default-value hook)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 (if (memq t localval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 (setq localval (append (delq t localval) (delq t globalval))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 localval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 (defun basic-save-buffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 "Save the current buffer in its visited file, if it has been modified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 After saving the buffer, run `after-save-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 ;; In an indirect buffer, save its base buffer instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 (if (buffer-base-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 (set-buffer (buffer-base-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 (if (buffer-modified-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 (let ((recent-save (recent-auto-save-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 ;; If buffer has no file name, ask user for one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 (or buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 (let ((filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 (expand-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 (read-file-name "File to save in: ") nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 (and (file-exists-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 (or (y-or-n-p (format "File `%s' exists; overwrite? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 (error "Canceled")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 (set-visited-file-name filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 (or (verify-visited-file-modtime (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 (not (file-exists-p buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 (format "%s has changed since visited or saved. Save anyway? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 (file-name-nondirectory buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 (error "Save not confirmed"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 (widen)
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2370
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2371 ;; Add final newline if required. See `require-final-newline'.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2372 (when (and (not (eq (char-before (point-max)) ?\n)) ; common case
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2373 (char-before (point-max)) ; empty buffer?
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2374 (not (and (eq selective-display t)
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2375 (eq (char-before (point-max)) ?\r)))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2376 (or (eq require-final-newline t)
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2377 (and require-final-newline
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2378 (y-or-n-p
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2379 (format "Buffer %s does not end in newline. Add one? "
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2380 (buffer-name))))))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2381 (save-excursion
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2382 (goto-char (point-max))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2383 (insert ?\n)))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2384
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2385 ;; Run the write-file-hooks until one returns non-nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 ;; Bind after-save-hook to nil while running the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 ;; write-file-hooks so that if this function is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 ;; recursively (from inside a write-file-hook) the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 ;; after-hooks will only get run once (from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 ;; outermost call).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 ;; Ugh, have to duplicate logic of run-hook-with-args-until-success
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 (let ((hooks (append (files-fetch-hook-value 'write-contents-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 (files-fetch-hook-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 'local-write-file-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 (files-fetch-hook-value 'write-file-hooks)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 (after-save-hook nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 (local-write-file-hooks nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 (write-contents-hooks nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 (write-file-hooks nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 (while (and hooks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 (let ((continue-save-buffer-hooks-tail hooks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 (not (setq done (funcall (car hooks))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 (setq hooks (cdr hooks)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 ;; If a hook returned t, file is already "written".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 ;; Otherwise, write it the usual way now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 (if (not done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 (basic-save-buffer-1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 ;; XEmacs: next two clauses (buffer-file-number setting and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 ;; set-file-modes) moved into basic-save-buffer-1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 ;; If the auto-save file was recent before this command,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 ;; delete it now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 (delete-auto-save-file-if-necessary recent-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 ;; Support VC `implicit' locking.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2417 (if-fboundp 'vc-after-save
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2418 (vc-after-save))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 (run-hooks 'after-save-hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 (display-message 'no-log "(No changes need to be saved)"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 ;; This does the "real job" of writing a buffer into its visited file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 ;; and making a backup file. This is what is normally done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 ;; but inhibited if one of write-file-hooks returns non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 ;; It returns a value to store in setmodes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 (defun basic-save-buffer-1 ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 (let (setmodes tempsetmodes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 (if (not (file-writable-p buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 (let ((dir (file-name-directory buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 (if (not (file-directory-p dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 (error "%s is not a directory" dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 (if (not (file-exists-p buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 (error "Directory %s write-protected" dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 (if (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 (format "File %s is write-protected; try to save anyway? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 (file-name-nondirectory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 (setq tempsetmodes t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 "Attempt to save to a file which you aren't allowed to write"))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 (or buffer-backed-up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 (setq setmodes (backup-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 (let ((dir (file-name-directory buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 (if (and file-precious-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 (file-writable-p dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 ;; If file is precious, write temp name, then rename it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 ;; This requires write access to the containing dir,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 ;; which is why we don't try it if we don't have that access.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 (let ((realname buffer-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 tempname nogood i succeed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 (old-modtime (visited-file-modtime)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 (setq i 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 (setq nogood t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 ;; Find the temporary name to write under.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 (while nogood
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 (setq tempname (format "%s#tmp#%d" dir i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 (setq nogood (file-exists-p tempname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 (setq i (1+ i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 (progn (clear-visited-file-modtime)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 (write-region (point-min) (point-max)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 tempname nil realname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 buffer-file-truename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 (setq succeed t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 ;; If writing the temp file fails,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 ;; delete the temp file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 (or succeed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 (delete-file tempname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 (set-visited-file-modtime old-modtime))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 ;; Since we have created an entirely new file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 ;; and renamed it, make sure it gets the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 ;; right permission bits set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 (setq setmodes (file-modes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 ;; We succeeded in writing the temp file,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 ;; so rename it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 (rename-file tempname buffer-file-name t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 ;; If file not writable, see if we can make it writable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 ;; temporarily while we write it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 ;; But no need to do so if we have just backed it up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 ;; (setmodes is set) because that says we're superseding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 (cond ((and tempsetmodes (not setmodes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 ;; Change the mode back, after writing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 (setq setmodes (file-modes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 (set-file-modes buffer-file-name 511)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 (basic-write-file-data buffer-file-name buffer-file-truename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 (setq buffer-file-number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 (if buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 (nth 10 (file-attributes buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 (if setmodes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 (set-file-modes buffer-file-name setmodes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 (error nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 ;; XEmacs change, from Sun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 (defun continue-save-buffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 "Provide a clean way for a write-file-hook to wrap AROUND
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 the execution of the remaining hooks and writing to disk.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 Do not call this function except from a functions
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2501 on the `write-file-hooks' or `write-contents-hooks' list.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 A hook that calls this function must return non-nil,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2503 to signal completion to its caller. `continue-save-buffer'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 always returns non-nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 (let ((hooks (cdr (or continue-save-buffer-hooks-tail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 "continue-save-buffer called outside a write-file-hook!"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 (done nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 ;; Do something like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 ;; (let ((write-file-hooks hooks)) (basic-save-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 ;; First run the rest of the hooks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 (while (and hooks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 (let ((continue-save-buffer-hooks-tail hooks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 (not (setq done (funcall (car hooks))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 (setq hooks (cdr hooks)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 ;; If a hook returned t, file is already "written".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 (if (not done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 (basic-save-buffer-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 'continue-save-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 (defcustom save-some-buffers-query-display-buffer t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 "*Non-nil makes `\\[save-some-buffers]' switch to the buffer offered for saving."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 :group 'editing-basics)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 (defun save-some-buffers (&optional arg exiting)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 "Save some modified file-visiting buffers. Asks user about each one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 Optional argument (the prefix) non-nil means save all with no questions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 Optional second argument EXITING means ask about certain non-file buffers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 as well as about file buffers."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 ;; `delete-other-windows' can bomb during autoloads generation, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 ;; guard it well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 (if (or noninteractive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 (eq (selected-window) (minibuffer-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 (not save-some-buffers-query-display-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 ;; If playing with windows is unsafe or undesired, just do the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 ;; usual drill.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 (save-some-buffers-1 arg exiting nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 ;; Else, protect the windows.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 (when (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 (save-some-buffers-1 arg exiting t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 ;; Force redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 (sit-for 0)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 ;; XEmacs - do not use queried flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 (defun save-some-buffers-1 (arg exiting switch-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 (let* ((switched nil)
612
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2551 (last-buffer nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 (files-done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 (map-y-or-n-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 (lambda (buffer)
612
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2555 (prog1
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2556 (and (buffer-modified-p buffer)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2557 (not (buffer-base-buffer buffer))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2558 ;; XEmacs addition:
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2559 (not (symbol-value-in-buffer 'save-buffers-skip buffer))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2560 (or
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2561 (buffer-file-name buffer)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2562 (and exiting
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2563 (progn
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2564 (set-buffer buffer)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2565 (and buffer-offer-save (> (buffer-size) 0)))))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2566 (if arg
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2567 t
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2568 ;; #### We should provide a per-buffer means to
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2569 ;; disable the switching. For instance, you might
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2570 ;; want to turn it off for buffers the contents of
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2571 ;; which is meaningless to humans, such as
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2572 ;; `.newsrc.eld'.
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2573 (when (and switch-buffer
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2574 ;; map-y-or-n-p is displaying help
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2575 (not (eq last-buffer buffer)))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2576 (unless (one-window-p)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2577 (delete-other-windows))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2578 (setq switched t)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2579 ;; #### Consider using `display-buffer' here for 21.1!
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2580 ;;(display-buffer buffer nil (selected-frame)))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2581 (switch-to-buffer buffer t))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2582 (if (buffer-file-name buffer)
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2583 (format "Save file %s? "
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2584 (buffer-file-name buffer))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2585 (format "Save buffer %s? "
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2586 (buffer-name buffer)))))
ff0d9e7facba [xemacs-hg @ 2001-06-09 09:02:03 by michaels]
michaels
parents: 526
diff changeset
2587 (setq last-buffer buffer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 (lambda (buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 (set-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 (save-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 (buffer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 '("buffer" "buffers" "save")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 ;;instead of this we just say "yes all", "no all", etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 ;;"save all the rest"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 ;;"save only this buffer" "save no more buffers")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 ;; this is rather bogus. --ben
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 ;; (it makes the dialog box too big, and you get an error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 ;; "wrong type argument: framep, nil" when you hit q after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 ;; choosing the option from the dialog box)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 ;; We should fix the dialog box rather than disabling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 ;; this! --hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 (list (list ?\C-r (lambda (buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 ;; #### FSF has an EXIT-ACTION argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 ;; to `view-buffer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 (view-buffer buf)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2609 (with-boundp 'view-exit-action
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2610 (setq view-exit-action
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2611 (lambda (ignore)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
2612 (exit-recursive-edit))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 (recursive-edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 ;; Return nil to ask about BUF again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 nil)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2616 "%_Display Buffer"))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 (abbrevs-done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 (and save-abbrevs abbrevs-changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 (if (or arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 (y-or-n-p (format "Save abbrevs in %s? " abbrev-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 (write-abbrev-file nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 ;; Don't keep bothering user if he says no.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 (setq abbrevs-changed nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 (or (> files-done 0) abbrevs-done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 (display-message 'no-log "(No files need saving)"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 switched))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 (defun not-modified (&optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 "Mark current buffer as unmodified, not needing to be saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 With prefix arg, mark buffer as modified, so \\[save-buffer] will save.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 It is not a good idea to use this function in Lisp programs, because it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 prints a message in the minibuffer. Instead, use `set-buffer-modified-p'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 (interactive "_P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 (if arg ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 (display-message 'command "Modification-flag set")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 (display-message 'command "Modification-flag cleared"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 (set-buffer-modified-p arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 (defun toggle-read-only (&optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 "Toggle the current buffer's read-only status.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 With arg, set read-only iff arg is positive."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 (interactive "_P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 (setq buffer-read-only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 (if (null arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 (not buffer-read-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 (> (prefix-numeric-value arg) 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 ;; Force modeline redisplay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 (redraw-modeline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 (defun insert-file (filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 "Insert contents of file FILENAME into buffer after point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 Set mark after the inserted text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2658 Optional second argument specifies the coding system to use when decoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2659 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2660 the coding system.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2662 This function is meant for the user to run interactively. Don't call it
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2663 from programs! Use `insert-file-contents' instead. \(Its calling sequence
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2664 is different; see its documentation)."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 (interactive "*fInsert file: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 (if (file-directory-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 (signal 'file-error (list "Opening input file" "file is a directory"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 (let ((tem
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 (let ((coding-system-for-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 (insert-file-contents filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 (insert-file-contents filename))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 (push-mark (+ (point) (car (cdr tem))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 (defun append-to-file (start end filename &optional codesys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 "Append the contents of the region to the end of file FILENAME.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2679 When called from a function, expects three arguments, START, END and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2680 FILENAME. START and END are buffer positions saying what text to write.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2681 Optional fourth argument specifies the coding system to use when encoding
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2682 the file. Interactively, with a prefix argument, you will be prompted for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2683 the coding system."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 (interactive "r\nFAppend to file: \nZCoding system: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 (if codesys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 (let ((buffer-file-coding-system (get-coding-system codesys)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 (write-region start end filename t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 (write-region start end filename t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 (defun file-newest-backup (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 "Return most recent backup file for FILENAME or nil if no backups exist."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 (let* ((filename (expand-file-name filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 (file (file-name-nondirectory filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 (dir (file-name-directory filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 (comp (file-name-all-completions file dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 newest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 (while comp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 (setq file (concat dir (car comp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 comp (cdr comp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 (if (and (backup-file-name-p file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 (or (null newest) (file-newer-than-file-p file newest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 (setq newest file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 newest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 (defun rename-uniquely ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 "Rename current buffer to a similar name not already taken.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 This function is useful for creating multiple shell process buffers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 or multiple mail buffers, etc."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 (let* ((base-name (if (and (string-match "<[0-9]+>\\'" (buffer-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 (not (and buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 (string= (buffer-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 (file-name-nondirectory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 buffer-file-name)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 ;; If the existing buffer name has a <NNN>,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 ;; which isn't part of the file name (if any),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 ;; then get rid of that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 (substring (buffer-name) 0 (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 (buffer-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 (new-buf (generate-new-buffer base-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 (name (buffer-name new-buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 (kill-buffer new-buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 (rename-buffer name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 (redraw-modeline))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 (defun make-directory-path (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 "Create all the directories along path that don't exist yet."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 (interactive "Fdirectory path to create: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 (make-directory path t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 (defun make-directory (dir &optional parents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 "Create the directory DIR and any nonexistent parent dirs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 Interactively, the default choice of directory to create
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 is the current default directory for file names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 That is useful when you have visited a file in a nonexistent directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 Noninteractively, the second (optional) argument PARENTS says whether
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 to create parent directories if they don't exist."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 (interactive (list (let ((current-prefix-arg current-prefix-arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 (read-directory-name "Create directory: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 current-prefix-arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 (let ((handler (find-file-name-handler dir 'make-directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 (funcall handler 'make-directory dir parents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 (if (not parents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 (make-directory-internal dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 (let ((dir (directory-file-name (expand-file-name dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 create-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 (while (not (file-exists-p dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 (setq create-list (cons dir create-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 dir (directory-file-name (file-name-directory dir))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 (while create-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 (make-directory-internal (car create-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 (setq create-list (cdr create-list))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 (put 'revert-buffer-function 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 (defvar revert-buffer-function nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 "Function to use to revert this buffer, or nil to do the default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 The function receives two arguments IGNORE-AUTO and NOCONFIRM,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 which are the arguments that `revert-buffer' received.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 (put 'revert-buffer-insert-file-contents-function 'permanent-local t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 (defvar revert-buffer-insert-file-contents-function nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 "Function to use to insert contents when reverting this buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 Gets two args, first the nominal file name to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 and second, t if reading the auto-save file.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 (defvar before-revert-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 "Normal hook for `revert-buffer' to run before reverting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 If `revert-buffer-function' is used to override the normal revert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 mechanism, this hook is not used.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 (defvar after-revert-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 "Normal hook for `revert-buffer' to run after reverting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 Note that the hook value that it runs is the value that was in effect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 before reverting; that makes a difference if you have buffer-local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 hook functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 If `revert-buffer-function' is used to override the normal revert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 mechanism, this hook is not used.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 (defvar revert-buffer-internal-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 "Don't use this.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 (defun revert-buffer (&optional ignore-auto noconfirm preserve-modes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 "Replace the buffer text with the text of the visited file on disk.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 This undoes all changes since the file was visited or saved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 With a prefix argument, offer to revert from latest auto-save file, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 that is more recent than the visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 This command also works for special buffers that contain text which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 doesn't come from a file, but reflects some other data base instead:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 for example, Dired buffers and buffer-list buffers. In these cases,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 it reconstructs the buffer contents from the appropriate data base.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 When called from Lisp, the first argument is IGNORE-AUTO; only offer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 to revert from the auto-save file when this is nil. Note that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 sense of this argument is the reverse of the prefix argument, for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 sake of backward compatibility. IGNORE-AUTO is optional, defaulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 to nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 Optional second argument NOCONFIRM means don't ask for confirmation at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 Optional third argument PRESERVE-MODES non-nil means don't alter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 the files modes. Normally we reinitialize them using `normal-mode'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 If the value of `revert-buffer-function' is non-nil, it is called to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 do all the work for this command. Otherwise, the hooks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 `before-revert-hook' and `after-revert-hook' are run at the beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 and the end, and if `revert-buffer-insert-file-contents-function' is
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2813 non-nil, it is called instead of rereading visited file contents.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2814
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2815 If the buffer has not been obviously modified, and no auto-save file
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2816 exists, then `revert-buffer-internal' is
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2817 called. `revert-buffer-internal' will not actually change the buffer
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2818 at all if reversion would not cause any user-visible changes."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 ;; I admit it's odd to reverse the sense of the prefix argument, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 ;; there is a lot of code out there which assumes that the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 ;; argument should be t to avoid consulting the auto-save file, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 ;; there's no straightforward way to encourage authors to notice a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 ;; reversal of the argument sense. So I'm just changing the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 ;; interface, but leaving the programmatic interface the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 (interactive (list (not current-prefix-arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 (if revert-buffer-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 (funcall revert-buffer-function ignore-auto noconfirm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 (let* ((opoint (point))
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2830 (newbuf nil)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2831 (delay-prompt nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 (auto-save-p (and (not ignore-auto)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 (recent-auto-save-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 (file-readable-p buffer-auto-save-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 (y-or-n-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 "Buffer has been auto-saved recently. Revert from auto-save file? ")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 (file-name (if auto-save-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 buffer-file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 (cond ((null file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 (error "Buffer does not seem to be associated with any file"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 ((or noconfirm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 (and (not (buffer-modified-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 (let (found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 (dolist (rx revert-without-query found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 (when (string-match rx file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 (setq found t)))))
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2849 ;; If we might perform an optimized revert then we
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2850 ;; want to delay prompting in case we don't need to
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2851 ;; do it at all
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2852 (and (not auto-save-p)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2853 (not (buffer-modified-p))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2854 (setq delay-prompt t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 (yes-or-no-p (format "Revert buffer from file %s? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 (run-hooks 'before-revert-hook)
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2858 ;; Only perform our optimized revert if nothing obvious
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2859 ;; has changed.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2860 (cond ((or auto-save-p
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2861 (buffer-modified-p)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2862 (and (setq newbuf (revert-buffer-internal
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2863 file-name))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2864 (and delay-prompt
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2865 (yes-or-no-p
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2866 (format "Revert buffer from file %s? "
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2867 file-name)))))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2868 ;; If file was backed up but has changed since,
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2869 ;; we should make another backup.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2870 (and (not auto-save-p)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2871 (not (verify-visited-file-modtime (current-buffer)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2872 (setq buffer-backed-up nil))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2873 ;; Get rid of all undo records for this buffer.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2874 (or (eq buffer-undo-list t)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2875 (setq buffer-undo-list nil))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2876 ;; Effectively copy the after-revert-hook status,
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2877 ;; since after-find-file will clobber it.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2878 (let ((global-hook (default-value 'after-revert-hook))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2879 (local-hook-p (local-variable-p 'after-revert-hook
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2880 (current-buffer)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2881 (local-hook (and (local-variable-p 'after-revert-hook
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2882 (current-buffer))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2883 after-revert-hook)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2884 (let (buffer-read-only
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2885 ;; Don't make undo records for the reversion.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2886 (buffer-undo-list t))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2887 (if revert-buffer-insert-file-contents-function
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2888 (funcall revert-buffer-insert-file-contents-function
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2889 file-name auto-save-p)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2890 (if (not (file-exists-p file-name))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2891 (error "File %s no longer exists!" file-name))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2892 ;; Bind buffer-file-name to nil
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2893 ;; so that we don't try to lock the file.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2894 (let ((buffer-file-name nil))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2895 (or auto-save-p
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2896 (unlock-buffer)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2897 (widen)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2898 ;; When reading in an autosave, it's encoded using
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2899 ;; `escape-quoted', so we need to use it. (It is always
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2900 ;; safe to specify `escape-quoted':
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2901 ;;
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2902 ;; 1. If file-coding but no Mule, `escape-quoted' is
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2903 ;; aliased to `binary'.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2904 ;; 2. If no file-coding, all coding systems devolve into
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2905 ;; `binary'.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2906 ;; 3. ASCII and ISO8859-1 are encoded the same in both
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2907 ;; `binary' and `escape-quoted', so they will be
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2908 ;; compatible for the most part.)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2909 ;;
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2910 ;; Otherwise, use coding-system-for-read if explicitly
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2911 ;; given (e.g. the "Revert Buffer with Specified
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2912 ;; Encoding" menu entries), or use the coding system
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2913 ;; that the file was loaded as.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2914 (let* ((coding-system-for-read
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2915 (if auto-save-p 'escape-quoted
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2916 (or coding-system-for-read
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2917 buffer-file-coding-system-when-loaded)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2918 ;; If the bfcs wasn't changed from its original
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2919 ;; value (other than possible EOL change), then we
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2920 ;; should update it for the new coding system.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2921 (should-update-bfcs
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2922 (eq (coding-system-base
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2923 buffer-file-coding-system-when-loaded)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2924 (coding-system-base
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2925 buffer-file-coding-system)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2926 (old-bfcs buffer-file-coding-system)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2927 ;; But if the EOL was changed, match it in the new
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2928 ;; value of bfcs.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2929 (adjust-eol
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2930 (and should-update-bfcs
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2931 (not
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2932 (eq (get-coding-system
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2933 buffer-file-coding-system-when-loaded)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2934 (get-coding-system
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2935 buffer-file-coding-system))))))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2936 (insert-file-contents file-name (not auto-save-p)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2937 nil nil t)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2938 (when should-update-bfcs
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2939 (setq buffer-file-coding-system old-bfcs)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2940 (set-buffer-file-coding-system
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2941 (if adjust-eol
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2942 (coding-system-base
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2943 buffer-file-coding-system-when-loaded)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
2944 buffer-file-coding-system-when-loaded)
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2945 (not adjust-eol))))))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2946 (goto-char (min opoint (point-max)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2947 ;; Recompute the truename in case changes in symlinks
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2948 ;; have changed the truename.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2949 ;;XEmacs: already done by insert-file-contents
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2950 ;;(setq buffer-file-truename
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2951 ;;(abbreviate-file-name (file-truename buffer-file-name)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2952 (after-find-file nil nil t t preserve-modes)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2953 ;; Run after-revert-hook as it was before we reverted.
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2954 (setq-default revert-buffer-internal-hook global-hook)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2955 (if local-hook-p
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2956 (progn
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2957 (make-local-variable 'revert-buffer-internal-hook)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2958 (setq revert-buffer-internal-hook local-hook))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2959 (kill-local-variable 'revert-buffer-internal-hook))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2960 (run-hooks 'revert-buffer-internal-hook)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2961 ((null newbuf)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2962 ;; The resultant buffer is identical, alter
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2963 ;; modtime, update mods and exit
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2964 (set-visited-file-modtime)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2965 (after-find-file nil nil t t t))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2966 (t t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2969 (defun revert-buffer-internal (&optional file-name)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2970 (let* ((newbuf (get-buffer-create " *revert*"))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2971 bmin bmax)
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2972 (save-excursion
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2973 (set-buffer newbuf)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2974 (with-obsolete-variable '(before-change-function after-change-function)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2975 (let (buffer-read-only
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2976 (buffer-undo-list t)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2977 after-change-function
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2978 after-change-functions
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2979 before-change-function
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2980 before-change-functions)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2981 (if revert-buffer-insert-file-contents-function
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2982 (funcall revert-buffer-insert-file-contents-function
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2983 file-name nil)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2984 (if (not (file-exists-p file-name))
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2985 (error "File %s no longer exists!" file-name))
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2986 (widen)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2987 (insert-file-contents file-name t nil nil t)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2988 (setq bmin (point-min)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 819
diff changeset
2989 bmax (point-max))))))
819
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2990 (if (not (and (eq bmin (point-min))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2991 (eq bmax (point-max))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2992 (eq (compare-buffer-substrings
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2993 newbuf bmin bmax (current-buffer) bmin bmax) 0)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2994 newbuf
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2995 nil)))
6504113e7c2d [xemacs-hg @ 2002-04-25 18:03:23 by andyp]
andyp
parents: 801
diff changeset
2996
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 (defun recover-file (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 "Visit file FILE, but get contents from its last auto-save file."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 ;; Actually putting the file name in the minibuffer should be used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 ;; only rarely.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 ;; Not just because users often use the default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 (interactive "FRecover file: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 (setq file (expand-file-name file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 (let ((handler (or (find-file-name-handler file 'recover-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 (find-file-name-handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 (let ((buffer-file-name file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 (make-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 'recover-file))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 (funcall handler 'recover-file file)
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3011 (if (auto-save-file-name-p (file-name-nondirectory file))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 (error "%s is an auto-save file" file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 (let ((file-name (let ((buffer-file-name file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 (make-auto-save-file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 (cond ((if (file-exists-p file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 (not (file-newer-than-file-p file-name file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 (not (file-exists-p file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 (error "Auto-save file %s not current" file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 ((save-window-excursion
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3020 ;; XEmacs change: use insert-directory instead of
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3021 ;; calling ls directly.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3022 (with-output-to-temp-buffer "*Directory*"
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3023 (buffer-disable-undo standard-output)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3024 (save-excursion
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3025 (set-buffer "*Directory*")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3026 (setq default-directory (file-name-directory file))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3027 (insert-directory file
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3028 (if (file-symlink-p file) "-lL" "-l"))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3029 (setq default-directory (file-name-directory file-name))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3030 (insert-directory file-name "-l")))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 (yes-or-no-p (format "Recover auto save file %s? " file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 (switch-to-buffer (find-file-noselect file t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 (let ((buffer-read-only nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 (erase-buffer)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
3035 (let ((coding-system-for-read 'escape-quoted))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
3036 (insert-file-contents file-name nil)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 (after-find-file nil nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 (t (error "Recover-file cancelled.")))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 (defun recover-session ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 "Recover auto save files from a previous Emacs session.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 This command first displays a Dired buffer showing you the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 previous sessions that you could recover from.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 To choose one, move point to the proper line and then type C-c C-c.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 Then you'll be asked about a number of files to recover."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 (unless (fboundp 'dired)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 (error "recover-session requires dired"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 (if (null auto-save-list-file-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 "You set `auto-save-list-file-prefix' to disable making session files"))
776
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 774
diff changeset
3052 (declare-fboundp (dired (concat auto-save-list-file-prefix "*")))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 (or (looking-at "Move to the session you want to recover,")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 (let ((inhibit-read-only t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 (insert "Move to the session you want to recover,\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 "then type C-c C-c to select it.\n\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 "You can also delete some of these files;\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 "type d on a line to mark that file for deletion.\n\n")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 (use-local-map (let ((map (make-sparse-keymap)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 (set-keymap-parents map (list (current-local-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 (define-key (current-local-map) "\C-c\C-c" 'recover-session-finish))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 (defun recover-session-finish ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 "Choose one saved session to recover auto-save files from.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 This command is used in the special Dired buffer created by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 \\[recover-session]."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 ;; Get the name of the session file to recover from.
526
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
3071 (let ((file (declare-fboundp (dired-get-filename)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 (buffer (get-buffer-create " *recover*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 ;; #### dired-do-flagged-delete in FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 ;; This version is for ange-ftp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 ;;(dired-do-deletions t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 ;; This version is for efs
526
a5ee2ca8672c [xemacs-hg @ 2001-05-09 17:18:32 by ben]
ben
parents: 502
diff changeset
3078 (declare-fboundp (dired-expunge-deletions))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 ;; Read in the auto-save-list file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 (set-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 (erase-buffer)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
3084 (let ((coding-system-for-read 'escape-quoted))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 727
diff changeset
3085 (insert-file-contents file))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 ;; Loop thru the text of that file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 ;; and get out the names of the files to recover.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 (let (thisfile autofile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 (if (eolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 ;; This is a pair of lines for a non-file-visiting buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 ;; Get the auto-save file name and manufacture
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 ;; a "visited file name" from that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 (setq autofile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 (buffer-substring-no-properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 (end-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 (setq thisfile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 (expand-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 (substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 (file-name-nondirectory autofile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 1 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 (file-name-directory autofile)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 ;; This pair of lines is a file-visiting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 ;; buffer. Use the visited file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 (setq thisfile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 (buffer-substring-no-properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 (point) (progn (end-of-line) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 (setq autofile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 (buffer-substring-no-properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 (point) (progn (end-of-line) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 (forward-line 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 ;; Ignore a file if its auto-save file does not exist now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 (if (file-exists-p autofile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 (setq files (cons thisfile files)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 (setq files (nreverse files))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 ;; The file contains a pair of line for each auto-saved buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 ;; The first line of the pair contains the visited file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 ;; or is empty if the buffer was not visiting a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 ;; The second line is the auto-save file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 (if files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 (map-y-or-n-p "Recover %s? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 (lambda (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 (save-excursion (recover-file file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 (error
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 792
diff changeset
3134 (lwarn 'recover 'alert "Failed to recover `%s'" file))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 '("file" "files" "recover"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 (message "No files can be recovered from this session now")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 (kill-buffer buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 (defun kill-some-buffers (&optional list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 "For each buffer in LIST, ask whether to kill it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 LIST defaults to all existing live buffers."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 (if (null list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 (setq list (buffer-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 (while list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 (let* ((buffer (car list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 (name (buffer-name buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 (and (not (string-equal name ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 (/= (aref name 0) ?\ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 (format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 (if (buffer-modified-p buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 (gettext "Buffer %s HAS BEEN EDITED. Kill? ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 (gettext "Buffer %s is unmodified. Kill? "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 (kill-buffer buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 (setq list (cdr list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 (defun auto-save-mode (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 "Toggle auto-saving of contents of current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 With prefix argument ARG, turn auto-saving on if positive, else off."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 (setq buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 (and (if (null arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 (or (not buffer-auto-save-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 ;; If autosave is off because buffer has shrunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 ;; then toggling should turn it on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 (< buffer-saved-size 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 (or (eq arg t) (listp arg) (and (integerp arg) (> arg 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 (if (and buffer-file-name auto-save-visited-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 (not buffer-read-only))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 (make-auto-save-file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 ;; If -1 was stored here, to temporarily turn off saving,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 ;; turn it back on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 (and (< buffer-saved-size 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 (setq buffer-saved-size 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179 (if (interactive-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 (if buffer-auto-save-file-name ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 (display-message 'command "Auto-save on (in this buffer)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 (display-message 'command "Auto-save off (in this buffer)")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 buffer-auto-save-file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 (defun rename-auto-save-file ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 "Adjust current buffer's auto save file name for current conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 Also rename any existing auto save file, if it was made in this session."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 (let ((osave buffer-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 (setq buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 (make-auto-save-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 (if (and osave buffer-auto-save-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 (not (string= buffer-auto-save-file-name buffer-file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 (not (string= buffer-auto-save-file-name osave))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 (file-exists-p osave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 (recent-auto-save-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 (rename-file osave buffer-auto-save-file-name t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3198 ;; make-auto-save-file-name and auto-save-file-name-p are now only in
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3199 ;; auto-save.el.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 (defun wildcard-to-regexp (wildcard)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 "Given a shell file name pattern WILDCARD, return an equivalent regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 The generated regexp will match a filename iff the filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 matches that wildcard according to shell rules. Only wildcards known
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 by `sh' are supported."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 (let* ((i (string-match "[[.*+\\^$?]" wildcard))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 ;; Copy the initial run of non-special characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 (result (substring wildcard 0 i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 (len (length wildcard)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 ;; If no special characters, we're almost done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 (if i
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 (while (< i len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 (let ((ch (aref wildcard i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 j)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 (setq
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 (concat result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 ((eq ch ?\[) ; [...] maps to regexp char class
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 (setq i (1+ i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 (concat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 ((eq (aref wildcard i) ?!) ; [!...] -> [^...]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 (setq i (1+ i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 (if (eq (aref wildcard i) ?\])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 (setq i (1+ i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 "[^]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 "[^")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 ((eq (aref wildcard i) ?^)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 ;; Found "[^". Insert a `\0' character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 ;; (which cannot happen in a filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 ;; into the character class, so that `^'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 ;; is not the first character after `[',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 ;; and thus non-special in a regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 (setq i (1+ i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 "[\000^"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 ((eq (aref wildcard i) ?\])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 ;; I don't think `]' can appear in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 ;; character class in a wildcard, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 ;; let's be general here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 (setq i (1+ i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 "[]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 (t "["))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 (prog1 ; copy everything upto next `]'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 (substring wildcard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 i
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 (setq j (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 "]" wildcard i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 (setq i (if j (1- j) (1- len)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 ((eq ch ?.) "\\.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 ((eq ch ?*) "[^\000]*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 ((eq ch ?+) "\\+")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 ((eq ch ?^) "\\^")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 ((eq ch ?$) "\\$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 ((eq ch ?\\) "\\\\") ; probably cannot happen...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 ((eq ch ??) "[^\000]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 (t (char-to-string ch)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 (setq i (1+ i)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 ;; Shell wildcards should match the entire filename,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 ;; not its part. Make the regexp say so.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 (concat "\\`" result "\\'")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 (defcustom list-directory-brief-switches "-CF"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 "*Switches for list-directory to pass to `ls' for brief listing."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 :type 'string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 :group 'dired)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 (defcustom list-directory-verbose-switches "-l"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 "*Switches for list-directory to pass to `ls' for verbose listing,"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 :type 'string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 :group 'dired)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 (defun list-directory (dirname &optional verbose)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 "Display a list of files in or matching DIRNAME, a la `ls'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 DIRNAME is globbed by the shell if necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 Prefix arg (second arg if noninteractive) means supply -l switch to `ls'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 Actions controlled by variables `list-directory-brief-switches'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 and `list-directory-verbose-switches'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 (interactive (let ((pfx current-prefix-arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 (list (read-file-name (if pfx (gettext "List directory (verbose): ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 (gettext "List directory (brief): "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 nil default-directory nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 pfx)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 (let ((switches (if verbose list-directory-verbose-switches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 list-directory-brief-switches)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 (or dirname (setq dirname default-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 (setq dirname (expand-file-name dirname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 (with-output-to-temp-buffer "*Directory*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 (buffer-disable-undo standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 (princ "Directory ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 (princ dirname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 (terpri)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 (set-buffer "*Directory*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 (setq default-directory (file-name-directory dirname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 (let ((wildcard (not (file-directory-p dirname))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 (insert-directory dirname switches wildcard (not wildcard)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 (defvar insert-directory-program "ls"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 "Absolute or relative name of the `ls' program used by `insert-directory'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 ;; insert-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 ;; - must insert _exactly_one_line_ describing FILE if WILDCARD and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 ;; FULL-DIRECTORY-P is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 ;; The single line of output must display FILE's name as it was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 ;; given, namely, an absolute path name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 ;; - must insert exactly one line for each file if WILDCARD or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 ;; FULL-DIRECTORY-P is t, plus one optional "total" line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 ;; before the file lines, plus optional text after the file lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 ;; Lines are delimited by "\n", so filenames containing "\n" are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 ;; allowed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 ;; File lines should display the basename.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 ;; - must be consistent with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 ;; - functions dired-move-to-filename, (these two define what a file line is)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 ;; dired-move-to-end-of-filename,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 ;; dired-between-files, (shortcut for (not (dired-move-to-filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 ;; dired-insert-headerline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 ;; dired-after-subdir-garbage (defines what a "total" line is)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325 ;; - variable dired-subdir-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 (defun insert-directory (file switches &optional wildcard full-directory-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 "Insert directory listing for FILE, formatted according to SWITCHES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 Leaves point after the inserted text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 SWITCHES may be a string of options, or a list of strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 Optional third arg WILDCARD means treat FILE as shell wildcard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 Optional fourth arg FULL-DIRECTORY-P means file is a directory and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 switches do not contain `d', so that a full listing is expected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 This works by running a directory listing program
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 whose name is in the variable `insert-directory-program'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 If WILDCARD, it also runs the shell specified by `shell-file-name'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 ;; We need the directory in order to find the right handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 (let ((handler (find-file-name-handler (expand-file-name file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 'insert-directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 (if handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 (funcall handler 'insert-directory file switches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 wildcard full-directory-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 (cond
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3344 ;; [mswindows-insert-directory should be called
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3345 ;; nt-insert-directory - kkm]. not true any more according to
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 444
diff changeset
3346 ;; my new naming scheme. --ben
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 ((and (fboundp 'mswindows-insert-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 (eq system-type 'windows-nt))
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 612
diff changeset
3349 (declare-fboundp (mswindows-insert-directory
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 612
diff changeset
3350 file switches wildcard full-directory-p)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 (if wildcard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 ;; Run ls in the directory of the file pattern we asked for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 (let ((default-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 (if (file-name-absolute-p file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 (file-name-directory file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 (file-name-directory (expand-file-name file))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 (pattern (file-name-nondirectory file))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3359 (start 0))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 ;; Quote some characters that have special meanings in shells;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 ;; but don't quote the wildcards--we want them to be special.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 ;; We also currently don't quote the quoting characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 ;; in case people want to use them explicitly to quote
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 ;; wildcard characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 ;;#### Unix-specific
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3366 (while (string-match "[ \t\n;<>&|()#$]" pattern start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 (setq pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 (concat (substring pattern 0 (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 "\\"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 (substring pattern (match-beginning 0)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3371 start (1+ (match-end 0))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 (call-process shell-file-name nil t nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 "-c" (concat "\\" ;; Disregard shell aliases!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 insert-directory-program
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 " -d "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 (if (stringp switches)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 switches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 (mapconcat 'identity switches " "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 " "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 pattern)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 ;; SunOS 4.1.3, SVr4 and others need the "." to list the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 ;; directory if FILE is a symbolic link.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 (apply 'call-process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 insert-directory-program nil t nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 (let (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 (if (listp switches)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 (setq list switches)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 (if (not (equal switches ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 ;; Split the switches at any spaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 ;; so we can pass separate options as separate args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392 (while (string-match " " switches)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 (setq list (cons (substring switches 0 (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 switches (substring switches (match-end 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 (setq list (cons switches list)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397 (append list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398 (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 (if full-directory-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 (concat (file-name-as-directory file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 ;;#### Unix-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 ".")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403 file)))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 (defvar kill-emacs-query-functions nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 "Functions to call with no arguments to query about killing XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 If any of these functions returns nil, killing Emacs is cancelled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 `save-buffers-kill-emacs' (\\[save-buffers-kill-emacs]) calls these functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 but `kill-emacs', the low level primitive, does not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 See also `kill-emacs-hook'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412 (defun save-buffers-kill-emacs (&optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 "Offer to save each buffer, then kill this XEmacs process.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 With prefix arg, silently save all file-visiting buffers, then kill."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 (save-some-buffers arg t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 (and (or (not (memq t (mapcar #'(lambda (buf) (and (buffer-file-name buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 (buffer-modified-p buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 (buffer-list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 (yes-or-no-p "Modified buffers exist; exit anyway? "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 (or (not (fboundp 'process-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422 ;; process-list is not defined on VMS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423 (let ((processes (process-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 (while processes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 (and (memq (process-status (car processes)) '(run stop open))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 (let ((val (process-kill-without-query (car processes))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 (process-kill-without-query (car processes) val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 (setq active t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 (setq processes (cdr processes)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 (or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 (not active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436 (delete-other-windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 (list-processes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 "Active processes exist; kill them and exit anyway? "))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 ;; Query the user for other things, perhaps.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 (run-hook-with-args-until-failure 'kill-emacs-query-functions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 (kill-emacs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444 (defun symlink-expand-file-name (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 "If FILENAME is a symlink, return its non-symlink equivalent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 Unlike `file-truename', this doesn't chase symlinks in directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 components of the file or expand a relative pathname into an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448 absolute one."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 (let ((count 20))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 (while (and (> count 0) (file-symlink-p filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 (setq filename (file-symlink-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 count (1- count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 (if (> count 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 (error "Apparently circular symlink path"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 ;; Suggested by Michael Kifer <kifer@CS.SunySB.EDU>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 (defun file-remote-p (file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 "Test whether FILE-NAME is looked for on a remote system."
776
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 774
diff changeset
3460 (cond ((not (declare-boundp allow-remote-paths)) nil)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
3461 ((fboundp 'ange-ftp-ftp-path)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
3462 (declare-fboundp (ange-ftp-ftp-path file-name)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
3463 ((fboundp 'efs-ftp-path)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 464
diff changeset
3464 (declare-fboundp (efs-ftp-path file-name)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 ;; #### FSF has file-name-non-special here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 ;;; files.el ends here