unix-conf/.emacs.d/elpa/ess-20160208.453/lisp/ess-install.el

237 lines
8.8 KiB
EmacsLisp
Raw Normal View History

2016-02-18 13:53:30 +00:00
;;; ess-install.el --- Automatic installation of ESS.
;; Auto-install procedure. EXPERIMENTAL!
;; Copyright (C) 2006 A.J. Rossini, Richard M. Heiberger, Martin
;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen.
;; Author: Stephen Eglen
;; 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
;; http://www.r-project.org/Licenses/
;;
;;
;; In short: you may use this code any way you like, as long as you
;; don't charge more than a distribution fee for it, do distribute the
;; source with any binaries, remove this notice, or hold anyone liable
;; for its results.
;;; Commentary:
;; Although installing ESS is relatively simple, sometimes people get
;; confused as to what to add to their init files, or even where their
;; init files are located. The following procedure should be a bit
;; simpler, as Emacs will add the necessary start-up lines itself.
;; (The instructions below assume you have downloaded ess as a zip
;; package, but it will work also for the .tar.gz version of ESS as
;; long as you know how to unpack a .tar.gz in step 3.)
;;
;; Installing ESS for the first time.
;;
;; 1. Create a folder (e.g C:/emacs) where you will store ESS. We will
;; assume that you are installing ESS into C:/emacs (unix users can use
;; ~/emacs).
;;
;; 2. Download ess-5.2.12.zip and store it in the folder you created.
;;
;; 3. Unpack the files from the zip archive, e.g. by right-clicking on it
;; within Windows explorer and selecting "Extract all". On unix, use
;; "unzip ess-5.2.12.zip".
;;
;; 4. Start a new emacs (or xemacs).
;;
;; 5. In the new emacs, you need to open the file "ess-install.el" which
;; is part of ESS. To do this, type:
;;
;; C-x C-f c:/emacs/ess-5.2.12/lisp/ess-install.el RET
;;
;; You should now see a lisp file with the top line:
;; ;;; ess-install.el --- Automatic installation of ESS.
;;
;; 6. Type M-x eval-buffer RET
;;
;; What does this do? This will find your emacs initialisation file, and
;; it will add the following two lines to the end of the file:
;;
;; ;;; ESS setup for version 5.2.12
;; (load "c:/emacs/ess-5.2.12/lisp/ess-site")
;;
;; Do not edit those two lines! They are useful if later you come to
;; upgrade ESS.
;;
;; 7. Start a new Emacs and you should find then that ESS is loaded. For
;; example, create a new file called "foo.R" and check that it opens
;; in R mode by looking at the mode line and menubar.
;;
;; Upgrading your version of ESS.
;;
;; If (and only if) you use the above instructions for installing ESS,
;; when a new version of ESS is released, you can use the same method to
;; install the new version. Repeat steps 2-7 for the new release of ESS,
;; and this time in step 6, if emacs finds that you already have the
;; special line ";;; ESS setup for version 5.2.12", it will highlight
;; those lines, and query whether you want to replace those two lines
;; with the new setup code.
;;
;; If you do upgrade ESS this way, bear in mind that your old version
;; will not be deleted from your filespace -- you will have to delete it
;; yourself.
;; TODO: possibly add a call to (byte-recompile-directory ess-lisp-dir
;; 0) so that lisp files are byte compiled.
;;; Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Location where the new lisp files are stored.
(defvar ess-lisp-dir (file-name-directory
(abbreviate-file-name buffer-file-name))
"Location where the new lisp files are stored.")
(defvar ess-site-file (concat ess-lisp-dir "ess-site")
"Full path to the new ess-site file.
Do not include .el extension in case there is also a .elc around.")
(defvar ess-new-version nil
"Version number of new ESS to be installed.")
(defvar ess-installed nil)
(defun ess-install-byte-compile ()
"Byte compile the ESS files.
This will probably generate warnings, but they can hopefully be
ignored."
;; To do byte compilation, XEmacs seems to want the files on its
;; load-path so that it can do the (require 'xyz) statements.
(add-to-list 'load-path ess-lisp-dir)
(byte-recompile-directory ess-lisp-dir 0))
;; Check that ess-site-file is written using unix directory separators.
;; i.e. need to change c:\\some\\dir\\ess-site.el to
;; c:/some/dir/ess-site.el
;; To do this, we have to load in ess-replace-in-string, from
;; the file ess-inf.el
(save-window-excursion
(find-file (concat ess-lisp-dir "ess-inf.el"))
(goto-char (point-min))
(search-forward-regexp "^(defun ess-replace-in-string " nil t)
(eval-defun nil)
(setq ess-site-file
(ess-replace-in-string ess-site-file "\\\\" "/" t))
)
;; Get the version number of the new software. Open the file
;; ess-custom.el and then find the definition of the variable
;; ess-version.
(save-window-excursion
(let ((beg))
(find-file (concat ess-lisp-dir "ess-custom.el"))
;; go back to start, just in case file was previously open.
(goto-char (point-min))
(search-forward "defvar ess-version \"")
(setq beg (point))
(search-forward "\"")
(setq ess-new-version (buffer-substring beg (1- (point))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Highlighting (copied from reftex.el -- cheers Carsten!)
;; Only one highlight region is needed, whereas two are provided here,
;; so this code could be simplified. But we may want it again later.
;; Highlighting uses overlays. If this is for XEmacs, we need to load
;; the overlay library, available in version 19.15
(and (not (fboundp 'make-overlay))
(condition-case nil
(require 'overlay)
('error
(error "Fm needs overlay emulation (available in XEmacs 19.15)"))))
;; We keep a vector with several different overlays to do our highlighting.
(defvar ess-highlight-overlays [nil nil])
;; Initialize the overlays (here we provide two overlays)
(aset ess-highlight-overlays 0 (make-overlay 1 1))
(overlay-put (aref ess-highlight-overlays 0) 'face 'highlight)
(aset ess-highlight-overlays 1 (make-overlay 1 1))
(overlay-put (aref ess-highlight-overlays 1) 'face 'highlight)
;; Two functions for activating and deactivation highlight overlays
(defun ess-highlight (index begin end &optional buffer)
"Highlight a region with overlay INDEX."
(move-overlay (aref ess-highlight-overlays index)
begin end (or buffer (current-buffer))))
(defun ess-unhighlight (index)
"Detatch overlay INDEX."
(delete-overlay (aref ess-highlight-overlays index)))
;;; End of highlighting code.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Try to find the .emacs init file and edit it.
(save-window-excursion
;; Try to find the init file if one already exists,
;; or create a new one if we can't find any.
(if (stringp user-init-file)
(find-file user-init-file)
;; else, let's guess that the init file should be called ".emacs"
;; and the tilde will be resolved okay.
(find-file "~/.emacs"))
(goto-char (point-min))
(let ((ess-commands
(concat "\n;;; ESS setup for version " ess-new-version "\n"
"(load \"" ess-site-file "\")\n"))
(new-install)
(beg))
(if (search-forward ";;; ESS setup for version " nil t)
(progn
(message "You already have ESS installed.")
(setq ess-installed
(buffer-substring (point)
(save-excursion (end-of-line) (point))))
(beginning-of-line)
(setq beg (point))
;; We assume the next line contains a sexp that loads the
;; the ess-site; this sexp can be multiple lines.
(forward-line 1)
(forward-list 1)
(ess-highlight 0 beg (point))
(setq new-install
(yes-or-no-p
(concat "Replace ESS version " ess-installed
" with version "
ess-new-version "? ")))
(when new-install
(kill-region beg (point))
(insert ess-commands)
(save-buffer)
(ess-install-byte-compile)
(message (concat "ESS updated to version " ess-new-version))
))
;; else, just insert commands at end.
(goto-char (point-max))
(insert ess-commands)
(save-buffer)
(ess-install-byte-compile)
(message (concat "ESS version "ess-new-version" installed."))
)))
;;; ess-install.el ends here