comparison lisp/help.el @ 231:557eaa0339bf r20-5b14

Import from CVS: tag r20-5b14
author cvs
date Mon, 13 Aug 2007 10:13:48 +0200
parents 434959a2fba3
children 52952cbfc5b5
comparison
equal deleted inserted replaced
230:39ed1d2bdd9d 231:557eaa0339bf
189 Commands: 189 Commands:
190 \\{help-mode-map}" 190 \\{help-mode-map}"
191 ) 191 )
192 192
193 (define-key help-mode-map "q" 'help-mode-quit) 193 (define-key help-mode-map "q" 'help-mode-quit)
194 (define-key help-mode-map "Q" 'help-mode-bury)
194 (define-key help-mode-map "f" 'find-function-at-point) 195 (define-key help-mode-map "f" 'find-function-at-point)
196 (define-key help-mode-map "d" 'describe-function-at-point)
197 (define-key help-mode-map "v" 'describe-variable-at-point)
198 (define-key help-mode-map "i" 'Info-elisp-ref)
199 (define-key help-mode-map "c" 'customize-variable)
200 (define-key help-mode-map [tab] 'help-next-symbol)
201 (define-key help-mode-map [(shift tab)] 'help-prev-symbol)
202 (define-key help-mode-map "n" 'help-next-section)
203 (define-key help-mode-map "p" 'help-prev-section)
195 204
196 (defun describe-function-at-point () 205 (defun describe-function-at-point ()
197 "Describe directly the function at point in the other window." 206 "Describe directly the function at point in the other window."
198 (interactive) 207 (interactive)
199 (let ((symb (function-at-point))) 208 (let ((symb (function-at-point)))
200 (when symb 209 (when symb
201 (describe-function symb)))) 210 (describe-function symb))))
211
202 (defun describe-variable-at-point () 212 (defun describe-variable-at-point ()
203 "Describe directly the variable at point in the other window." 213 "Describe directly the variable at point in the other window."
204 (interactive) 214 (interactive)
205 (let ((symb (variable-at-point))) 215 (let ((symb (variable-at-point)))
206 (when symb 216 (when symb
207 (describe-variable symb)))) 217 (describe-variable symb))))
218
208 (defun help-next-symbol () 219 (defun help-next-symbol ()
209 "Move point to the next quoted symbol." 220 "Move point to the next quoted symbol."
210 (interactive) 221 (interactive)
211 (search-forward "`" nil t)) 222 (search-forward "`" nil t))
223
212 (defun help-prev-symbol () 224 (defun help-prev-symbol ()
213 "Move point to the previous quoted symbol." 225 "Move point to the previous quoted symbol."
214 (interactive) 226 (interactive)
215 (search-backward "'" nil t)) 227 (search-backward "'" nil t))
216 (define-key help-mode-map "d" 'describe-function-at-point) 228
217 (define-key help-mode-map "v" 'describe-variable-at-point) 229 (defun help-next-section ()
218 (define-key help-mode-map [tab] 'help-next-symbol) 230 "Move point to the next quoted symbol."
219 (define-key help-mode-map [(shift tab)] 'help-prev-symbol) 231 (interactive)
220 232 (search-forward-regexp "^\\w+:" nil t))
221 233
222 (defun help-mode-quit () 234 (defun help-prev-section ()
235 "Move point to the previous quoted symbol."
236 (interactive)
237 (search-backward-regexp "^\\w+:" nil t))
238
239 (defun help-mode-bury ()
240 "Buries the buffer, possibly restoring the previous window configuration."
241 (interactive)
242 (help-mode-quit t))
243
244 (defun help-mode-quit (&optional bury)
223 "Exits from help mode, possibly restoring the previous window configuration. 245 "Exits from help mode, possibly restoring the previous window configuration.
224 Bury the help buffer to the end of the buffer list." 246 If the optional argument BURY is non-nil, the help buffer is buried,
247 otherwise it is killed."
225 (interactive) 248 (interactive)
226 (let ((buf (current-buffer))) 249 (let ((buf (current-buffer)))
227 (cond ((frame-property (selected-frame) 'help-window-config) 250 (cond ((frame-property (selected-frame) 'help-window-config)
228 (set-window-configuration 251 (set-window-configuration
229 (frame-property (selected-frame) 'help-window-config)) 252 (frame-property (selected-frame) 'help-window-config))
230 (set-frame-property (selected-frame) 'help-window-config nil)) 253 (set-frame-property (selected-frame) 'help-window-config nil))
231 ((not (one-window-p)) 254 ((not (one-window-p))
232 (delete-window))) 255 (delete-window)))
233 (bury-buffer buf))) 256 (if bury
257 (bury-buffer buf)
258 (kill-buffer buf))))
234 259
235 (defun help-quit () 260 (defun help-quit ()
236 (interactive) 261 (interactive)
237 nil) 262 nil)
238 263
388 This just displays the buffer in another window, rather than selecting 413 This just displays the buffer in another window, rather than selecting
389 the window." 414 the window."
390 :type 'boolean 415 :type 'boolean
391 :group 'help-appearance) 416 :group 'help-appearance)
392 417
418 (defun help-buffer-name (name)
419 "Return a name for a Help buffer using string NAME for context."
420 (if (stringp name)
421 (format "*Help: %s*" name)
422 "*Help*"))
423
393 ;; Use this function for displaying help when C-h something is pressed 424 ;; Use this function for displaying help when C-h something is pressed
394 ;; or in similar situations. Do *not* use it when you are displaying 425 ;; or in similar situations. Do *not* use it when you are displaying
395 ;; a help message and then prompting for input in the minibuffer -- 426 ;; a help message and then prompting for input in the minibuffer --
396 ;; this macro usually selects the help buffer, which is not what you 427 ;; this macro usually selects the help buffer, which is not what you
397 ;; want in those situations. 428 ;; want in those situations.
398 429 (defmacro with-displaying-help-buffer (name &rest body)
399 ;;; ### Should really be a macro (as suggested above) to eliminate the 430 "Form which makes a help buffer with given NAME and evaluates BODY there.
400 ;;; requirement of caller to code a lambda form in THUNK -- mrb 431 The actual name of the buffer is generated by the function `help-buffer-name'."
401 (defun with-displaying-help-buffer (thunk) 432 `(let* ((winconfig (current-window-configuration))
402 (let ((winconfig (current-window-configuration)) 433 (was-one-window (one-window-p))
403 (was-one-window (one-window-p)) 434 (buffer-name (help-buffer-name ,name))
404 (help-not-visible 435 (help-not-visible
405 (not (and (windows-of-buffer "*Help*") ;shortcut 436 (not (and (windows-of-buffer buffer-name) ;shortcut
406 (member (selected-frame) 437 (member (selected-frame)
407 (mapcar 'window-frame 438 (mapcar 'window-frame
408 (windows-of-buffer "*Help*"))))))) 439 (windows-of-buffer buffer-name)))))))
409 (prog1 (with-output-to-temp-buffer "*Help*" 440 (prog1 (with-output-to-temp-buffer buffer-name
410 (prog1 (funcall thunk) 441 (prog1 ,@body
411 (save-excursion 442 (save-excursion
412 (set-buffer standard-output) 443 (set-buffer standard-output)
413 (help-mode)))) 444 (help-mode))))
414 (let ((helpwin (get-buffer-window "*Help*"))) 445 (let ((helpwin (get-buffer-window buffer-name)))
415 (when helpwin 446 (when helpwin
416 (with-current-buffer (window-buffer helpwin) 447 (with-current-buffer (window-buffer helpwin)
417 ;; If the *Help* buffer is already displayed on this 448 ;; If the *Help* buffer is already displayed on this
418 ;; frame, don't override the previous configuration 449 ;; frame, don't override the previous configuration
419 (when help-not-visible 450 (when help-not-visible
420 (set-frame-property (selected-frame) 451 (set-frame-property (selected-frame)
421 'help-window-config winconfig))) 452 'help-window-config winconfig)))
422 (when help-selects-help-window 453 (when help-selects-help-window
423 (select-window helpwin)) 454 (select-window helpwin))
424 (cond ((eq helpwin (selected-window)) 455 (cond ((eq helpwin (selected-window))
425 (display-message 'command 456 (display-message 'command
426 (substitute-command-keys "Type \\[help-mode-quit] to remove help window, \\[scroll-up] to scroll the help."))) 457 (substitute-command-keys "Type \\[help-mode-quit] to remove help window, \\[scroll-up] to scroll the help.")))
427 (was-one-window 458 (was-one-window
428 (display-message 'command 459 (display-message 'command
429 (substitute-command-keys "Type \\[delete-other-windows] to remove help window, \\[scroll-other-window] to scroll the help."))) 460 (substitute-command-keys "Type \\[delete-other-windows] to remove help window, \\[scroll-other-window] to scroll the help.")))
430 (t 461 (t
431 (display-message 'command 462 (display-message 'command
432 (substitute-command-keys "Type \\[switch-to-buffer-other-window] to restore the other window, \\[scroll-other-window] to scroll the help."))))))))) 463 (substitute-command-keys "Type \\[switch-to-buffer-other-window] to restore the other window, \\[scroll-other-window] to scroll the help.")))))))))
464 (put 'with-displaying-help-buffer 'lisp-indent-function 1)
465 (put 'with-displaying-help-buffer 'edebug-form-spec '(form body))
433 466
434 (defun describe-key (key) 467 (defun describe-key (key)
435 "Display documentation of the function invoked by KEY. 468 "Display documentation of the function invoked by KEY.
436 KEY is a string, or vector of events. 469 KEY is a string, or vector of events.
437 When called interactively, KEY may also be a menu selection." 470 When called interactively, KEY may also be a menu selection."
438 (interactive "kDescribe key: ") 471 (interactive "kDescribe key: ")
439 (let ((defn (key-or-menu-binding key))) 472 (let ((defn (key-or-menu-binding key))
473 (key-string (key-description key)))
440 (if (or (null defn) (integerp defn)) 474 (if (or (null defn) (integerp defn))
441 (message "%s is undefined" (key-description key)) 475 (message "%s is undefined" key-string)
442 (with-displaying-help-buffer 476 (with-displaying-help-buffer (format "key `%s'" key-string)
443 (lambda () 477 (princ key-string)
444 (princ (key-description key)) 478 (princ " runs ")
445 (princ " runs ") 479 (if (symbolp defn) (princ (format "`%S'" defn))
446 (if (symbolp defn) (princ (format "`%S'" defn)) 480 (prin1 defn))
447 (prin1 defn)) 481 (princ "\n\n")
448 (princ "\n\n") 482 (cond ((or (stringp defn) (vectorp defn))
449 (cond ((or (stringp defn) (vectorp defn)) 483 (let ((cmd (key-binding defn)))
450 (let ((cmd (key-binding defn))) 484 (if (not cmd)
451 (if (not cmd) 485 (princ "a keyboard macro")
452 (princ "a keyboard macro") 486 (progn
453 (progn 487 (princ "a keyboard macro which runs the command ")
454 (princ "a keyboard macro which runs the command ") 488 (prin1 cmd)
455 (prin1 cmd) 489 (princ ":\n\n")
456 (princ ":\n\n") 490 (if (documentation cmd) (princ (documentation cmd)))))))
457 (if (documentation cmd) (princ (documentation cmd))))))) 491 ((and (consp defn) (not (eq 'lambda (car-safe defn))))
458 ((and (consp defn) (not (eq 'lambda (car-safe defn)))) 492 (let ((describe-function-show-arglist nil))
459 (let ((describe-function-show-arglist nil)) 493 (describe-function-1 (car defn))))
460 (describe-function-1 (car defn) standard-output))) 494 ((symbolp defn)
461 ((symbolp defn) 495 (describe-function-1 defn))
462 (describe-function-1 defn standard-output)) 496 ((documentation defn)
463 ((documentation defn) 497 (princ (documentation defn)))
464 (princ (documentation defn))) 498 (t
465 (t 499 (princ "not documented")))))))
466 (princ "not documented"))))))))
467 500
468 (defun describe-mode () 501 (defun describe-mode ()
469 "Display documentation of current major mode and minor modes. 502 "Display documentation of current major mode and minor modes.
470 For this to work correctly for a minor mode, the mode's indicator variable 503 For this to work correctly for a minor mode, the mode's indicator variable
471 \(listed in `minor-mode-alist') must also be a function whose documentation 504 \(listed in `minor-mode-alist') must also be a function whose documentation
472 describes the minor mode." 505 describes the minor mode."
473 (interactive) 506 (interactive)
474 (with-displaying-help-buffer 507 (with-displaying-help-buffer (format "%s mode" mode-name)
475 (lambda () 508 ;; XEmacs change: print the major-mode documentation before
476 ;; XEmacs change: print the major-mode documentation before 509 ;; the minor modes.
477 ;; the minor modes. 510 (princ mode-name)
478 (princ mode-name) 511 (princ " mode:\n")
479 (princ " mode:\n") 512 (princ (documentation major-mode))
480 (princ (documentation major-mode)) 513 (princ "\n\n----\n\n")
481 (princ "\n\n----\n\n") 514 (let ((minor-modes minor-mode-alist))
482 (let ((minor-modes minor-mode-alist)) 515 (while minor-modes
483 (while minor-modes 516 (let* ((minor-mode (car (car minor-modes)))
484 (let* ((minor-mode (car (car minor-modes))) 517 (indicator (car (cdr (car minor-modes)))))
485 (indicator (car (cdr (car minor-modes))))) 518 ;; Document a minor mode if it is listed in minor-mode-alist,
486 ;; Document a minor mode if it is listed in minor-mode-alist, 519 ;; bound locally in this buffer, non-nil, and has a function
487 ;; bound locally in this buffer, non-nil, and has a function 520 ;; definition.
488 ;; definition. 521 (if (and (boundp minor-mode)
489 (if (and (boundp minor-mode) 522 (symbol-value minor-mode)
490 (symbol-value minor-mode) 523 (fboundp minor-mode))
491 (fboundp minor-mode)) 524 (let ((pretty-minor-mode minor-mode))
492 (let ((pretty-minor-mode minor-mode)) 525 (if (string-match "-mode\\'" (symbol-name minor-mode))
493 (if (string-match "-mode\\'" (symbol-name minor-mode)) 526 (setq pretty-minor-mode
494 (setq pretty-minor-mode 527 (capitalize
495 (capitalize 528 (substring (symbol-name minor-mode)
496 (substring (symbol-name minor-mode) 529 0 (match-beginning 0)))))
497 0 (match-beginning 0))))) 530 (while (and (consp indicator) (extentp (car indicator)))
498 (while (and (consp indicator) (extentp (car indicator))) 531 (setq indicator (cdr indicator)))
499 (setq indicator (cdr indicator))) 532 (while (and indicator (symbolp indicator))
500 (while (and indicator (symbolp indicator)) 533 (setq indicator (symbol-value indicator)))
501 (setq indicator (symbol-value indicator))) 534 (princ (format "%s minor mode (indicator%s):\n"
502 (princ (format "%s minor mode (indicator%s):\n" 535 pretty-minor-mode indicator))
503 pretty-minor-mode indicator)) 536 (princ (documentation minor-mode))
504 (princ (documentation minor-mode)) 537 (princ "\n\n----\n\n"))))
505 (princ "\n\n----\n\n")))) 538 (setq minor-modes (cdr minor-modes))))))
506 (setq minor-modes (cdr minor-modes)))))))
507 539
508 ;; So keyboard macro definitions are documented correctly 540 ;; So keyboard macro definitions are documented correctly
509 (fset 'defining-kbd-macro (symbol-function 'start-kbd-macro)) 541 (fset 'defining-kbd-macro (symbol-function 'start-kbd-macro))
510 542
511 (defun describe-distribution () 543 (defun describe-distribution ()
554 If the optional argument PREFIX is supplied, only commands which 586 If the optional argument PREFIX is supplied, only commands which
555 start with that sequence of keys are described. 587 start with that sequence of keys are described.
556 If the second argument (prefix arg, interactively) is non-null 588 If the second argument (prefix arg, interactively) is non-null
557 then only the mouse bindings are displayed." 589 then only the mouse bindings are displayed."
558 (interactive (list nil current-prefix-arg)) 590 (interactive (list nil current-prefix-arg))
559 (with-displaying-help-buffer 591 (with-displaying-help-buffer (format "bindings for %s" major-mode)
560 (lambda () 592 (describe-bindings-1 prefix mouse-only-p)))
561 (describe-bindings-1 prefix mouse-only-p))))
562 593
563 (defun describe-bindings-1 (&optional prefix mouse-only-p) 594 (defun describe-bindings-1 (&optional prefix mouse-only-p)
564 (let ((heading (if mouse-only-p 595 (let ((heading (if mouse-only-p
565 (gettext "button binding\n------ -------\n") 596 (gettext "button binding\n------ -------\n")
566 (gettext "key binding\n--- -------\n"))) 597 (gettext "key binding\n--- -------\n")))
590 (insert "Global Bindings:\n" heading) 621 (insert "Global Bindings:\n" heading)
591 (describe-bindings-internal (current-global-map) 622 (describe-bindings-internal (current-global-map)
592 nil shadow prefix mouse-only-p) 623 nil shadow prefix mouse-only-p)
593 (when (and prefix function-key-map (not mouse-only-p)) 624 (when (and prefix function-key-map (not mouse-only-p))
594 (insert "\nFunction key map translations:\n" heading) 625 (insert "\nFunction key map translations:\n" heading)
595 (describe-bindings-internal function-key-map nil nil prefix mouse-only-p)) 626 (describe-bindings-internal function-key-map nil nil
627 prefix mouse-only-p))
596 (set-buffer buffer))) 628 (set-buffer buffer)))
597 629
598 (defun describe-prefix-bindings () 630 (defun describe-prefix-bindings ()
599 "Describe the bindings of the prefix used to reach this command. 631 "Describe the bindings of the prefix used to reach this command.
600 The prefix described consists of all but the last event 632 The prefix described consists of all but the last event
605 i) 637 i)
606 (setq i 0) 638 (setq i 0)
607 (while (< i (length prefix)) 639 (while (< i (length prefix))
608 (aset prefix i (aref key i)) 640 (aset prefix i (aref key i))
609 (setq i (1+ i))) 641 (setq i (1+ i)))
610 (with-displaying-help-buffer 642 (with-displaying-help-buffer (format "%s prefix" (key-description prefix))
611 (lambda () 643 (princ "Key bindings starting with ")
612 (princ "Key bindings starting with ") 644 (princ (key-description prefix))
613 (princ (key-description prefix)) 645 (princ ":\n\n")
614 (princ ":\n\n") 646 (describe-bindings-1 prefix nil))))
615 (describe-bindings-1 prefix nil)))))
616 647
617 ;; Make C-h after a prefix, when not specifically bound, 648 ;; Make C-h after a prefix, when not specifically bound,
618 ;; run describe-prefix-bindings. 649 ;; run describe-prefix-bindings.
619 (setq prefix-help-command 'describe-prefix-bindings) 650 (setq prefix-help-command 'describe-prefix-bindings)
620 651
662 (defun view-lossage () 693 (defun view-lossage ()
663 "Display recent input keystrokes and recent minibuffer messages. 694 "Display recent input keystrokes and recent minibuffer messages.
664 The number of keys shown is controlled by `view-lossage-key-count'. 695 The number of keys shown is controlled by `view-lossage-key-count'.
665 The number of messages shown is controlled by `view-lossage-message-count'." 696 The number of messages shown is controlled by `view-lossage-message-count'."
666 (interactive) 697 (interactive)
667 (with-displaying-help-buffer 698 (with-displaying-help-buffer "lossage"
668 (lambda () 699 (princ (key-description (recent-keys view-lossage-key-count)))
669 (princ (key-description (recent-keys view-lossage-key-count))) 700 (save-excursion
670 (save-excursion 701 (set-buffer standard-output)
671 (set-buffer standard-output) 702 (goto-char (point-min))
672 (goto-char (point-min)) 703 (insert "Recent keystrokes:\n\n")
673 (insert "Recent keystrokes:\n\n") 704 (while (progn (move-to-column 50) (not (eobp)))
674 (while (progn (move-to-column 50) (not (eobp))) 705 (search-forward " " nil t)
675 (search-forward " " nil t) 706 (insert "\n")))
676 (insert "\n"))) 707 ;; XEmacs addition
677 ;; XEmacs addition 708 (princ "\n\n\nRecent minibuffer messages (most recent first):\n\n")
678 (princ "\n\n\nRecent minibuffer messages (most recent first):\n\n") 709 (save-excursion
679 (save-excursion 710 (let ((buffer (get-buffer-create " *Message-Log*"))
680 (let ((buffer (get-buffer-create " *Message-Log*")) 711 (count 0)
681 (count 0) 712 oldpoint)
682 oldpoint) 713 (set-buffer buffer)
683 (set-buffer buffer) 714 (goto-char (point-max))
684 (goto-char (point-max)) 715 (set-buffer standard-output)
685 (set-buffer standard-output) 716 (while (and (> (point buffer) (point-min buffer))
686 (while (and (> (point buffer) (point-min buffer)) 717 (< count view-lossage-message-count))
687 (< count view-lossage-message-count)) 718 (setq oldpoint (point buffer))
688 (setq oldpoint (point buffer)) 719 (forward-line -1 buffer)
689 (forward-line -1 buffer) 720 (insert-buffer-substring buffer (point buffer) oldpoint)
690 (insert-buffer-substring buffer (point buffer) oldpoint) 721 (setq count (1+ count)))))))
691 (setq count (1+ count))))))))
692 722
693 (define-function 'help 'help-for-help) 723 (define-function 'help 'help-for-help)
694 724
695 (make-help-screen help-for-help 725 (make-help-screen help-for-help
696 "A B C F I K L M N P S T V W C-c C-d C-f C-i C-k C-n C-w; ? for more help:" 726 "A B C F I K L M N P S T V W C-c C-d C-f C-i C-k C-n C-w; ? for more help:"
729 \\[describe-distribution] XEmacs ordering information. 759 \\[describe-distribution] XEmacs ordering information.
730 \\[describe-no-warranty] Information on absence of warranty for XEmacs. 760 \\[describe-no-warranty] Information on absence of warranty for XEmacs.
731 \\[describe-copying] XEmacs copying permission (General Public License)." 761 \\[describe-copying] XEmacs copying permission (General Public License)."
732 help-map) 762 help-map)
733 763
764 (defmacro with-syntax-table (syntab &rest body)
765 "Evaluate BODY with the syntax-table SYNTAB"
766 `(let ((stab (syntax-table)))
767 (unwind-protect
768 (progn
769 (set-syntax-table (copy-syntax-table ,syntab))
770 ,@body)
771 (set-syntax-table stab))))
772 (put 'with-syntax-table 'lisp-indent-function 1)
773 (put 'with-syntax-table 'edebug-form-spec '(form body))
774
734 (defun function-called-at-point () 775 (defun function-called-at-point ()
735 "Return the function which is called by the list containing point. 776 "Return the function which is called by the list containing point.
736 If that gives no function, return the function whose name is around point. 777 If that gives no function, return the function whose name is around point.
737 If that doesn't give a function, return nil." 778 If that doesn't give a function, return nil."
738 (or (condition-case () 779 (or (ignore-errors
780 (save-excursion
781 (save-restriction
782 (narrow-to-region (max (point-min) (- (point) 1000))
783 (point-max))
784 (backward-up-list 1)
785 (forward-char 1)
786 (let (obj)
787 (setq obj (read (current-buffer)))
788 (and (symbolp obj) (fboundp obj) obj)))))
789 (ignore-errors
790 (with-syntax-table emacs-lisp-mode-syntax-table
739 (save-excursion 791 (save-excursion
740 (save-restriction 792 (or (not (zerop (skip-syntax-backward "_w")))
741 (narrow-to-region (max (point-min) (- (point) 1000)) (point-max)) 793 (eq (char-syntax (char-after (point))) ?w)
742 (backward-up-list 1) 794 (eq (char-syntax (char-after (point))) ?_)
743 (forward-char 1) 795 (forward-sexp -1))
744 (let (obj) 796 (skip-chars-forward "`'")
745 (setq obj (read (current-buffer))) 797 (let ((obj (read (current-buffer))))
746 (and (symbolp obj) (fboundp obj) obj)))) 798 (and (symbolp obj) (fboundp obj) obj)))))))
747 (error nil))
748 (condition-case ()
749 (let ((stab (syntax-table)))
750 (unwind-protect
751 (save-excursion
752 (set-syntax-table emacs-lisp-mode-syntax-table)
753 (or (not (zerop (skip-syntax-backward "_w")))
754 (eq (char-syntax (char-after (point))) ?w)
755 (eq (char-syntax (char-after (point))) ?_)
756 (forward-sexp -1))
757 (skip-chars-forward "`'")
758 (let ((obj (read (current-buffer))))
759 (and (symbolp obj) (fboundp obj) obj)))
760 (set-syntax-table stab)))
761 (error nil))))
762 799
763 (defun function-at-point () 800 (defun function-at-point ()
764 "Return the function whose name is around point. 801 "Return the function whose name is around point.
765 If that gives no function, return the function which is called by the 802 If that gives no function, return the function which is called by the
766 list containing point. If that doesn't give a function, return nil." 803 list containing point. If that doesn't give a function, return nil."
767 (or (condition-case () 804 (or (ignore-errors
768 (let ((stab (syntax-table))) 805 (with-syntax-table emacs-lisp-mode-syntax-table
769 (unwind-protect
770 (save-excursion
771 (set-syntax-table emacs-lisp-mode-syntax-table)
772 (or (not (zerop (skip-syntax-backward "_w")))
773 (eq (char-syntax (char-after (point))) ?w)
774 (eq (char-syntax (char-after (point))) ?_)
775 (forward-sexp -1))
776 (skip-chars-forward "`'")
777 (let ((obj (read (current-buffer))))
778 (and (symbolp obj) (fboundp obj) obj)))
779 (set-syntax-table stab)))
780 (error nil))
781 (condition-case ()
782 (save-excursion 806 (save-excursion
783 (save-restriction 807 (or (not (zerop (skip-syntax-backward "_w")))
784 (narrow-to-region (max (point-min) (- (point) 1000)) 808 (eq (char-syntax (char-after (point))) ?w)
785 (point-max)) 809 (eq (char-syntax (char-after (point))) ?_)
786 (backward-up-list 1) 810 (forward-sexp -1))
787 (forward-char 1) 811 (skip-chars-forward "`'")
788 (let (obj) 812 (let ((obj (read (current-buffer))))
789 (setq obj (read (current-buffer))) 813 (and (symbolp obj) (fboundp obj) obj)))))
790 (and (symbolp obj) (fboundp obj) obj)))) 814 (ignore-errors
791 (error nil)))) 815 (save-excursion
816 (save-restriction
817 (narrow-to-region (max (point-min) (- (point) 1000))
818 (point-max))
819 (backward-up-list 1)
820 (forward-char 1)
821 (let (obj)
822 (setq obj (read (current-buffer)))
823 (and (symbolp obj) (fboundp obj) obj)))))))
792 824
793 ;; Default to nil for the non-hackers? Not until we find a way to 825 ;; Default to nil for the non-hackers? Not until we find a way to
794 ;; distinguish hackers from non-hackers automatically! 826 ;; distinguish hackers from non-hackers automatically!
795 (defcustom describe-function-show-arglist t 827 (defcustom describe-function-show-arglist t
796 "*If non-nil, describe-function will show its arglist, 828 "*If non-nil, describe-function will show its arglist,
820 (format (gettext "Describe function (default %s): ") 852 (format (gettext "Describe function (default %s): ")
821 fn) 853 fn)
822 (gettext "Describe function: ")) 854 (gettext "Describe function: "))
823 obarray 'fboundp t nil 'function-history)))) 855 obarray 'fboundp t nil 'function-history))))
824 (list (if (equal val "") fn (intern val))))) 856 (list (if (equal val "") fn (intern val)))))
825 (with-displaying-help-buffer 857 (with-displaying-help-buffer (format "function `%s'" function)
826 (lambda () 858 (describe-function-1 function)))
827 (describe-function-1 function standard-output)
828 ;; Return the text we displayed.
829 (buffer-string nil nil standard-output))))
830 859
831 (defun function-obsolete-p (function) 860 (defun function-obsolete-p (function)
832 "Return non-nil if FUNCTION is obsolete." 861 "Return non-nil if FUNCTION is obsolete."
833 (not (null (get function 'byte-obsolete-info)))) 862 (not (null (get function 'byte-obsolete-info))))
834 863
876 ;(gettext "an autoloaded Lisp function") 905 ;(gettext "an autoloaded Lisp function")
877 ;(gettext "an interactive autoloaded Lisp function") 906 ;(gettext "an interactive autoloaded Lisp function")
878 ;(gettext "an autoloaded Lisp macro") 907 ;(gettext "an autoloaded Lisp macro")
879 ;(gettext "an interactive autoloaded Lisp macro") 908 ;(gettext "an interactive autoloaded Lisp macro")
880 909
881 (defun describe-function-1 (function stream &optional nodoc) 910 ;; taken out of `describe-function-1'
882 (princ (format "`%S' is " function) stream) 911 (defun function-arglist (function)
912 "Returns a string giving the argument list of FUNCTION.
913 For example:
914
915 (function-arglist 'function-arglist)
916 => (function-arglist FUNCTION)
917
918 This function is used by `describe-function-1' to list function
919 arguments in the standard Lisp style."
920 (let* ((fndef (symbol-function function))
921 (arglist
922 (cond ((compiled-function-p fndef)
923 (compiled-function-arglist fndef))
924 ((eq (car-safe fndef) 'lambda)
925 (nth 1 fndef))
926 ((subrp fndef)
927 (let ((doc (documentation function)))
928 (if (string-match "[\n\t ]*\narguments: ?(\\(.*\\))\n?\\'"
929 doc)
930 (substring doc (match-beginning 1) (match-end 1)))))
931 (t t))))
932 (cond ((listp arglist)
933 (prin1-to-string
934 (cons function (mapcar (lambda (arg)
935 (if (memq arg '(&optional &rest))
936 arg
937 (intern (upcase (symbol-name arg)))))
938 arglist))
939 t))
940 ((stringp arglist)
941 (format "(%s %s)" function arglist)))))
942
943 (defun function-documentation (function &optional strip-arglist)
944 "Returns a string giving the documentation for FUNCTION if any.
945 If the optional argument STRIP-ARGLIST is non-nil remove the arglist
946 part of the documentation of internal subroutines."
947 (let ((doc (condition-case nil
948 (or (documentation function)
949 (gettext "not documented"))
950 (void-function ""))))
951 (if (and strip-arglist
952 (string-match "[\n\t ]*\narguments: ?(\\(.*\\))\n?\\'" doc))
953 (setq doc (substring doc 0 (match-beginning 0))))
954 doc))
955
956 (defun describe-function-1 (function &optional nodoc)
957 "This function does the work for `describe-function'."
958 (princ (format "`%S' is " function))
883 (let* ((def function) 959 (let* ((def function)
884 (doc (condition-case nil
885 (or (documentation function)
886 (gettext "not documented"))
887 (void-function "")))
888 aliases file-name autoload-file kbd-macro-p fndef macrop) 960 aliases file-name autoload-file kbd-macro-p fndef macrop)
889 (while (and (symbolp def) (fboundp def)) 961 (while (and (symbolp def) (fboundp def))
890 (when (not (eq def function)) 962 (when (not (eq def function))
891 (setq aliases 963 (setq aliases
892 (if aliases 964 (if aliases
903 (setq fndef (cdr def) 975 (setq fndef (cdr def)
904 file-name (and (compiled-function-p (cdr def)) 976 file-name (and (compiled-function-p (cdr def))
905 (compiled-function-annotation (cdr def))) 977 (compiled-function-annotation (cdr def)))
906 macrop t) 978 macrop t)
907 (setq fndef def)) 979 (setq fndef def))
908 (if aliases (princ aliases stream)) 980 (if aliases (princ aliases))
909 (let ((int #'(lambda (string an-p macro-p) 981 (let ((int #'(lambda (string an-p macro-p)
910 (princ (format 982 (princ (format
911 (gettext (concat 983 (gettext (concat
912 (cond ((commandp def) 984 (cond ((commandp def)
913 "an interactive ") 985 "an interactive ")
914 (an-p "an ") 986 (an-p "an ")
915 (t "a ")) 987 (t "a "))
916 "%s" 988 "%s"
917 (if macro-p " macro" " function"))) 989 (if macro-p " macro" " function")))
918 string) 990 string)))))
919 stream))))
920 (cond ((or (stringp def) (vectorp def)) 991 (cond ((or (stringp def) (vectorp def))
921 (princ "a keyboard macro." stream) 992 (princ "a keyboard macro.")
922 (setq kbd-macro-p t)) 993 (setq kbd-macro-p t))
923 ((subrp fndef) 994 ((subrp fndef)
924 (funcall int "built-in" nil macrop)) 995 (funcall int "built-in" nil macrop))
925 ((compiled-function-p fndef) 996 ((compiled-function-p fndef)
926 (funcall int "compiled Lisp" nil macrop)) 997 (funcall int "compiled Lisp" nil macrop))
927 ; XEmacs -- we handle aliases above. 998 ; XEmacs -- we handle aliases above.
928 ; ((symbolp fndef) 999 ; ((symbolp fndef)
929 ; (princ (format "alias for `%s'" 1000 ; (princ (format "alias for `%s'"
930 ; (prin1-to-string def)) stream)) 1001 ; (prin1-to-string def))))
931 ((eq (car-safe fndef) 'lambda) 1002 ((eq (car-safe fndef) 'lambda)
932 (funcall int "Lisp" nil macrop)) 1003 (funcall int "Lisp" nil macrop))
933 ((eq (car-safe fndef) 'mocklisp) 1004 ((eq (car-safe fndef) 'mocklisp)
934 (funcall int "mocklisp" nil macrop)) 1005 (funcall int "mocklisp" nil macrop))
935 ((eq (car-safe def) 'autoload) 1006 ((eq (car-safe def) 'autoload)
936 (setq autoload-file (elt def 1)) 1007 (setq autoload-file (elt def 1))
937 (funcall int "autoloaded Lisp" t (elt def 4))) 1008 (funcall int "autoloaded Lisp" t (elt def 4)))
938 ((and (symbolp def) (not (fboundp def))) 1009 ((and (symbolp def) (not (fboundp def)))
939 (princ "a symbol with a void (unbound) function definition." stream)) 1010 (princ "a symbol with a void (unbound) function definition."))
940 (t 1011 (t
941 nil))) 1012 nil)))
942 (princ "\n" stream) 1013 (princ "\n")
943 (if autoload-file 1014 (if autoload-file
944 (princ (format " -- autoloads from \"%s\"\n" autoload-file) stream)) 1015 (princ (format " -- autoloads from \"%s\"\n" autoload-file)))
945 (or file-name 1016 (or file-name
946 (setq file-name (describe-function-find-file function))) 1017 (setq file-name (describe-function-find-file function)))
947 (if file-name 1018 (if file-name
948 (princ (format " -- loaded from \"%s\"\n" file-name)) stream) 1019 (princ (format " -- loaded from \"%s\"\n" file-name)))
949 ;; (terpri stream) 1020 ;; (terpri)
950 (if describe-function-show-arglist 1021 (if describe-function-show-arglist
951 (let ((arglist 1022 (let ((arglist (function-arglist function)))
952 (cond ((compiled-function-p fndef) 1023 (when arglist
953 (compiled-function-arglist fndef)) 1024 (princ arglist)
954 ((eq (car-safe fndef) 'lambda) 1025 (terpri))))
955 (nth 1 fndef)) 1026 (terpri)
956 ((and (subrp fndef)
957 (string-match
958 "[\n\t ]*\narguments: ?(\\(.*\\))\n?\\'"
959 doc))
960 (prog1
961 (substring doc (match-beginning 1) (match-end 1))
962 (setq doc (substring doc 0 (match-beginning 0)))))
963 (t t))))
964 (if (listp arglist)
965 (progn
966 ;; (princ " ")
967 (princ (cons function
968 (mapcar (lambda (arg)
969 (if (memq arg '(&optional &rest))
970 arg
971 (intern (upcase (symbol-name arg)))))
972 arglist)) stream)
973 (terpri stream)))
974 (if (stringp arglist)
975 (princ (format "(%s %s)\n" function arglist) stream))))
976 (terpri stream)
977 (cond (kbd-macro-p 1027 (cond (kbd-macro-p
978 (princ "These characters are executed:\n\n\t" stream) 1028 (princ "These characters are executed:\n\n\t")
979 (princ (key-description def) stream) 1029 (princ (key-description def))
980 (cond ((setq def (key-binding def)) 1030 (cond ((setq def (key-binding def))
981 (princ (format "\n\nwhich executes the command %S.\n\n" def) stream) 1031 (princ (format "\n\nwhich executes the command %S.\n\n" def))
982 (describe-function-1 def stream)))) 1032 (describe-function-1 def))))
983 (nodoc nil) 1033 (nodoc nil)
984 (t 1034 (t
985 ;; tell the user about obsoleteness. 1035 ;; tell the user about obsoleteness.
986 ;; If the function is obsolete and is aliased, don't 1036 ;; If the function is obsolete and is aliased, don't
987 ;; even bother to report the documentation, as a further 1037 ;; even bother to report the documentation, as a further
988 ;; encouragement to use the new function. 1038 ;; encouragement to use the new function.
989 (let ((obsolete (function-obsoleteness-doc function)) 1039 (let ((obsolete (function-obsoleteness-doc function))
990 (compatible (function-compatibility-doc function))) 1040 (compatible (function-compatibility-doc function)))
991 (when obsolete 1041 (when obsolete
992 (princ obsolete stream) 1042 (princ obsolete)
993 (terpri stream) 1043 (terpri)
994 (terpri stream)) 1044 (terpri))
995 (when compatible 1045 (when compatible
996 (princ compatible stream) 1046 (princ compatible)
997 (terpri stream) 1047 (terpri)
998 (terpri stream)) 1048 (terpri))
999 (unless (and obsolete aliases) 1049 (unless (and obsolete aliases)
1000 (princ doc stream) 1050 (let ((doc (function-documentation function t)))
1001 (unless (or (equal doc "") 1051 (princ "Documentation:\n")
1002 (eq ?\n (aref doc (1- (length doc))))) 1052 (princ doc)
1003 (terpri stream)))))))) 1053 (unless (or (equal doc "")
1004 1054 (eq ?\n (aref doc (1- (length doc)))))
1005 1055 (terpri)))))))))
1006 ;;; this doesn't seem to be used for anything 1056
1007 ;;; Wrong! Obnoxious, whining people who complain very LOUDLY on Usenet 1057
1008 ;;; are binding this to keys. 1058 ;;; [Obnoxious, whining people who complain very LOUDLY on Usenet
1059 ;;; are binding this to keys.]
1009 (defun describe-function-arglist (function) 1060 (defun describe-function-arglist (function)
1010 (interactive (list (or (function-at-point) 1061 (interactive (list (or (function-at-point)
1011 (error "no function call at point")))) 1062 (error "no function call at point"))))
1012 (let ((b nil)) 1063 (message nil)
1013 (unwind-protect 1064 (message (function-arglist function)))
1014 (save-excursion
1015 (set-buffer (setq b (get-buffer-create " *arglist*")))
1016 (buffer-disable-undo b)
1017 (erase-buffer)
1018 (describe-function-1 function b t)
1019 (goto-char (point-min))
1020 (end-of-line)
1021 (or (eobp) (delete-char 1))
1022 (just-one-space)
1023 (end-of-line)
1024 (message (buffer-substring (point-min) (point))))
1025 (and b (kill-buffer b)))))
1026 1065
1027 1066
1028 (defun variable-at-point () 1067 (defun variable-at-point ()
1029 (ignore-errors 1068 (ignore-errors
1030 (let ((stab (syntax-table))) 1069 (with-syntax-table emacs-lisp-mode-syntax-table
1031 (unwind-protect 1070 (save-excursion
1032 (save-excursion 1071 (or (not (zerop (skip-syntax-backward "_w")))
1033 (set-syntax-table emacs-lisp-mode-syntax-table) 1072 (eq (char-syntax (char-after (point))) ?w)
1034 (or (not (zerop (skip-syntax-backward "_w"))) 1073 (eq (char-syntax (char-after (point))) ?_)
1035 (eq (char-syntax (char-after (point))) ?w) 1074 (forward-sexp -1))
1036 (eq (char-syntax (char-after (point))) ?_) 1075 (skip-chars-forward "'")
1037 (forward-sexp -1)) 1076 (let ((obj (read (current-buffer))))
1038 (skip-chars-forward "'") 1077 (and (symbolp obj) (boundp obj) obj))))))
1039 (let ((obj (read (current-buffer))))
1040 (and (symbolp obj) (boundp obj) obj)))
1041 (set-syntax-table stab)))))
1042 1078
1043 (defun variable-obsolete-p (variable) 1079 (defun variable-obsolete-p (variable)
1044 "Return non-nil if VARIABLE is obsolete." 1080 "Return non-nil if VARIABLE is obsolete."
1045 (not (null (get variable 'byte-obsolete-variable)))) 1081 (not (null (get variable 'byte-obsolete-variable))))
1046 1082
1085 (default-console "a built-in default console-local variable") 1121 (default-console "a built-in default console-local variable")
1086 (t 1122 (t
1087 (if type "an unknown type of built-in variable?" 1123 (if type "an unknown type of built-in variable?"
1088 "a variable declared in Lisp"))))) 1124 "a variable declared in Lisp")))))
1089 1125
1126 (defun help-pretty-print-value (object)
1127 "Print OBJECT in current buffer.
1128 Use `pp-internal' if defined, otherwise `cl-prettyprint'"
1129 (princ
1130 (with-output-to-string
1131 (with-syntax-table emacs-lisp-mode-syntax-table
1132 ;; print `#<...>' values better
1133 (modify-syntax-entry ?< "(>")
1134 (modify-syntax-entry ?> ")<")
1135 (let ((indent-line-function 'lisp-indent-line))
1136 (if (fboundp 'pp-internal)
1137 (progn
1138 (pp-internal object "\n")
1139 (terpri))
1140 (cl-prettyprint object)))))))
1141
1090 (defun describe-variable (variable) 1142 (defun describe-variable (variable)
1091 "Display the full documentation of VARIABLE (a symbol)." 1143 "Display the full documentation of VARIABLE (a symbol)."
1092 (interactive 1144 (interactive
1093 (let* ((v (variable-at-point)) 1145 (let* ((v (variable-at-point))
1094 (val (let ((enable-recursive-minibuffers t)) 1146 (val (let ((enable-recursive-minibuffers t))
1096 (if v 1148 (if v
1097 (format "Describe variable (default %s): " v) 1149 (format "Describe variable (default %s): " v)
1098 (gettext "Describe variable: ")) 1150 (gettext "Describe variable: "))
1099 obarray 'boundp t nil 'variable-history)))) 1151 obarray 'boundp t nil 'variable-history))))
1100 (list (if (equal val "") v (intern val))))) 1152 (list (if (equal val "") v (intern val)))))
1101 (with-displaying-help-buffer 1153 (with-displaying-help-buffer (format "variable `%s'" variable)
1102 (lambda () 1154 (let ((origvar variable)
1103 (let ((origvar variable) 1155 aliases)
1104 aliases) 1156 (let ((print-escape-newlines t))
1105 (let ((print-escape-newlines t)) 1157 (princ (format "`%s' is " (symbol-name variable)))
1106 (princ (format "`%s' is " (symbol-name variable))) 1158 (while (variable-alias variable)
1107 (while (variable-alias variable) 1159 (let ((newvar (variable-alias variable)))
1108 (let ((newvar (variable-alias variable))) 1160 (if aliases
1109 (if aliases 1161 ;; I18N3 Need gettext due to concat
1110 ;; I18N3 Need gettext due to concat 1162 (setq aliases
1111 (setq aliases 1163 (concat aliases
1112 (concat aliases 1164 (format "\n which is an alias for `%s',"
1113 (format "\n which is an alias for `%s', " 1165 (symbol-name newvar))))
1114 (symbol-name newvar)))) 1166 (setq aliases
1115 (setq aliases 1167 (format "an alias for `%s',"
1116 (format "an alias for `%s', " 1168 (symbol-name newvar))))
1117 (symbol-name newvar)))) 1169 (setq variable newvar)))
1118 (setq variable newvar))) 1170 (if aliases
1119 (if aliases 1171 (princ (format "%s" aliases)))
1120 (princ (format "%s" aliases))) 1172 (princ (built-in-variable-doc variable))
1121 (princ (built-in-variable-doc variable)) 1173 (princ ".\n")
1122 (princ ".\n\n") 1174 (let ((file-name (describe-function-find-file variable)))
1123 (princ "Value: ") 1175 (if file-name
1124 (if (not (boundp variable)) 1176 (princ (format " -- loaded from \"%s\"\n" file-name))))
1125 (princ "void") 1177 (princ "\nValue: ")
1126 (prin1 (symbol-value variable))) 1178 (if (not (boundp variable))
1127 (terpri) 1179 (princ "void\n")
1128 (cond ((local-variable-p variable (current-buffer)) 1180 (help-pretty-print-value (symbol-value variable)))
1129 (let* ((void (cons nil nil)) 1181 (terpri)
1130 (def (condition-case nil 1182 (cond ((local-variable-p variable (current-buffer))
1131 (default-value variable) 1183 (let* ((void (cons nil nil))
1132 (error void)))) 1184 (def (condition-case nil
1133 (princ "This value is specific to the current buffer.") 1185 (default-value variable)
1134 (terpri) 1186 (error void))))
1135 (if (local-variable-p variable nil) 1187 (princ "This value is specific to the current buffer.\n")
1136 (progn 1188 (if (local-variable-p variable nil)
1137 (princ "(Its value is local to each buffer.)") 1189 (princ "(Its value is local to each buffer.)\n"))
1138 (terpri))) 1190 (terpri)
1139 (if (if (eq def void) 1191 (if (if (eq def void)
1140 (boundp variable) 1192 (boundp variable)
1141 (not (eq (symbol-value variable) def))) 1193 (not (eq (symbol-value variable) def)))
1142 ;; #### I18N3 doesn't localize properly! 1194 ;; #### I18N3 doesn't localize properly!
1143 (progn (princ "Its default-value is ") 1195 (progn (princ "Default-value: ")
1144 (if (eq def void) 1196 (if (eq def void)
1145 (princ "void.") 1197 (princ "void\n")
1146 (prin1 def)) 1198 (help-pretty-print-value def))
1147 (terpri))))) 1199 (terpri)))))
1148 ((local-variable-p variable (current-buffer) t) 1200 ((local-variable-p variable (current-buffer) t)
1149 (princ "Setting it would make its value buffer-local.\n")))) 1201 (princ "Setting it would make its value buffer-local.\n\n"))))
1150 (terpri) 1202 (princ "Documentation:")
1151 (princ "Documentation:") 1203 (terpri)
1152 (terpri) 1204 (let ((doc (documentation-property variable 'variable-documentation))
1153 (let ((doc (documentation-property variable 'variable-documentation)) 1205 (obsolete (variable-obsoleteness-doc origvar))
1154 (obsolete (variable-obsoleteness-doc origvar)) 1206 (compatible (variable-compatibility-doc origvar)))
1155 (compatible (variable-compatibility-doc origvar))) 1207 (when obsolete
1156 (when obsolete 1208 (princ obsolete)
1157 (princ obsolete) 1209 (terpri)
1158 (terpri) 1210 (terpri))
1159 (terpri)) 1211 (when compatible
1160 (when compatible 1212 (princ compatible)
1161 (princ compatible) 1213 (terpri)
1162 (terpri) 1214 (terpri))
1163 (terpri)) 1215 ;; don't bother to print anything if variable is obsolete and aliased.
1164 ;; don't bother to print anything if variable is obsolete and aliased. 1216 (when (or (not obsolete) (not aliases))
1165 (when (or (not obsolete) (not aliases)) 1217 (if doc
1166 (if doc 1218 ;; note: documentation-property calls substitute-command-keys.
1167 ;; note: documentation-property calls substitute-command-keys. 1219 (princ doc)
1168 (princ doc) 1220 (princ "not documented as a variable."))))
1169 (princ "not documented as a variable.")) 1221 (terpri))))
1170 (terpri)))
1171 ;; Return the text we displayed.
1172 (buffer-string nil nil standard-output)))))
1173 1222
1174 (defun sorted-key-descriptions (keys &optional separator) 1223 (defun sorted-key-descriptions (keys &optional separator)
1175 "Sort and separate the key descriptions for KEYS. 1224 "Sort and separate the key descriptions for KEYS.
1176 The sorting is done by length (shortest bindings first), and the bindings 1225 The sorting is done by length (shortest bindings first), and the bindings
1177 are separated with SEPARATOR (\", \" by default)." 1226 are separated with SEPARATOR (\", \" by default)."
1207 1256
1208 (defun describe-syntax () 1257 (defun describe-syntax ()
1209 "Describe the syntax specifications in the syntax table. 1258 "Describe the syntax specifications in the syntax table.
1210 The descriptions are inserted in a buffer, which is then displayed." 1259 The descriptions are inserted in a buffer, which is then displayed."
1211 (interactive) 1260 (interactive)
1212 (with-displaying-help-buffer 1261 (with-displaying-help-buffer (format "syntax-table for %s" major-mode)
1213 (lambda () 1262 ;; defined in syntax.el
1214 ;; defined in syntax.el 1263 (describe-syntax-table (syntax-table) standard-output)))
1215 (describe-syntax-table (syntax-table) standard-output))))
1216 1264
1217 (defun list-processes () 1265 (defun list-processes ()
1218 "Display a list of all processes. 1266 "Display a list of all processes.
1219 \(Any processes listed as Exited or Signaled are actually eliminated 1267 \(Any processes listed as Exited or Signaled are actually eliminated
1220 after the listing is made.)" 1268 after the listing is made.)"
1222 (with-output-to-temp-buffer "*Process List*" 1270 (with-output-to-temp-buffer "*Process List*"
1223 (set-buffer standard-output) 1271 (set-buffer standard-output)
1224 (buffer-disable-undo standard-output) 1272 (buffer-disable-undo standard-output)
1225 (make-local-variable 'truncate-lines) 1273 (make-local-variable 'truncate-lines)
1226 (setq truncate-lines t) 1274 (setq truncate-lines t)
1227 (let ((stream standard-output)) 1275 ;; 00000000001111111111222222222233333333334444444444
1228 ;; 00000000001111111111222222222233333333334444444444 1276 ;; 01234567890123456789012345678901234567890123456789
1229 ;; 01234567890123456789012345678901234567890123456789 1277 ;; rewritten for I18N3. This one should stay rewritten
1230 ;; rewritten for I18N3. This one should stay rewritten 1278 ;; so that the dashes will line up properly.
1231 ;; so that the dashes will line up properly. 1279 (princ "Proc Status Buffer Tty Command\n---- ------ ------ --- -------\n")
1232 (princ "Proc Status Buffer Tty Command\n---- ------ ------ --- -------\n" stream) 1280 (let ((tail (process-list)))
1233 (let ((tail (process-list))) 1281 (while tail
1234 (while tail 1282 (let* ((p (car tail))
1235 (let* ((p (car tail)) 1283 (pid (process-id p))
1236 (pid (process-id p)) 1284 (s (process-status p)))
1237 (s (process-status p))) 1285 (setq tail (cdr tail))
1238 (setq tail (cdr tail)) 1286 (princ (format "%-13s" (process-name p)))
1239 (princ (format "%-13s" (process-name p)) stream) 1287 ;;(if (and (eq system-type 'vax-vms)
1240 ;(if (and (eq system-type 'vax-vms) 1288 ;; (eq s 'signal)
1241 ; (eq s 'signal) 1289 ;; (< (process-exit-status p) NSIG))
1242 ; (< (process-exit-status p) NSIG)) 1290 ;; (princ (aref sys_errlist (process-exit-status p))))
1243 ; (princ (aref sys_errlist (process-exit-status p)) stream)) 1291 (princ s)
1244 (princ s stream) 1292 (if (and (eq s 'exit) (/= (process-exit-status p) 0))
1245 (if (and (eq s 'exit) (/= (process-exit-status p) 0)) 1293 (princ (format " %d" (process-exit-status p))))
1246 (princ (format " %d" (process-exit-status p)) stream)) 1294 (if (memq s '(signal exit closed))
1247 (if (memq s '(signal exit closed)) 1295 ;; Do delete-exited-processes' work
1248 ;; Do delete-exited-processes' work 1296 (delete-process p))
1249 (delete-process p)) 1297 (indent-to 22 1) ;####
1250 (indent-to 22 1) ;#### 1298 (let ((b (process-buffer p)))
1251 (let ((b (process-buffer p))) 1299 (cond ((not b)
1252 (cond ((not b) 1300 (princ "(none)"))
1253 (princ "(none)" stream)) 1301 ((not (buffer-name b))
1254 ((not (buffer-name b)) 1302 (princ "(killed)"))
1255 (princ "(killed)" stream)) 1303 (t
1256 (t 1304 (princ (buffer-name b)))))
1257 (princ (buffer-name b) stream)))) 1305 (indent-to 37 1) ;####
1258 (indent-to 37 1) ;#### 1306 (let ((tn (process-tty-name p)))
1259 (let ((tn (process-tty-name p))) 1307 (cond ((not tn)
1260 (cond ((not tn) 1308 (princ "(none)"))
1261 (princ "(none)" stream)) 1309 (t
1262 (t 1310 (princ (format "%s" tn)))))
1263 (princ (format "%s" tn) stream)))) 1311 (indent-to 49 1) ;####
1264 (indent-to 49 1) ;#### 1312 (if (not (integerp pid))
1265 (if (not (integerp pid)) 1313 (progn
1266 (progn 1314 (princ "network stream connection ")
1267 (princ "network stream connection " stream) 1315 (princ (car pid))
1268 (princ (car pid) stream) 1316 (princ "@")
1269 (princ "@" stream) 1317 (princ (cdr pid)))
1270 (princ (cdr pid) stream)) 1318 (let ((cmd (process-command p)))
1271 (let ((cmd (process-command p))) 1319 (while cmd
1272 (while cmd 1320 (princ (car cmd))
1273 (princ (car cmd) stream) 1321 (setq cmd (cdr cmd))
1274 (setq cmd (cdr cmd)) 1322 (if cmd (princ " ")))))
1275 (if cmd (princ " " stream))))) 1323 (terpri))))))
1276 (terpri stream)))))))
1277
1278 ;; `find-function' et al moved to "find-func.el"
1279 1324
1280 ;;; help.el ends here 1325 ;;; help.el ends here