--- a/esh-proc.el 2012-10-25 16:15:47.469236248 +1300 +++ b/esh-proc.el 2012-10-25 16:15:37.184135738 +1300 @@ -165,43 +165,39 @@ (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 [-] | ... +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.