emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: address@hidden: links in Help buffer aren'talwayscorrect]


From: Kevin Rodgers
Subject: Re: address@hidden: links in Help buffer aren'talwayscorrect]
Date: Mon, 19 Dec 2005 11:22:08 -0800 (PST)

"Richard M. Stallman" <address@hidden> wrote:
> It looks like this code extracts the list of frame parameter names
> when it is _loaded_.  That is inconvenient.  Could you 
> do that when the function is called for the first time?
...
> replace-regexp is meant for users; could you please write a simple
> while loop instead?

Sure, this version fixes both concerns.
-- 
Kevin

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
(defvar frame-parameter-docstring-alist nil
  "List of (PARAMETER . DOC-STRING) associations.")

(defun default-frame-parameter-docstring-alist ()
  "Return the default value of `frame-parameter-docstring-alist'."
  (save-excursion
    (save-window-excursion
      (let ((alist '())
            (pop-up-frames nil))
        (info "(elisp)Window Frame Parameters")
        (goto-char (point-min))
        (while (re-search-forward "^`\\(\\sw\\(?:\\sw\\|\\s_\\)*\\)'$" nil t)
          (let* ((parameter (intern (match-string 1)))
                 (infostring
                  (buffer-substring (1+ (point))
                                    (1- (or (re-search-forward "^`" nil t)
                                            (point-max)))))
                 (case-fold-search t)
                 (xref-regexp
                  "\\(?: (\\|; see \\)?\\*note[ \t\n]*\\(?:[^:]*\\)::[).]")
                 (xref-or-indent-regexp
                  (format "\\(%s\\)\\|\\(\n +\\)" xref-regexp))
                 (docstring
                  ;; delete Info xrefs and indentation, then reformat:
                  (with-temp-buffer
                    (insert infostring)
                    (goto-char (point-min))
                    (while (re-search-forward xref-or-indent-regexp nil t)
                      (cond ((and (match-beginning 1) (match-end 1))
                             (replace-match "" t t))
                            ((and (match-beginning 2) (match-end 2))
                             (replace-match "\n" t t))))
                    (fill-region (point-min) (point-max))
                    (buffer-string))))
            (setq alist
                  (cons (cons parameter docstring)
                        alist))
            ;; move to matched backquote at bol:
            (backward-char 1)))
        (nreverse alist)))))

(defun describe-frame-parameter (parameter &optional frame)
  "Display the full documentation of frame PARAMETER (a symbol) in FRAME.
If FRAME is nil, describe the selected frame's parameter value."
  (interactive
   (let* ((enable-recursive-minibuffers t)
          (default-param (symbol-at-point))
          ;; in Emacs 21.4 there are 41 documented frame parameters; 83
          ;; is the smallest prime that's at least twice that:
          (param-table (let ((table (make-vector 83 0)))
                         (mapc (lambda (assoc)
                                 (intern (symbol-name (car assoc)) table))
                               (or frame-parameter-docstring-alist
                                   (setq frame-parameter-docstring-alist
                                         
(default-frame-parameter-docstring-alist))))
                         (mapc (lambda (assoc)
                                 (intern (symbol-name (car assoc)) table))
                               (frame-parameters nil))
                         table))
          (param-name
           (progn
             ;; make sure the default is a frame parameter:
             (setq default-param
                   (intern-soft (symbol-name default-param) param-table))
             ;; complete on both documented frame parameters and
             ;; user-defined parameters that may be set:
             (completing-read (if default-param
                                  (format "Describe parameter (default %s): "
                                          default-param)
                                "Describe parameter: ")
                              param-table
                              nil t nil nil
                              (if default-param (symbol-name default-param))))))
     (list (if (equal param-name "")
               default-param
             (intern param-name)))))
  (if (null frame)
      (setq frame (selected-frame)))
  (if (null parameter)
      (message "You did not specify a frame parameter")
    (let ((value (frame-parameter frame parameter))
          (docstring (cdr (assq parameter frame-parameter-docstring-alist))))
      (with-output-to-temp-buffer "*Help*"
        (prin1 parameter)
        (princ "'s value is ")
        (terpri)
        (with-current-buffer standard-output
          (let ((from (point)))
            (pp value)
            ;; (help-xref-on-pp from (point))
            (if (< (point) (+ from 20))
                (save-excursion
                  (goto-char from)
                  (delete-char -1)))))
        (terpri)
        (terpri)
        (princ "Documentation:")
        (terpri)
        (if docstring
            (princ docstring)
          (princ "not documented as a frame parameter."))))))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]