spacemacs/contrib/lang/ess/packages.el
syl20bnr 318bd23dc4 Add pre and post init functions support to configuration-layers
Now in addition to the <layer>/init-<pkg> function there are
- <layer>/pre-init-<pkg> (executed before <layer>/init-<pkg>)
- <layer>/post-init-<pkg> (executed after <layer>/init-<pkg>)

The init function is mandatory, if it is not present then the
package is ignored and not installed.

This mechanism allows soft (implicit) cross layers dependencies
between packages (see company for more info).

It is now possible to remove flycheck from spacemacs layer and
move it to its own syntax-checking layer.
2015-04-03 17:12:56 -04:00

151 lines
5.8 KiB
EmacsLisp

;;; packages.el --- ESS (R) Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2014 Sylvain Benner
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(defvar ess-packages
'(
company
company-ess
ess
ess-R-data-view
ess-R-object-popup
ess-smart-equals
rainbow-delimiters
)
"List of all packages to install and/or initialize. Built-in packages
which require an initialization must be listed explicitly in the list.")
(defvar ess-excluded-packages '()
"List of packages to exclude.")
(defun ess/init-ess ()
;; ESS is not quick to load so we just load it when
;; we need it (see my-keybindings.el for the associated
;; keybinding)
(defun load-ess-on-demand ()
(interactive)
(-all? '---truthy? (list
(use-package ess-site)
(use-package ess-R-object-popup)
(use-package ess-R-data-view))))
(evil-leader/set-key "ess" 'load-ess-on-demand)
(use-package ess
:defer t
:init
(progn
(setq auto-mode-alist (append
'(("\\.sp\\'" . S-mode)
("/R/.*\\.q\\'" . R-mode)
("\\.[qsS]\\'" . S-mode)
("\\.ssc\\'" . S-mode)
("\\.SSC\\'" . S-mode)
("\\.[rR]\\'" . R-mode)
("\\.[rR]nw\\'" . Rnw-mode)
("\\.[sS]nw\\'" . Snw-mode)
("\\.[rR]profile\\'" . R-mode)
("NAMESPACE\\'" . R-mode)
("CITATION\\'" . R-mode)
("\\.omg\\'" . omegahat-mode)
("\\.hat\\'" . omegahat-mode)
("\\.lsp\\'" . XLS-mode)
("\\.do\\'" . STA-mode)
("\\.ado\\'" . STA-mode)
("\\.[Ss][Aa][Ss]\\'" . SAS-mode)
("\\.[Ss]t\\'" . S-transcript-mode)
("\\.Sout" . S-transcript-mode)
("\\.[Rr]out" . R-transcript-mode)
("\\.Rd\\'" . Rd-mode)
("\\.[Bb][Uu][Gg]\\'" . ess-bugs-mode)
("\\.[Bb][Oo][Gg]\\'" . ess-bugs-mode)
("\\.[Bb][Mm][Dd]\\'" . ess-bugs-mode)
("\\.[Jj][Aa][Gg]\\'" . ess-jags-mode)
("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode)
("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode))
auto-mode-alist))
(defun ess/auto-load-hack (mode-symbol)
(eval
`(defun ,mode-symbol ()
"This is a function that will hijack itself with its
definition from ess. The reason this exists is that ess does
not play nicely with autoloads"
(when (load-ess-on-demand)
(,mode-symbol)))))
(defvar ess/r-modes-list '(R-mode R-transcript-mode Rd-mode Rnw-mode S-mode S-transcript-mode
SAS-mode STA-mode Snw-mode XLS-mode ess-bugs-mode ess-jags-mode omegahat-mode)
"This is the list of modes defined by ess")
(mapc (lambda (sym) (ess/auto-load-hack sym)) ess/r-modes-list)))
;; R --------------------------------------------------------------------------
(eval-after-load "ess-site"
'(progn
(add-to-list 'auto-mode-alist '("\\.R$" . R-mode))
;; Follow Hadley Wickham's R style guide
(setq ess-first-continued-statement-offset 2
ess-continued-statement-offset 0
ess-expression-offset 2
ess-nuke-trailing-whitespace-p t
ess-default-style 'DEFAULT)
(evil-leader/set-key-for-mode 'ess-mode
"msi" 'R
;; noweb
"mcC" 'ess-eval-chunk-and-go
"mcc" 'ess-eval-chunk
"mcd" 'ess-eval-chunk-and-step
"mcm" 'ess-noweb-mark-chunk
"mcN" 'ess-noweb-previous-chunk
"mcn" 'ess-noweb-next-chunk
;; helpers
"mhd" 'ess-R-dv-pprint
"mhi" 'ess-R-object-popup
"mht" 'ess-R-dv-ctable
;; REPL
"msB" 'ess-eval-buffer-and-go
"msb" 'ess-eval-buffer
"msD" 'ess-eval-function-or-paragraph-and-step
"msd" 'ess-eval-region-or-line-and-step
"msL" 'ess-eval-line-and-go
"msl" 'ess-eval-line
"msR" 'ess-eval-region-and-go
"msr" 'ess-eval-region
"msT" 'ess-eval-function-and-go
"mst" 'ess-eval-function
)
(define-key ess-mode-map (kbd "<s-return>") 'ess-eval-line)
(define-key inferior-ess-mode-map (kbd "C-j") 'comint-next-input)
(define-key inferior-ess-mode-map (kbd "C-k") 'comint-previous-input))))
(defun ess/init-rainbow-delimiters ()
(add-hook 'ess-mode-hook #'rainbow-delimiters-mode))
(defun ess/init-ess-smart-equals ()
(use-package ess-smart-equals
:defer t
:if ess-enable-smart-equals
:init
(progn
(add-hook 'ess-mode-hook 'ess-smart-equals-mode)
(add-hook 'inferior-ess-mode-hook 'ess-smart-equals-mode))))
(when (configuration-layer/layer-declaredp 'auto-completion)
(defun ess/post-init-company ()
(spacemacs|enable-company ess-mode))
(defun ess/init-company-ess ()
(use-package company-ess
:defer t
:init (push '(company-ess-backend :with company-yasnippet)
company-backends-ess-mode))))