]> code.delx.au - gnu-emacs/blobdiff - lisp/subr.el
* x-dnd.el (x-dnd-open-local-file, x-dnd-open-file): Improved error
[gnu-emacs] / lisp / subr.el
index c721969ec38ca097db82ba646ce374d774d602f5..39a9caa3106a36e5d4eb9752e6a6387831140416 100644 (file)
@@ -1,6 +1,6 @@
 ;;; subr.el --- basic lisp subroutines for Emacs
 
-;; Copyright (C) 1985, 86, 92, 94, 95, 99, 2000, 2001, 2002, 2003
+;; Copyright (C) 1985, 86, 92, 94, 95, 99, 2000, 2001, 2002, 03, 2004
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
@@ -209,6 +209,17 @@ If N is bigger than the length of X, return X."
           (if (> n 0) (setcdr (nthcdr (- (1- m) n) x) nil))
           x))))
 
+(defun delete-dups (list)
+  "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it.  LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept."
+  (let ((tail list))
+    (while tail
+      (setcdr tail (delete (car tail) (cdr tail)))
+      (setq tail (cdr tail))))
+  list)
+
 (defun number-sequence (from &optional to inc)
   "Return a sequence of numbers from FROM to TO (both inclusive) as a list.
 INC is the increment used between numbers in the sequence and defaults to 1.
@@ -667,7 +678,7 @@ The value is a printing character (not upper case) or a symbol."
 
 (defsubst event-start (event)
   "Return the starting position of EVENT.
-If EVENT is a mouse press or a mouse click, this returns the location
+If EVENT is a mouse or key press or a mouse click, this returns the location
 of the event.
 If EVENT is a drag, this returns the drag's starting position.
 The return value is of the form
@@ -678,7 +689,8 @@ The `posn-' functions access elements of such lists."
     (list (selected-window) (point) '(0 . 0) 0)))
 
 (defsubst event-end (event)
-  "Return the ending location of EVENT.  EVENT should be a click or drag event.
+  "Return the ending location of EVENT.
+EVENT should be a click, drag, or key press event.
 If EVENT is a click event, this function is the same as `event-start'.
 The return value is of the form
    (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
@@ -716,6 +728,15 @@ and `event-end' functions."
          (car (nth 1 position))
        (nth 1 position))))
 
+(defun posn-set-point (position)
+  "Move point to POSITION.
+Select the corresponding window as well."
+    (if (not (windowp (posn-window position)))
+       (error "Position not in text area of window"))
+    (select-window (posn-window position))
+    (if (numberp (posn-point position))
+       (goto-char (posn-point position))))
+
 (defsubst posn-x-y (position)
   "Return the x and y coordinates in POSITION.
 POSITION should be a list of the form returned by the `event-start'
@@ -1296,6 +1317,27 @@ Optional DEFAULT is a default password to use instead of empty input."
                  (setq pass new-pass))))))
       (message nil)
       (or pass default ""))))
+
+;; This should be used by `call-interactively' for `n' specs.
+(defun read-number (prompt &optional default)
+  (let ((n nil))
+    (when default
+      (setq prompt
+           (if (string-match "\\(\\):[^:]*" prompt)
+               (replace-match (format " [%s]" default) t t prompt 1)
+             (concat prompt (format " [%s] " default)))))
+    (while
+       (progn
+         (let ((str (read-from-minibuffer prompt nil nil nil nil
+                                          (number-to-string default))))
+           (setq n (cond
+                    ((zerop (length str)) default)
+                    ((stringp str) (read str)))))
+         (unless (numberp n)
+           (message "Please enter a number.")
+           (sit-for 1)
+           t)))
+    n))
 \f
 ;;; Atomic change groups.
 
@@ -1970,10 +2012,8 @@ Zero means the entire text matched by the whole regexp or whole string.
 STRING should be given if the last search was by `string-match' on STRING."
   (if (match-beginning num)
       (if string
-         (let ((result
-                (substring string (match-beginning num) (match-end num))))
-           (set-text-properties 0 (length result) nil result)
-           result)
+         (substring-no-properties string (match-beginning num)
+                                  (match-end num))
        (buffer-substring-no-properties (match-beginning num)
                                        (match-end num)))))
 
@@ -2244,28 +2284,6 @@ macros."
       (subrp object) (byte-code-function-p object)
       (eq (car-safe object) 'lambda)))
 
-(defun interactive-form (function)
-  "Return the interactive form of FUNCTION.
-If function is a command (see `commandp'), value is a list of the form
-\(interactive SPEC).  If function is not a command, return nil."
-  (setq function (indirect-function function))
-  (when (commandp function)
-    (cond ((byte-code-function-p function)
-          (when (> (length function) 5)
-            (let ((spec (aref function 5)))
-              (if spec
-                  (list 'interactive spec)
-                (list 'interactive)))))
-         ((subrp function)
-          (subr-interactive-form function))
-         ((eq (car-safe function) 'lambda)
-          (setq function (cddr function))
-          (when (stringp (car function))
-            (setq function (cdr function)))
-          (let ((form (car function)))
-            (when (eq (car-safe form) 'interactive)
-              (copy-sequence form)))))))
-
 (defun assq-delete-all (key alist)
   "Delete from ALIST all elements whose car is KEY.
 Return the modified alist.