--- /dev/null
+(defun find-alternate-file (filename)
+ "Find file FILENAME, select its buffer, kill previous buffer.
+If the current buffer now contains an empty file that you just visited
+\(presumably by mistake), use this command to visit the file you really want.
+
+This function has been modified by Ian Jackson so as to revert to the
+old (Emacs 18) behaviour of not requiring you to cut out the current
+buffer's filename."
+ (interactive
+ (let ((file buffer-file-name)
+ (file-dir nil))
+ (and file
+ (setq file-dir (file-name-directory file)))
+ (list (read-file-name
+ "Find alternate file: " file-dir nil nil nil))))
+ (and (buffer-modified-p)
+ ;; (not buffer-read-only)
+ (not (yes-or-no-p (format "Buffer %s is modified; kill anyway? "
+ (buffer-name))))
+ (error "Aborted"))
+ (let ((obuf (current-buffer))
+ (ofile buffer-file-name)
+ (onum buffer-file-number)
+ (otrue buffer-file-truename)
+ (oname (buffer-name)))
+ (rename-buffer " **lose**")
+ (setq buffer-file-name nil)
+ (setq buffer-file-number nil)
+ (setq buffer-file-truename nil)
+ (unwind-protect
+ (progn
+ (unlock-buffer)
+ (find-file filename))
+ (cond ((eq obuf (current-buffer))
+ (setq buffer-file-name ofile)
+ (setq buffer-file-number onum)
+ (setq buffer-file-truename otrue)
+ (lock-buffer)
+ (rename-buffer oname))))
+ (or (eq (current-buffer) obuf)
+ (kill-buffer obuf))))
+
+(provide 'find-alternate-18style)