* lisp/eshell: Minor fixes.
[bpt/emacs.git] / lisp / eshell / esh-proc.el
index 4068223..81ca218 100644 (file)
@@ -165,43 +165,39 @@ The signals which will cause this to happen are matched by
        (list-processes)))
 
 (defun eshell/kill (&rest args)
-  "Kill processes, buffers, symbol or files."
-  (let ((ptr args)
-       (signum 'SIGINT))
-    (while ptr
-      (if (or (eshell-processp (car ptr))
-             (and (stringp (car ptr))
-                  (string-match "^[A-Za-z/][A-Za-z0-9<>/]+$"
-                                (car ptr))))
-         ;; What about when $lisp-variable is possible here?
-         ;; It could very well name a process.
-         (setcar ptr (get-process (car ptr))))
-      (setq ptr (cdr ptr)))
-    (while args
-      (let ((id (if (eshell-processp (car args))
-                   (process-id (car args))
-                 (car args))))
-       (when id
-         (cond
-          ((null id)
-           (error "kill: bad signal spec"))
-          ((and (numberp id) (= id 0))
-           (error "kill: bad signal spec `%d'" id))
-          ((and (stringp id)
-                (string-match "^-?[0-9]+$" id))
-           (setq signum (abs (string-to-number id))))
-          ((stringp id)
-           (let (case-fold-search)
-             (if (string-match "^-\\([A-Z]+[12]?\\)$" id)
-                 (setq signum
-                       (intern (concat "SIG" (match-string 1 id))))
-               (error "kill: bad signal spec `%s'" id))))
-          ((< id 0)
-           (setq signum (abs id)))
-          (t
-           (signal-process id signum)))))
-      (setq args (cdr args)))
-    nil))
+  "Kill processes.
+Usage: kill [-<signal>] <pid>|<process> ...
+Accepts PIDs and process objects."
+  ;; If the first argument starts with a dash, treat it as the signal
+  ;; specifier.
+(let ((signum 'SIGINT))
+  (let ((arg (car args))
+        (case-fold-search nil))
+     (when (stringp arg)
+       (cond
+        ((string-match "^-[[:digit:]]+$" arg)
+         (setq signum (abs (string-to-number arg)))
+        ((or (string-match "^-[[:upper:]]+$" arg)
+             (string-match "^-[[:lower:]]+$" arg))
+         (setq signum (abs (string-to-number arg))))))
+       (setq args (cdr args))))
+   (while args
+     (let ((arg (if (eshell-processp (car args))
+                    (process-id (car args))
+                  (car args))))
+       (when arg
+         (cond
+          ((null arg)
+           (error "kill: null pid.  Process may actually be a network connection."))
+          ((not (numberp arg))
+           (error "kill: invalid argument type: %s" (type-of arg)))
+          ((and (numberp arg)
+                (<= arg 0))
+           (error "kill: bad pid: %d" arg))
+          (t
+           (signal-process arg signum)))))
+     (setq args (cdr args))))
+  nil)
 
 (defun eshell-read-process-name (prompt)
   "Read the name of a process from the minibuffer, using completion.