X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Ffiles.el;h=b86b92943c9b2092ed8328c8e02d0a75a3f8be24;hb=e714bc316e9cb4e651289624616cf86a10af4767;hp=93a0c36a51eb1c814685771d865e85da4b3ff752;hpb=f52a96980ed9280f8f906a20d4b899dc0b027644;p=chise%2Fxemacs-chise.git- diff --git a/lisp/files.el b/lisp/files.el index 93a0c36..b86b929 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -291,11 +291,11 @@ changing the major mode does not clear it. However, calling (defvar after-set-visited-file-name-hooks nil "List of functions to be called after \\[set-visited-file-name] or during \\[write-file]. -You can use this hook to restore local values of write-file-hooks, -after-save-hook, and revert-buffer-function, which pertain +You can use this hook to restore local values of `write-file-hooks', +`after-save-hook', and `revert-buffer-function', which pertain to a specific file and therefore are normally killed by a rename. -Put hooks pertaining to the buffer contents on write-contents-hooks -and revert-buffer-insert-file-contents-function.") +Put hooks pertaining to the buffer contents on `write-contents-hooks' +and `revert-buffer-insert-file-contents-function'.") (defvar write-contents-hooks nil "List of functions to be called before writing out a buffer to a file. @@ -371,11 +371,22 @@ and ignores this variable." ; (apply op args)) (defun convert-standard-filename (filename) - "Convert a standard file's name to something suitable for the current OS. -This function's standard definition is trivial; it just returns the argument. -However, on some systems, the function is redefined -with a definition that really does change some file names." - filename) + "Convert a standard file's name to something suitable for the current OS." + (if (eq system-type 'windows-nt) + (let ((name (copy-sequence filename)) + (start 0)) + ;; leave ':' if part of drive specifier + (if (eq (aref name 1) ?:) + (setq start 2)) + ;; destructively replace invalid filename characters with ! + (while (string-match "[?*:<>|\"\000-\037]" name start) + (aset name (match-beginning 0) ?!) + (setq start (match-end 0))) + ;; FSF: [convert directory separators to Windows format ...] + ;; unneeded in XEmacs. + name) + filename)) + (defun pwd () "Show the current default directory." @@ -870,29 +881,35 @@ If there is no such live buffer, return nil." (setq list (cdr list)))) found)))) -(defun insert-file-contents-literally (filename &optional visit beg end replace) - "Like `insert-file-contents', q.v., but only reads in the file literally. +(defun insert-file-contents-literally (filename &optional visit start end replace) + "Like `insert-file-contents', q.v., but only reads in the file. A buffer may be modified in several ways after reading into the buffer due to advanced Emacs features, such as format decoding, character code -conversion,find-file-hooks, automatic uncompression, etc. - -This function ensures that none of these modifications will take place." - (let ((format-alist nil) - (after-insert-file-functions nil) - (coding-system-for-read 'binary) - (coding-system-for-write 'binary) - (jka-compr-compression-info-list nil) - (find-buffer-file-type-function - (if (fboundp 'find-buffer-file-type) - (symbol-function 'find-buffer-file-type) - nil))) - (unwind-protect - (progn - (fset 'find-buffer-file-type (lambda (filename) t)) - (insert-file-contents filename visit beg end replace)) - (if find-buffer-file-type-function - (fset 'find-buffer-file-type find-buffer-file-type-function) - (fmakunbound 'find-buffer-file-type))))) +conversion, find-file-hooks, automatic uncompression, etc. + + This function ensures that none of these modifications will take place." + (let ((wrap-func (find-file-name-handler filename + 'insert-file-contents-literally))) + (if wrap-func + (funcall wrap-func 'insert-file-contents-literally filename + visit start end replace) + (let ((file-name-handler-alist nil) + (format-alist nil) + (after-insert-file-functions nil) + (coding-system-for-read 'binary) + (coding-system-for-write 'binary) + (jka-compr-compression-info-list nil) + (find-buffer-file-type-function + (if (fboundp 'find-buffer-file-type) + (symbol-function 'find-buffer-file-type) + nil))) + (unwind-protect + (progn + (fset 'find-buffer-file-type (lambda (filename) t)) + (insert-file-contents filename visit start end replace)) + (if find-buffer-file-type-function + (fset 'find-buffer-file-type find-buffer-file-type-function) + (fmakunbound 'find-buffer-file-type))))))) (defun find-file-noselect (filename &optional nowarn rawfile) "Read file FILENAME into a buffer and return the buffer. @@ -1168,11 +1185,12 @@ run `normal-mode' explicitly." ("\\.m\\(?:[mes]\\|an\\)\\'" . nroff-mode) ("\\.icn\\'" . icon-mode) ("\\.\\(?:[ckz]?sh\\|shar\\)\\'" . sh-mode) - ("\\.pro\\'" . idlwave-mode) + ("\\.[Pp][Rr][Oo]\\'" . idlwave-mode) ;; #### Unix-specific! ("/\\.\\(?:bash_\\|z\\)?\\(profile\\|login\\|logout\\)\\'" . sh-mode) ("/\\.\\(?:[ckz]sh\\|bash\\|tcsh\\|es\\|xinit\\|startx\\)rc\\'" . sh-mode) ("/\\.\\(?:[kz]shenv\\|xsession\\)\\'" . sh-mode) + ("\\.m?spec$" .sh-mode) ;; The following come after the ChangeLog pattern for the sake of ;; ChangeLog.1, etc. and after the .scm.[0-9] pattern too. ("\\.[12345678]\\'" . nroff-mode) @@ -1200,7 +1218,6 @@ run `normal-mode' explicitly." ("\\.[sj]?html?\\'" . html-mode) ("\\.jsp\\'" . html-mode) ("\\.xml\\'" . xml-mode) - ("\\.htm?l?3\\'" . html3-mode) ("\\.\\(?:sgml?\\|dtd\\)\\'" . sgml-mode) ("\\.c?ps\\'" . postscript-mode) ;; .emacs following a directory delimiter in either Unix or @@ -1209,7 +1226,7 @@ run `normal-mode' explicitly." ("\\.m4\\'" . autoconf-mode) ("configure\\.in\\'" . autoconf-mode) ("\\.ml\\'" . lisp-mode) - ("\\.ma?k\\'" . makefile-mode) + ("\\.ma?ke?\\'" . makefile-mode) ("[Mm]akefile\\(\\.\\|\\'\\)" . makefile-mode) ("\\.X\\(defaults\\|environment\\|resources\\|modmap\\)\\'" . xrdb-mode) ;; #### The following three are Unix-specific (but do we care?) @@ -1255,7 +1272,7 @@ If it matches, mode MODE is selected.") (defvar binary-file-regexps (purecopy - '("\\.\\(?:bz2\\|elc\\|g\\(if\\|z\\)\\|jp\\(eg\\|g\\)\\|png\\|t\\(ar\\|gz\\|iff\\)\\|[Zo]\\)\\'")) + '("\\.\\(?:bz2\\|elc\\|g\\(if\\|z\\)\\|jp\\(eg\\|g\\)\\|png\\|PNG\\|t\\(ar\\|gz\\|iff\\)\\|[Zo]\\)\\'")) "List of regexps of filenames containing binary (non-text) data.") ; (eval-when-compile @@ -1275,9 +1292,9 @@ If it matches, mode MODE is selected.") ; "tiff" ; "jpg" ; "jpeg")))))) - + (defvar inhibit-first-line-modes-regexps - (purecopy binary-file-regexps) + binary-file-regexps "List of regexps; if one matches a file name, don't look for `-*-'.") (defvar inhibit-first-line-modes-suffixes nil @@ -1475,7 +1492,7 @@ for current buffer." (or force (hack-local-variables-p nil)))) (let ((continue t) - prefix prefixlen suffix beg + prefix prefixlen suffix start (enable-local-eval enable-local-eval)) ;; The prefix is what comes before "local variables:" in its line. ;; The suffix is what comes after "local variables:" in its line. @@ -1502,11 +1519,11 @@ for current buffer." (error "Local variables entry is missing the prefix"))) ;; Find the variable name; strip whitespace. (skip-chars-forward " \t") - (setq beg (point)) + (setq start (point)) (skip-chars-forward "^:\n") (if (eolp) (error "Missing colon in local variables entry")) (skip-chars-backward " \t") - (let* ((str (buffer-substring beg (point))) + (let* ((str (buffer-substring start (point))) (var (read str)) val) ;; Setting variable named "end" means end of list. @@ -1545,7 +1562,7 @@ for current buffer." (cond ((not (search-forward "-*-" end t)) ;; doesn't have one. (setq force t)) - ((looking-at "[ \t]*\\([^ \t\n\r:;]+\\)\\([ \t]*-\\*-\\)") + ((looking-at "[ \t]*\\([^ \t\n\r:;]+?\\)\\([ \t]*-\\*-\\)") ;; Antiquated form: "-*- ModeName -*-". (setq result (list (cons 'mode @@ -1923,7 +1940,9 @@ of the new file to agree with the old modes." (setq setmodes (file-modes backupname))) (file-error ;; If trouble writing the backup, write it in ~. - (setq backupname (expand-file-name "~/%backup%~")) + (setq backupname + (expand-file-name + (convert-standard-filename "~/%backup%~"))) (message "Cannot write backup file; backing up in ~/%%backup%%~") (sleep-for 1) (condition-case () @@ -2009,6 +2028,7 @@ the value is \"\"." (defun make-backup-file-name (file) "Create the non-numeric backup file name for FILE. This is a separate function so you can redefine it for customization." + ;; FSF has code here for MS-DOS short filenames, not supported in XEmacs. (concat file "~")) (defun backup-file-name-p (file) @@ -2036,6 +2056,7 @@ the index in the name where the version number begins." Value is a list whose car is the name for the backup file and whose cdr is a list of old versions to consider deleting now. If the value is nil, don't make a backup." + (declare (special bv-length)) (let ((handler (find-file-name-handler fn 'find-backup-file-name))) ;; Run a handler for this function so that ange-ftp can refuse to do it. (if handler @@ -2086,9 +2107,8 @@ If the value is nil, don't make a backup." "Convert FILENAME to be relative to DIRECTORY (default: default-directory). This function returns a relative file name which is equivalent to FILENAME when used with that default directory as the default. -If this is impossible (which can happen on MSDOS and Windows -when the file name and directory use different drive names) -then it returns FILENAME." +If this is impossible (which can happen on MS Windows when the file name +and directory use different drive names) then it returns FILENAME." (save-match-data (let ((fname (expand-file-name filename))) (setq directory (file-name-as-directory @@ -2240,7 +2260,7 @@ After saving the buffer, run `after-save-hook'." (goto-char (point-max)) (insert ?\n))) - ;; Run the write-file-hooks until one returns non-null. + ;; Run the write-file-hooks until one returns non-nil. ;; Bind after-save-hook to nil while running the ;; write-file-hooks so that if this function is called ;; recursively (from inside a write-file-hook) the @@ -2356,9 +2376,9 @@ After saving the buffer, run `after-save-hook'." "Provide a clean way for a write-file-hook to wrap AROUND the execution of the remaining hooks and writing to disk. Do not call this function except from a functions -on the write-file-hooks or write-contents-hooks list. +on the `write-file-hooks' or `write-contents-hooks' list. A hook that calls this function must return non-nil, -to signal completion to its caller. continue-save-buffer +to signal completion to its caller. `continue-save-buffer' always returns non-nil." (let ((hooks (cdr (or continue-save-buffer-hooks-tail (error @@ -2758,7 +2778,7 @@ non-nil, it is called instead of rereading visited file contents." 'recover-file)))) (if handler (funcall handler 'recover-file file) - (if (auto-save-file-name-p file) + (if (auto-save-file-name-p (file-name-nondirectory file)) (error "%s is an auto-save file" file)) (let ((file-name (let ((buffer-file-name file)) (make-auto-save-file-name)))) @@ -2767,12 +2787,17 @@ non-nil, it is called instead of rereading visited file contents." (not (file-exists-p file-name))) (error "Auto-save file %s not current" file-name)) ((save-window-excursion - (if (not (eq system-type 'windows-nt)) - (with-output-to-temp-buffer "*Directory*" - (buffer-disable-undo standard-output) - (call-process "ls" nil standard-output nil - (if (file-symlink-p file) "-lL" "-l") - file file-name))) + ;; XEmacs change: use insert-directory instead of + ;; calling ls directly. + (with-output-to-temp-buffer "*Directory*" + (buffer-disable-undo standard-output) + (save-excursion + (set-buffer "*Directory*") + (setq default-directory (file-name-directory file)) + (insert-directory file + (if (file-symlink-p file) "-lL" "-l")) + (setq default-directory (file-name-directory file-name)) + (insert-directory file-name "-l"))) (yes-or-no-p (format "Recover auto save file %s? " file-name))) (switch-to-buffer (find-file-noselect file t)) (let ((buffer-read-only nil)) @@ -2938,72 +2963,9 @@ Also rename any existing auto save file, if it was made in this session." (recent-auto-save-p)) (rename-file osave buffer-auto-save-file-name t)))) -;; see also ../packages/auto-save.el -(defun make-auto-save-file-name (&optional filename) - "Return file name to use for auto-saves of current buffer. -Does not consider `auto-save-visited-file-name' as that variable is checked -before calling this function. You can redefine this for customization. -See also `auto-save-file-name-p'." - (let ((fname (or filename buffer-file-name)) - name) - (setq name - (if fname - (concat (file-name-directory fname) - "#" - (file-name-nondirectory fname) - "#") - - ;; Deal with buffers that don't have any associated files. (Mail - ;; mode tends to create a good number of these.) - - (let ((buffer-name (buffer-name)) - (limit 0)) - ;; Use technique from Sebastian Kremer's auto-save - ;; package to turn slashes into \\!. This ensures that - ;; the auto-save buffer name is unique. - - ;; #### - yuck! yuck! yuck! move this functionality - ;; somewhere else and make the name translation customizable. - ;; Using "\!" as part of a filename on a UNIX filesystem is nearly - ;; IMPOSSIBLE to get past a shell parser. -stig - - (while (string-match "[/\\]" buffer-name limit) - (setq buffer-name - (concat (substring buffer-name 0 (match-beginning 0)) - (if (string= (substring buffer-name - (match-beginning 0) - (match-end 0)) - "/") - "\\!" - "\\\\") - (substring buffer-name (match-end 0)))) - (setq limit (1+ (match-end 0)))) - - ;; (expand-file-name (format "#%s#%s#" (buffer-name) (make-temp-name ""))) - - ;; jwz: putting the emacs PID in the auto-save file name - ;; is bad news, because that defeats auto-save-recovery of - ;; *mail* buffers -- the (sensible) code in sendmail.el - ;; calls (make-auto-save-file-name) to determine whether - ;; there is unsent, auto-saved mail to recover. If that - ;; mail came from a previous emacs process (far and away - ;; the most likely case) then this can never succeed as - ;; the pid differs. - - (expand-file-name (format "#%s#" buffer-name))) - )) - ;; don't try to write auto-save files in unwritable places. Unless - ;; there's already an autosave file here, put ours somewhere safe. --Stig - (if (or (file-writable-p name) - (file-exists-p name)) - name - (expand-file-name (concat "~/" (file-name-nondirectory name)))))) - -(defun auto-save-file-name-p (filename) - "Return non-nil if FILENAME can be yielded by `make-auto-save-file-name'. -FILENAME should lack slashes. -You can redefine this for customization." - (string-match "\\`#.*#\\'" filename)) +;; make-auto-save-file-name and auto-save-file-name-p are now only in +;; auto-save.el. + (defun wildcard-to-regexp (wildcard) "Given a shell file name pattern WILDCARD, return an equivalent regexp. @@ -3147,8 +3109,9 @@ If WILDCARD, it also runs the shell specified by `shell-file-name'." (funcall handler 'insert-directory file switches wildcard full-directory-p) (cond - ;; #### mswindows-insert-directory should be called - ;; nt-insert-directory - kkm. + ;; [mswindows-insert-directory should be called + ;; nt-insert-directory - kkm]. not true any more according to + ;; my new naming scheme. --ben ((and (fboundp 'mswindows-insert-directory) (eq system-type 'windows-nt)) (mswindows-insert-directory file switches wildcard full-directory-p)) @@ -3160,19 +3123,19 @@ If WILDCARD, it also runs the shell specified by `shell-file-name'." (file-name-directory file) (file-name-directory (expand-file-name file)))) (pattern (file-name-nondirectory file)) - (beg 0)) + (start 0)) ;; Quote some characters that have special meanings in shells; ;; but don't quote the wildcards--we want them to be special. ;; We also currently don't quote the quoting characters ;; in case people want to use them explicitly to quote ;; wildcard characters. ;;#### Unix-specific - (while (string-match "[ \t\n;<>&|()#$]" pattern beg) + (while (string-match "[ \t\n;<>&|()#$]" pattern start) (setq pattern (concat (substring pattern 0 (match-beginning 0)) "\\" (substring pattern (match-beginning 0))) - beg (1+ (match-end 0)))) + start (1+ (match-end 0)))) (call-process shell-file-name nil t nil "-c" (concat "\\" ;; Disregard shell aliases! insert-directory-program