chiark / gitweb /
Merge old CVS `ian-dotfiles' repo, as a subtree where we can pick bits
[ian-dotfiles.git] / from-cvs / files / emacs_find-alternate-18style.el
diff --git a/from-cvs/files/emacs_find-alternate-18style.el b/from-cvs/files/emacs_find-alternate-18style.el
new file mode 100644 (file)
index 0000000..beaa39d
--- /dev/null
@@ -0,0 +1,43 @@
+(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)