]> code.delx.au - gnu-emacs/blobdiff - lisp/delsel.el
(cvs-fileinfo-from-entries): Deal with Solaris'
[gnu-emacs] / lisp / delsel.el
index f0749eefe77225df0ea9a3396a3573f2c1f5c986..9488e94061e326084c9c6ca59d2b0534fd1beb1f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; delsel.el --- delete selection if you insert
 
-;; Copyright (C) 1992, 1997, 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1997, 1998, 2001 Free Software Foundation, Inc.
 
 ;; Author: Matthieu Devin <devin@lucid.com>
 ;; Maintainer: FSF
@@ -65,7 +65,7 @@ When Delete Selection mode is enabled, Transient Mark mode is also
 enabled and typed text replaces the selection if the selection is
 active.  Otherwise, typed text is just inserted at point regardless of
 any selection."
-  nil nil nil :global t :group 'editing-basics
+  :global t :group 'editing-basics
   (if (not delete-selection-mode)
       (remove-hook 'pre-command-hook 'delete-selection-pre-hook)
     (add-hook 'pre-command-hook 'delete-selection-pre-hook)
@@ -84,22 +84,31 @@ any selection."
             (not buffer-read-only))
     (let ((type (and (symbolp this-command)
                     (get this-command 'delete-selection))))
-      (cond ((eq type 'kill)
-            (delete-active-region t))
-           ((eq type 'yank)
-            ;; Before a yank command,
-            ;; make sure we don't yank the same region
-            ;; that we are going to delete.
-            ;; That would make yank a no-op.
-            (when (string= (buffer-substring-no-properties (point) (mark))
-                           (car kill-ring))
-              (current-kill 1))
-            (delete-active-region))
-           ((eq type 'supersede)
-            (delete-active-region)
-            (setq this-command 'ignore))
-           (type
-            (delete-active-region))))))
+      (condition-case data
+         (cond ((eq type 'kill)
+                (delete-active-region t))
+               ((eq type 'yank)
+                ;; Before a yank command,
+                ;; make sure we don't yank the same region
+                ;; that we are going to delete.
+                ;; That would make yank a no-op.
+                (when (string= (buffer-substring-no-properties (point) (mark))
+                               (car kill-ring))
+                  (current-kill 1))
+                (delete-active-region))
+               ((eq type 'supersede)
+                (let ((empty-region (= (point) (mark))))
+                  (delete-active-region)
+                  (unless empty-region
+                    (setq this-command 'ignore))))
+               (type
+                (delete-active-region)))
+       (file-supersession
+        ;; If ask-user-about-supersession-threat signals an error,
+        ;; stop safe_run_hooks from clearing out pre-command-hook.
+        (and (eq inhibit-quit 'pre-command-hook)
+             (setq inhibit-quit 'delete-selection-dummy))
+        (signal 'file-supersession (cdr data)))))))
 
 (put 'self-insert-command 'delete-selection t)
 (put 'self-insert-iso 'delete-selection t)