(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."))))))