[ESS] Feature Idea: open help in browser when viewing it in an emacs buffer

Vitalie Spinu spinuvit.list at gmail.com
Tue Nov 1 12:32:15 CET 2011

On Mon, Oct 31, 2011 at 4:01 PM, Vitalie Spinu <spinuvit.list at gmail.com> wrote:
> The only thing that I am missing in ess R-help is the ability to open
> the index of a package directly from ess-help buffer. I will find a
> way to do it and post to the thread latter.

As promised, here is an advanced index popper function. Press "i" in
ess-help buffer, you will get a prompt asking for a package (defaults
to the package for which current function belongs to). All installed
packages are available with completion.

Once in the index file press RET or C-m to jump to the help page of
the object described in the current line. Index pages inherit from
ess-help-mode and  behave similarly during the initialization (i.e.
honor ess-help-own-frame).

(defun ess--help-on-object-at-bol ()
  "Provide help on object at the beginning of line.
Intended to be used in R-index help pages. Load the package if necessary.
It is bound to RET and C-m in R-index pages."
    (let ((package (buffer-name))
      (string-match ".*(package:\\(.*\\))[^)]*\\'" package)
      (setq package (match-string 1 package))
      (if (not (re-search-backward "^\\(\\S-+\\)\\( \\{2\\}\\|\t\\)" nil t))
          (message "No help topics at this line")
        (setq obj (match-string 1))
        (when package
          (ess-command (format "require('%s')\n" package)) ;;might not
be loaded
          (ess-display-help-on-object obj)

(defun ess-display-R-index ()
  "Prompt for package name and display its index.
Bound to 'i' by default in ess-help-mode-map."
  (let ((object (buffer-name))
        (curr-win-mode major-mode)
        pack buff all-packs prompt)
    (if (not (equal ess-dialect "R"))
        (message "Sorry, not available for the dialect %s " ess-dialect)
      (string-match ".*(\\(.*\\))[^)]*\\'" object)
      (setq object (match-string 1 object))
      (if  (not object)
          (message "Cannot infer the help object from buffer name")
        (setq pack (car (ess-get-words-from-vector (format
"find('%s')\n" object))))
        (when pack
          (string-match "package:\\(.*\\)\\'" pack)
          (setq pack (match-string 1 pack)))
      (setq all-packs (ess-get-words-from-vector
".packages(all.available = TRUE)\n"))
      (setq prompt (if pack
                       (format "Index of (default '%s'): " pack)
                     "Index of: "))
      (setq pack (completing-read prompt all-packs nil nil nil nil pack))
      (setq buff  (get-buffer-create (format "*help[%s](package:%s)*"
ess-dialect pack)))
      (with-current-buffer buff
        (if buffer-read-only (setq buffer-read-only nil))
        (delete-region (point-min) (point-max))
        (setq ess-local-process-name ess-current-process-name)
        (ess-command (format "help(package='%s')\n" pack) buff)
        (set-buffer-modified-p 'nil)
        (goto-char (point-min))
        (re-search-forward "^Index:" nil t)
          (while (re-search-forward "^\\(\\S-+\\)\\( \\{2\\}\\|\t\\)" nil t)
            (put-text-property (match-beginning 1) (match-end 1) 'face
        (local-set-key [return] 'ess--help-on-object-at-bol)
        (local-set-key [(control ?m)] 'ess--help-on-object-at-bol)
        (toggle-read-only t))
      (let ((special-display-regexps
             (if ess-help-own-frame '(".") nil))
            (special-display-frame-alist ess-help-frame-alist)
             (if (eq ess-help-own-frame 'one)
        (if (eq curr-win-mode 'ess-help-mode)
            (if ess-help-own-frame
                (pop-to-buffer buff)
              (switch-to-buffer buff))
          (ess-display-temp-buffer buff)))

(define-key ess-help-mode-map "i" 'ess-display-R-index)

Now I have no reasons using html help whatsoever.


More information about the ESS-help mailing list