|
;;; ess-toolbar.el --- Support for a toolbar in ESS. -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 1997--2009 A.J. Rossini, Richard M. Heiberger, Martin
|
|
;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen.
|
|
|
|
;; Author: Stephen Eglen
|
|
;; Created: 2004-05-06
|
|
;; Revised: 2009-03-16
|
|
;; Maintainer: ESS-core <ESS-core@r-project.org>
|
|
|
|
;; This file is part of ESS
|
|
|
|
;; This file is free software; you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation; either version 2, or (at your option)
|
|
;; any later version.
|
|
|
|
;; This file is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; A copy of the GNU General Public License is available at
|
|
;; https://www.r-project.org/Licenses/
|
|
|
|
;;; Commentary:
|
|
|
|
;; This code adds a toolbar to ESS modes for editing R and S code.
|
|
;; Support can be added for other modes (e.g. STATA), just ask!
|
|
;;
|
|
;; This code is experimental. It has been tested only on Linux
|
|
;; machines. All feedback appreciated.
|
|
;;
|
|
;; If your Emacs can support images, the ESS toolbar should be loaded.
|
|
;;
|
|
;; If you see a toolbar, but no icons, check out the value of
|
|
;; ess-icon-directory.
|
|
;;
|
|
;; The toolbar can be customized in several ways. To see options, do:
|
|
;; M-x customize-group RET ess-toolbar RET
|
|
;; If you change any of the variables, you _may_ need to restart Emacs
|
|
;; to see any effect. See also the documentation for ess-toolbar-items
|
|
;; if you wish to change its value.
|
|
|
|
;;; Technical issues.
|
|
|
|
;; 2009-03-16: toolbar code in Emacs 23 has changed slightly to 22,
|
|
;; and presumably once Emacs 22 is no longer supported, this code can
|
|
;; be cleaned up a bit (i.e. no need to set load-path.)
|
|
|
|
;;; Code:
|
|
|
|
(require 'ess-mode)
|
|
|
|
(defgroup ess-toolbar nil
|
|
"ESS: toolbar support."
|
|
:group 'ess
|
|
:link '(emacs-commentary-link :tag "Commentary" "ess-toolbar.el")
|
|
:prefix "ess-")
|
|
|
|
(defcustom ess-use-toolbar
|
|
(and (fboundp 'display-images-p) (display-images-p))
|
|
"Non-nil means ESS should support the toolbar."
|
|
:type 'boolean)
|
|
|
|
|
|
(defcustom ess-toolbar-own-icons nil
|
|
"Non-nil means that we only put our toolbar entries in ESS.
|
|
Otherwise we get standard toolbar as well as ESS entries.
|
|
The standard toolbar items are copied from the default toolbar."
|
|
:type 'boolean)
|
|
|
|
(defcustom ess-toolbar-global nil
|
|
"*Non-nil means that the ESS toolbar is available in all Emacs buffers.
|
|
Otherwise, the ESS toolbar is present only in R/S mode buffers.
|
|
For beginners, this is probably better set to a non-nil value."
|
|
:type 'boolean)
|
|
|
|
(defcustom ess-toolbar-items
|
|
'( (R "startr")
|
|
;;(S "spluslogo" "Start S process")
|
|
(S "splus_letter_small")
|
|
(ess-eval-line-and-step "rline")
|
|
(ess-eval-region "rregion")
|
|
(ess-eval-function-or-paragraph-and-step "rregion")
|
|
(ess-load-file "rbuffer")
|
|
(ess-eval-function "rfunction")
|
|
(ess-switch-to-ESS "switch_ess"))
|
|
"Items to be added to the ESS toolbar.
|
|
Each list element has two items:
|
|
1. the name of the function to run
|
|
2. the icon to be used (without .xpm extension)
|
|
|
|
General toolbar items are also added to the ESS toolbar
|
|
iff `ess-toolbar-own-icons' is nil.
|
|
|
|
Setting this variable with setq doesn't take effect once you have
|
|
loaded ess-site, unless you follow it by a call to
|
|
`ess-make-toolbar' afterwards. Instead, change its value using
|
|
Custom, and then on all new ESS buffers you should see the
|
|
toolbar has changed."
|
|
:set (lambda (symbol value)
|
|
(set-default symbol value)
|
|
(if (fboundp 'ess-make-toolbar)
|
|
(ess-make-toolbar)))
|
|
:type '(repeat (list (function :tag "Function to run")
|
|
(string :tag "Icon"))))
|
|
|
|
(defvar ess-icon-directory
|
|
(expand-file-name "icons" ess-etc-directory)
|
|
"*Location for ESS icons.
|
|
This variable should be set automatically by the ESS install process.
|
|
Icons should be found in ESS/etc/icons/ directory.
|
|
If `ess-icon-directory' is invalid, please report a bug.")
|
|
|
|
(unless (file-directory-p ess-icon-directory)
|
|
(ess-write-to-dribble-buffer
|
|
"`ess-icon-directory' does not exist; using `ess-etc-directory'.\n")
|
|
(setq ess-icon-directory ess-etc-directory))
|
|
|
|
(defvar ess-toolbar nil
|
|
"Toolbar items to be added to ESS editing buffers.")
|
|
|
|
(defun ess-make-toolbar ()
|
|
"Make the ESS toolbar."
|
|
;; Under Emacs, only worth building the toolbar if tool-bar-map is
|
|
;; available. e.g. when running Emacs within a terminal, tool-bar-map
|
|
;; is not available, so no need to make the tool-bar.
|
|
(when (boundp 'tool-bar-map)
|
|
(setq ess-toolbar
|
|
(if (or ess-toolbar-own-icons (null tool-bar-map))
|
|
(make-sparse-keymap)
|
|
(copy-keymap tool-bar-map)))
|
|
(let ((tool-bar-map ess-toolbar)
|
|
(load-path (list ess-icon-directory)))
|
|
;; in Emacs 22, icons are found by examining load-path, bound here
|
|
;; whereas Emacs 23 seems to want them in image-load-path, set at the
|
|
;; bottom of this file.
|
|
(mapc #'ess-add-icon ess-toolbar-items))))
|
|
|
|
(defun ess-add-icon (x)
|
|
"Add an ESS item to the Emacs toolbar.
|
|
X should be a list, see `ess-toolbar-items' for the format."
|
|
;; By using tool-bar-add-item-from-menu instead of tool-bar-add-item
|
|
;; we get the tooltips "for free" from ess-mode-map.
|
|
(tool-bar-add-item-from-menu (car x) (cadr x) ess-mode-map))
|
|
|
|
(defun ess-add-toolbar ()
|
|
"Add the ESS toolbar to a particular mode.
|
|
The toolbar is added iff `ess-toolbar-global' is nil, else the toolbar
|
|
is added globally when ess-toolbar.el is loaded."
|
|
(when (and ess-toolbar (not ess-toolbar-global))
|
|
(setq-local tool-bar-map ess-toolbar)))
|
|
|
|
;; Make the toolbars. Each toolbar is hopefully made only when this file
|
|
;; is loaded; we don't need it to be remade every time.
|
|
(if ess-use-toolbar
|
|
(progn
|
|
(ess-make-toolbar)
|
|
;; After making the toolbar, if ESS toolbar is needed globally,
|
|
;; add it here.
|
|
(if ess-toolbar-global
|
|
(setq tool-bar-map ess-toolbar)
|
|
(ess-write-to-dribble-buffer "Creating global Emacs toolbar"))
|
|
|
|
;; Check for toolbar support - needed iff ess-use-toolbar is non-nil.
|
|
(or
|
|
;; Emacs support for images:
|
|
(and (fboundp 'display-images-p) (display-images-p))
|
|
;; if above tests failed, give a warning.
|
|
(progn
|
|
(message "Toolbar support for ESS not available in this Emacs.")
|
|
;; Not sure if we want to delay startup of ESS.
|
|
;;(sit-for 2)
|
|
))
|
|
))
|
|
|
|
;; Following needed for Emacs 23, not Emacs 22
|
|
(when (boundp 'image-load-path)
|
|
(add-to-list 'image-load-path ess-icon-directory))
|
|
|
|
(provide 'ess-toolbar)
|
|
|
|
;;; ess-toolbar.el ends here
|