|
;; ess-gretl.el --- ESS gretl mode and inferior interaction -*- lexical-binding: t; -*-
|
|
;;
|
|
;; Copyright (C) 2012 Allin Cottrell
|
|
;; Copyright (C) 2012 Ahmadou DICKO
|
|
;; Copyright (C) 2013 ESS core team
|
|
;;
|
|
;; Filename: ess-gretl.el
|
|
;; Author: Ahmadou DICKO, Spinu Vitalie and Allin Cottrell (based on ess-julia.el and gretl.el)
|
|
;; Maintainer: Ahmadou DICKO
|
|
;; Created: 01-10-2012 (ESS 12.09)
|
|
;; Keywords: ESS, gretl, econometrics
|
|
;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
|
|
;; This file is *NOT* part of GNU Emacs.
|
|
;;
|
|
;; This program 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 3, any later version.
|
|
;;
|
|
;; This program 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:
|
|
;; start the inferior with M-x gretl.
|
|
;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
(require 'compile); for compilation-* below
|
|
(require 'ess-r-mode)
|
|
|
|
;;; Code:
|
|
(add-to-list 'auto-mode-alist '("\\.inp$" . ess-gretl-mode))
|
|
|
|
|
|
(defvar gretl-syntax-table
|
|
(let ((table (make-syntax-table)))
|
|
(modify-syntax-entry ?_ "w" table) ; underscores in words
|
|
(modify-syntax-entry ?@ "w" table)
|
|
(modify-syntax-entry ?# "<" table) ; # single-line comment start
|
|
(modify-syntax-entry ?\n ">" table) ; \n single-line comment end
|
|
(modify-syntax-entry ?\{ "(} " table)
|
|
(modify-syntax-entry ?\} "){ " table)
|
|
(modify-syntax-entry ?\[ "(] " table)
|
|
(modify-syntax-entry ?\] ")[ " table)
|
|
(modify-syntax-entry ?\( "() " table)
|
|
(modify-syntax-entry ?\) ")( " table)
|
|
(modify-syntax-entry ?\r " " table)
|
|
(modify-syntax-entry ?+ "." table)
|
|
(modify-syntax-entry ?- "." table)
|
|
(modify-syntax-entry ?= "." table)
|
|
(modify-syntax-entry ?* "." table)
|
|
(modify-syntax-entry ?/ "." table)
|
|
(modify-syntax-entry ?> "." table)
|
|
(modify-syntax-entry ?< "." table)
|
|
(modify-syntax-entry ?& "." table)
|
|
(modify-syntax-entry ?| "." table)
|
|
(modify-syntax-entry ?! "." table)
|
|
(modify-syntax-entry ?\\ "\\" table)
|
|
(modify-syntax-entry ?\' "." table)
|
|
(modify-syntax-entry ?\` "w" table)
|
|
(modify-syntax-entry ?\" "\"" table)
|
|
(modify-syntax-entry ?. "w" table)
|
|
(modify-syntax-entry ?_ "w" table)
|
|
(modify-syntax-entry ?\% "." table)
|
|
(modify-syntax-entry ?\# "<" table)
|
|
(modify-syntax-entry ?\n ">" table)
|
|
table)
|
|
"Syntax table for `ess-gretl-mode'.")
|
|
|
|
;; syntax table that holds within strings
|
|
(defvar ess-gretl-mode-string-syntax-table
|
|
(let ((table (make-syntax-table)))
|
|
table)
|
|
"Syntax table for `ess-gretl-mode' that holds within strings.")
|
|
|
|
(defcustom gretl-continuation-offset 4
|
|
"Extra indentation applied to Gretl continuation lines."
|
|
:type 'integer
|
|
:group 'ess-gretl)
|
|
|
|
(defvar gretl-continuation-regexp
|
|
"[^#%\n]*\\(\\\\\\|\\.\\.\\.\\)\\s-*\\(\\s<.*\\)?$")
|
|
|
|
(defcustom gretl-continuation-string "\\"
|
|
"Character string used for Gretl continuation lines. Normally \\."
|
|
:type 'string
|
|
:group 'ess-gretl)
|
|
|
|
;; (defconst gretl-string-regex
|
|
;; "\"[^\"]*?\\(\\(\\\\\\\\\\)*\\\\\"[^\"]*?\\)*\"")
|
|
|
|
(defconst gretl-function-header-regexp
|
|
(concat "^\\s-*\\<\\(function\\)\\>"
|
|
"\\([^=;\n]*=[ \t]*\\|[ \t]*\\)\\(\\w+\\)\\>")
|
|
"Regexp to match a Gretl function header.
|
|
The string `function' and its name are given by the first and third
|
|
parenthetical grouping.")
|
|
|
|
;; (defconst ess-function-call-regexp
|
|
;; "\\s\"?\\(\\(\\sw\\|\\s_\\)+\\(<-\\)?\\)\\s\"?*\\s-*("
|
|
;; "Regexp for function names")
|
|
|
|
(defvar gretl-command-words
|
|
'("add" "adf" "anova" "append" "ar" "ar1" "arbond" "arch"
|
|
"arima" "biprobit" "break" "boxplot" "chow" "clear" "coeffsum" "coint"
|
|
"coint2" "corr" "corrgm" "cusum" "data" "dataset" "delete" "diff"
|
|
"difftest" "discrete" "dpanel" "dummify" "duration" "elif" "else" "end"
|
|
"endif" "endloop" "eqnprint" "equation" "estimate" "fcast" "foreign" "fractint"
|
|
"freq" "function" "funcerr" "garch" "genr" "gmm" "gnuplot" "graphpg"
|
|
"hausman" "heckit" "help" "hsk" "hurst" "if" "include" "info"
|
|
"intreg" "kalman" "kpss" "labels" "lad" "lags" "ldiff" "leverage"
|
|
"levinlin" "logistic" "logit" "logs" "loop" "mahal" "makepkg" "meantest"
|
|
"mle" "modeltab" "modprint" "modtest" "mpols" "negbin" "nls" "normtest"
|
|
"nulldata" "ols" "omit" "open" "orthdev" "outfile" "panel" "pca"
|
|
"pergm" "textplot" "poisson" "print" "printf" "probit" "pvalue" "quantreg"
|
|
"qlrtest" "qqplot" "quit" "rename" "reset" "restrict" "rmplot" "run"
|
|
"runs" "scatters" "sdiff" "set" "setinfo" "setobs" "setmiss" "shell"
|
|
"smpl" "spearman" "sprintf" "square" "sscanf" "store" "summary" "system"
|
|
"tabprint" "tobit" "tsls" "var" "varlist" "vartest" "vecm" "vif"
|
|
"wls" "xcorrgm" "xtab" "debug" "return" "catch" "for" "foreach"
|
|
"while" "const" "3sls" "liml" "fiml"
|
|
"sur" "params" "deriv" "orthog" "weights" "series" "scalar")
|
|
"Commands in Gretl (these names are also reserved).")
|
|
|
|
(defvar gretl-genr-functions
|
|
'("abs" "sin" "cos" "tan" "asin" "acos" "atan" "sinh"
|
|
"cosh" "tanh" "asinh" "acosh" "atanh" "log" "ln" "log10"
|
|
"log2" "exp" "sqrt" "diff" "ldiff" "sdiff" "lags" "int"
|
|
"round" "ceil" "floor" "sort" "dsort" "sortby" "ranking" "orthdev"
|
|
"nobs" "firstobs" "lastobs" "uniform" "normal" "cum" "missing" "ok"
|
|
"misszero" "lrvar" "quantile" "median" "gini" "zeromiss" "sum" "mean"
|
|
"min" "max" "sd" "var" "sst" "cnorm" "dnorm" "qnorm"
|
|
"gammafun" "lngamma" "digamma" "resample" "pnobs" "pmin" "pmax" "pmean"
|
|
"psd" "hpfilt" "bkfilt" "bwfilt" "fracdiff" "boxcox" "cov" "corr"
|
|
"movavg" "I" "zeros" "ones" "seq" "replace" "muniform" "mnormal"
|
|
"sumc" "sumr" "meanc" "meanr" "sdc" "minc" "maxc" "minr"
|
|
"maxr" "iminc" "imaxc" "iminr" "imaxr" "fft" "ffti" "cmult"
|
|
"cdiv" "mcov" "mcorr" "mxtab" "cdemean" "cholesky" "psdroot" "inv"
|
|
"invpd" "ginv" "diag" "transp" "vec" "vech" "unvech" "upper"
|
|
"lower" "rows" "cols" "det" "ldet" "tr" "onenorm" "infnorm"
|
|
"rcond" "rank" "qform" "mlag" "qrdecomp" "eigensym" "eigengen" "nullspace"
|
|
"princomp" "mexp" "fdjac" "BFGSmax" "obsnum" "isseries" "isscalar" "islist"
|
|
"isstring" "isnull" "nelem" "pdf" "cdf" "invcdf" "pvalue" "critical"
|
|
"randgen" "urcpval" "values" "mshape" "svd" "mols" "mpols" "mrls"
|
|
"mread" "mwrite" "selifc" "selifr" "polroots" "dummify" "wmean" "wvar"
|
|
"wsd" "xpx" "filter" "kfilter" "ksmooth" "ksimul" "trimr" "getenv"
|
|
"argname" "obslabel" "readfile" "grab" "strstr" "strncmp" "strlen" "sscanf"
|
|
"varname" "varnum" "tolower" "colnames" "rownames" "ljungbox" "msortby" "lincomb"
|
|
"imhof" "toepsolv" "diagcat" "xmin" "xmax" "corrgm" "mcovg" "fcstats"
|
|
"bessel" "fraclag" "mreverse" "deseas" "pergm" "irr" "npv" "logistic"
|
|
"weekday" "kdensity" "monthlen" "epochday" "setnote" "invmills" "polyfit" "chowlin"
|
|
"varsimul" "strsplit" "inlist" "errmsg" "isconst" "irf" "inbundle")
|
|
"Builtin functions for Gretl's genr command.")
|
|
|
|
|
|
(defvar gretl-option-flags
|
|
'("addstats" "all" "anova" "append"
|
|
"arch" "arma-init" "asymptotic" "auto"
|
|
"autocorr" "auxiliary" "balanced" "bartlett"
|
|
"between" "bootstrap" "both" "breusch-pagan"
|
|
"byobs" "by" "c" "close"
|
|
"coded" "cols" "column" "comfac"
|
|
"complete" "conditional" "contiguous" "continue"
|
|
"continuous" "control" "covariance" "cross"
|
|
"cross-section" "crt" "csv" "ct"
|
|
"ctt" "cubes-only" "dat" "database"
|
|
"dataset" "db" "degrees" "dhansen"
|
|
"difference" "diffuse" "discrete" "dpdstyle"
|
|
"drop-empty" "drop-first" "drop-last" "dummy"
|
|
"dynamic" "equal" "exit" "exponential"
|
|
"fcp" "fixed-effects" "from-file" "full"
|
|
"func" "gamma" "geomean" "gls"
|
|
"gmm" "gnu-R" "gnu-octave" "gph"
|
|
"gzipped" "hausman-reg" "hessian" "hilu"
|
|
"impulse-responses" "input" "inst" "integrate"
|
|
"intervals" "inverse-fit" "iterate" "jackknife"
|
|
"jbera" "jitter" "jmulti" "kendall"
|
|
"lags" "lagselect" "lbfgs" "lillie"
|
|
"liml" "linear-fit" "list" "loess-fit"
|
|
"log" "loglogistic" "lognormal" "logs"
|
|
"matrix" "matrix-diff" "medians" "ml"
|
|
"model1" "multi" "multinomial" "nc"
|
|
"next" "no-corc" "no-dates" "no-df-corr"
|
|
"no-gradient-check" "no-header" "no-missing" "no-scaling"
|
|
"no-stats" "normal" "normality" "notches"
|
|
"numerical" "odbc" "omit-obs" "one-scale"
|
|
"opg" "orthdev" "other" "out-of-sample"
|
|
"output" "overwrite" "p-values" "panel"
|
|
"panel-vars" "plot" "pooled" "preserve"
|
|
"print-final" "progress-bar" "progressive" "pwe"
|
|
"quadratic-fit" "quiet" "quit" "radians"
|
|
"random" "random-effects" "rank-sum" "raw"
|
|
"rc" "replace" "restrict" "restructure"
|
|
"reverse" "robust" "rolling" "row"
|
|
"rtf" "save" "save-all" "save-ehat"
|
|
"save-xbeta" "scalars" "seasonals" "send-data"
|
|
"sign" "signed-rank" "silent" "simple"
|
|
"simple-print" "single-yaxis" "skip-df" "spearman"
|
|
"special-time-series" "squares" "squares-only" "stacked-cross-section"
|
|
"stacked-time-series" "static" "stdresid" "suppress-fitted"
|
|
"swilk" "system" "t-ratios" "tall"
|
|
"test-down" "tex" "time-dummies" "time-series"
|
|
"to-file" "to_file" "traditional" "trend"
|
|
"two-step" "unequal-vars" "uniform" "unit-weights"
|
|
"variance-decomp" "vcv" "verbose" "wald"
|
|
"weibull" "weights" "white" "white-nocross"
|
|
"with-impulses" "with-lines" "write" "www"
|
|
"x-12-arima" "y-diff-only" "z-scores" "zeros")
|
|
"Gretl option flags.")
|
|
|
|
(defvar gretl-internal-vars
|
|
'("Fstat" "T" "ahat" "aic" "bic" "chisq" "coeff_ci"
|
|
"coeff" "compan" "datatype" "df" "dwpval" "ec" "ehat"
|
|
"error" "ess" "fcast" "fcerr" "gmmcrit" "hausman" "hqc"
|
|
"h" "jalpha" "jbeta" "jvbeta" "kalman_llt" "kalman_lnl" "kalman_s2"
|
|
"kalman_t" "kalman_uhat" "llt" "lnl" "mnlprobs" "ncoeff" "nobs"
|
|
"nscan" "nvars" "obs" "pd" "pvalue" "rho" "rlnl"
|
|
"rsq" "s00" "s01" "s11" "sample" "sargan" "sigma"
|
|
"stderr" "stopwatch" "sysA" "sysB" "sysGamma" "t1" "t2"
|
|
"test" "trsq" "uhat" "unit" "vcv" "version" "vma"
|
|
"windows" "xlist" "xtxinv" "yhat" )
|
|
"Model- and dataset-related variables.")
|
|
|
|
(defconst gretl-block-start-keywords
|
|
(list "loop" "foreign" "function" "gmm" "if" "system" "mle" "nls" "restrict"))
|
|
|
|
(defconst gretl-block-other-keywords
|
|
(list "else" "elif"))
|
|
|
|
(defconst gretl-block-end-keywords
|
|
(list "end" "endif" "endloop"))
|
|
|
|
(defvar gretl-keywords
|
|
(append gretl-block-start-keywords
|
|
gretl-block-other-keywords
|
|
gretl-block-end-keywords
|
|
'("break"))
|
|
"Reserved words in Gretl.")
|
|
|
|
|
|
(defun gretl-at-keyword (kw-list)
|
|
; not a keyword if used as a field name, X.word, or quoted, :word
|
|
(and (or (= (point) 1)
|
|
(and (not (equal (char-before (point)) ?.))
|
|
(not (equal (char-before (point)) ?:))))
|
|
(not (ess-inside-string-or-comment-p (point)))
|
|
(not (ess-inside-brackets-p (point)))
|
|
(member (current-word) kw-list)))
|
|
|
|
|
|
(defconst gretl-font-lock-keywords
|
|
(list
|
|
;; Fontify all builtin keywords.
|
|
(cons (concat "\\<\\("
|
|
(mapconcat 'identity gretl-keywords "\\|")
|
|
"\\)\\>")
|
|
'font-lock-keyword-face)
|
|
;; Fontify all option flags.
|
|
(cons (concat "[ \t]--\\("
|
|
(mapconcat 'identity gretl-option-flags "\\|")
|
|
"\\)")
|
|
'font-lock-constant-face)
|
|
;; Fontify all command words.
|
|
(cons (concat "\\<\\("
|
|
(mapconcat 'identity gretl-command-words "\\|")
|
|
"\\)\\>")
|
|
'font-lock-builtin-face)
|
|
;; Fontify all builtin operators.
|
|
(cons "\\(&\\||\\|<=\\|>=\\|==\\|<\\|>\\|!=\\|!\\)"
|
|
(if (boundp 'font-lock-builtin-face)
|
|
'font-lock-builtin-face
|
|
'font-lock-preprocessor-face))
|
|
;; Fontify all internal variables.
|
|
(cons (concat "\\$\\("
|
|
(mapconcat 'identity gretl-internal-vars "\\|")
|
|
"\\)\\>")
|
|
'font-lock-variable-name-face)
|
|
|
|
;; Fontify all genr functions.
|
|
(cons (concat "\\<\\("
|
|
(mapconcat 'identity gretl-genr-functions "\\|")
|
|
"\\)\\>")
|
|
'font-lock-variable-name-face)
|
|
;; Fontify all function declarations.
|
|
(list gretl-function-header-regexp
|
|
'(1 font-lock-keyword-face)
|
|
'(3 font-lock-function-name-face nil t)))
|
|
"Additional Gretl expressions to highlight.")
|
|
|
|
|
|
(defvar gretl-block-begin-regexp
|
|
(concat "\\<\\("
|
|
(mapconcat 'identity gretl-block-start-keywords "\\|")
|
|
"\\)\\>"))
|
|
|
|
(defvar gretl-block-else-regexp
|
|
(concat "\\<\\("
|
|
(mapconcat 'identity gretl-block-other-keywords "\\|")
|
|
"\\)\\>"))
|
|
|
|
(defvar gretl-block-end-regexp
|
|
(concat "\\<\\("
|
|
(mapconcat 'identity gretl-block-end-keywords "\\|")
|
|
"\\)\\>"))
|
|
|
|
(defvar gretl-block-begin-or-end-regexp
|
|
(concat gretl-block-begin-regexp "\\|" gretl-block-end-regexp))
|
|
|
|
|
|
(defvar gretl-block-else-or-end-regexp
|
|
(concat gretl-block-else-regexp "\\|" gretl-block-end-regexp))
|
|
|
|
(defvar gretl-basic-offset 4)
|
|
|
|
(defvar gretl-block-match-alist
|
|
'(("loop" . ("endloop"))
|
|
("if" . ("else" "elif" "endif"))
|
|
("nls" . ("end"))
|
|
("mle" . ("end"))
|
|
("gmm" . ("end"))
|
|
("foreign" . ("end"))
|
|
("restrict" . ("end"))
|
|
("kalman" . ("end"))
|
|
("system" . ("end")))
|
|
"Alist with Gretl's matching block keywords.
|
|
Has Gretl's begin keywords as keys and a list of the matching else or
|
|
end keywords as associated values.")
|
|
|
|
|
|
|
|
; get the position of the last open block
|
|
(defun gretl-last-open-block-pos (min)
|
|
(let ((count 0))
|
|
(while (not (or (> count 0) (<= (point) min)))
|
|
(backward-word 1)
|
|
(setq count
|
|
(cond ((gretl-at-keyword gretl-block-start-keywords)
|
|
(+ count 1))
|
|
((and (zerop (string-match "\\(?:e\\(?:l\\(?:if\\|se\\)\\|nd\\(?:if\\|loop\\)?\\)\\)" (current-word)))
|
|
(not (ess-inside-comment-p)) (not (ess-inside-brackets-p)))
|
|
(- count 1))
|
|
(t count))))
|
|
(if (> count 0)
|
|
(point)
|
|
nil)))
|
|
|
|
|
|
(defun gretl-last-open-block (min)
|
|
(let ((pos (gretl-last-open-block-pos min)))
|
|
(and pos
|
|
(progn
|
|
(goto-char pos)
|
|
(+ gretl-basic-offset (current-indentation))))))
|
|
|
|
|
|
; return indent implied by a special form opening on the previous line, if any
|
|
(defun gretl-form-indent ()
|
|
(forward-line -1)
|
|
(end-of-line)
|
|
(backward-sexp)
|
|
(if (gretl-at-keyword gretl-block-other-keywords)
|
|
(+ gretl-basic-offset (current-indentation))
|
|
(if (char-equal (char-after (point)) ?\()
|
|
(progn
|
|
(backward-word 1)
|
|
(let ((cur (current-indentation)))
|
|
(if (gretl-at-keyword gretl-block-start-keywords)
|
|
(+ gretl-basic-offset cur)
|
|
nil)))
|
|
nil)))
|
|
|
|
|
|
(defun gretl-indent-line ()
|
|
"Indent current line of gretl code."
|
|
(interactive)
|
|
(end-of-line)
|
|
(indent-line-to
|
|
(or (and (ess-inside-string-p (point-at-bol)) 0)
|
|
(save-excursion (ignore-errors (gretl-form-indent)))
|
|
(save-excursion
|
|
(let ((endtok (progn
|
|
(beginning-of-line)
|
|
(forward-to-indentation 0)
|
|
(gretl-at-keyword gretl-block-end-keywords))))
|
|
(ignore-errors (+ (gretl-last-open-block (point-min))
|
|
(if endtok (- gretl-basic-offset) 0)))))
|
|
;; previous line ends in =
|
|
(save-excursion
|
|
(if (and (not (equal (point-min) (line-beginning-position)))
|
|
(progn
|
|
(forward-line -1)
|
|
(end-of-line) (backward-char 1)
|
|
(equal (char-after (point)) ?=)))
|
|
(+ gretl-basic-offset (current-indentation))
|
|
nil))
|
|
;; take same indentation as previous line
|
|
(save-excursion (forward-line -1)
|
|
(current-indentation))
|
|
0))
|
|
(when (gretl-at-keyword gretl-block-end-keywords)
|
|
(forward-word 1)))
|
|
|
|
;; (defun gretl-send-string-function (process string visibly)
|
|
;; (let ((gretl-process (get-process "gretlcli")))
|
|
;; (process-send-string process (format ess-load-command file)))
|
|
|
|
|
|
;; (defun gretl-send-string-function (process string visibly)
|
|
;; (let ((file (concat temporary-file-directory "gretl_eval_region.inp")))
|
|
;; (with-temp-file file
|
|
;; (insert string))
|
|
;; (process-send-string process (format ess-load-command file))))
|
|
|
|
(defun gretl--get-words-from-command (command start-reg end-reg proc)
|
|
(with-current-buffer (ess-command command nil nil nil nil proc)
|
|
(goto-char (point-min))
|
|
(let ((beg (or (re-search-forward start-reg nil t)
|
|
(point-min)))
|
|
(end (progn (goto-char (point-max))
|
|
(or (re-search-backward end-reg)
|
|
(point-max))))
|
|
acum)
|
|
(goto-char beg)
|
|
(skip-chars-forward "\n")
|
|
(while (re-search-forward "[^ \t\n]+" end t)
|
|
(push (match-string-no-properties 0) acum))
|
|
acum)))
|
|
|
|
(cl-defmethod ess-help-get-topics (proc &context (ess-dialect "gretl"))
|
|
(delete-dups
|
|
(append gretl-command-words gretl-genr-functions
|
|
gretl-block-end-keywords gretl-block-other-keywords
|
|
gretl-block-start-keywords
|
|
(gretl--get-words-from-command "help\n" "are:" "^For" proc)
|
|
(gretl--get-words-from-command "help functions\n" "Accessors:" "^Functions" proc)
|
|
(gretl--get-words-from-command "help functions\n" "^Functions" "^For" proc)
|
|
)))
|
|
|
|
;; (defvar ess-gretl-error-regexp-alist '(gretl-in gretl-at)
|
|
;; "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.")
|
|
|
|
;; (add-to-list 'compilation-error-regexp-alist-alist
|
|
;; '(gretl-in "^\\s-*in [^ \t\n]* \\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1))
|
|
;; (add-to-list 'compilation-error-regexp-alist-alist
|
|
;; '(gretl-at "^\\s-*\\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1))
|
|
|
|
|
|
(defvar gretl-customize-alist
|
|
'((comint-use-prompt-regexp . t)
|
|
(inferior-ess-primary-prompt . "\\? ")
|
|
(inferior-ess-secondary-prompt . "\\ ")
|
|
(inferior-ess-prompt . "\\? ")
|
|
(ess-local-customize-alist . 'gretl-customize-alist)
|
|
(inferior-ess-program . "gretlcli")
|
|
(ess-load-command . "open \"%s\"\n")
|
|
;; (ess-dump-error-re . "in \\w* at \\(.*\\):[0-9]+")
|
|
;; (ess-error-regexp . "\\(^\\s-*at\\s-*\\(?3:.*\\):\\(?2:[0-9]+\\)\\)")
|
|
;; (ess-error-regexp-alist . ess-gretl-error-regexp-alist)
|
|
;; (inferior-ess-objects-command . inferior-gretl-objects-command)
|
|
;; (inferior-ess-search-list-command . "search()\n")
|
|
;; inferior-ess-help-command . gretl-help-command)
|
|
(inferior-ess-help-command . "help %s\n")
|
|
(ess-language . "gretl")
|
|
(ess-dialect . "gretl")
|
|
(ess-suffix . "inp")
|
|
(ess-dump-filename-template . (replace-regexp-in-string
|
|
"S$" ess-suffix ; in the one from custom:
|
|
ess-dump-filename-template-proto))
|
|
(ess-change-sp-regexp . nil );ess-r-change-sp-regexp)
|
|
(ess-help-sec-regex . ess-help-r-sec-regex)
|
|
(ess-help-sec-keys-alist . ess-help-r-sec-keys-alist)
|
|
(ess-function-pattern . ess-r-function-pattern)
|
|
(ess-object-name-db-file . "ess-r-namedb.el" )
|
|
;; (ess-imenu-mode-function . nil)
|
|
(ess-smart-operators . ess-r-smart-operators)
|
|
(inferior-ess-exit-command . "exit\n")
|
|
;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help?
|
|
(inferior-ess-language-start . nil)
|
|
(ess-STERM . "iESS")
|
|
)
|
|
"Variables to customize for Gretl -- set up later than Emacs initialization.")
|
|
|
|
;; (defcustom inferior-gretl-program "gretlcli"
|
|
;; "*The program to use for running gretl scripts."
|
|
;; :type 'string
|
|
;; :group 'ess-gretl)
|
|
|
|
;; (defvar ess-gretl-versions '("gretcli")
|
|
;; "List of partial strings for versions of Julia to access within ESS.
|
|
;; Each string specifies the start of a filename. If a filename
|
|
;; beginning with one of these strings is found on `exec-path', a M-x
|
|
;; command for that version of Julia is made available. ")
|
|
|
|
(defcustom inferior-gretl-args ""
|
|
"String of arguments used when starting gretl."
|
|
:group 'ess-gretl
|
|
:type 'string)
|
|
|
|
;;;###autoload
|
|
(define-derived-mode ess-gretl-mode ess-mode "ESS[gretl]"
|
|
"Major mode for editing gretl source. See `ess-mode' for more help."
|
|
;;(setq imenu-generic-expression R-imenu-generic-expression)
|
|
(ess-setq-vars-local gretl-customize-alist)
|
|
(setq font-lock-defaults `(,gretl-font-lock-keywords))
|
|
(setq-local paragraph-start (concat "\\s-*$\\|" page-delimiter))
|
|
(setq-local paragraph-separate (concat "\\s-*$\\|" page-delimiter))
|
|
(setq-local paragraph-ignore-fill-prefix t)
|
|
(setq-local comment-start "# ")
|
|
(setq-local comment-add 1)
|
|
(setq-local comment-start-skip "\\s<+\\s-*")
|
|
(setq-local comment-column 40)
|
|
(setq-local indent-line-function #'gretl-indent-line)
|
|
(setq-local ess-local-customize-alist gretl-customize-alist)
|
|
(when (fboundp 'ess-add-toolbar) (ess-add-toolbar)))
|
|
|
|
|
|
(defvar ess-gretl-post-run-hook nil
|
|
"Functions run in process buffer after Gretl starts.")
|
|
|
|
;;;###autoload
|
|
(defun gretl (&optional start-args)
|
|
"Call 'gretl',
|
|
Optional prefix (C-u) allows to set command line arguments, such as
|
|
--vsize. This should be OS agnostic.
|
|
If you have certain command line arguments that should always be passed
|
|
to gretl, put them in the variable `inferior-gretl-args'."
|
|
(interactive "P")
|
|
;; get settings, notably inferior-ess-r-program :
|
|
;; (if (null inferior-gretl-program)
|
|
;; (error "'inferior-gretl-program' does not point to 'gretl-release-basic' executable")
|
|
(ess-write-to-dribble-buffer ;; for debugging only
|
|
(format
|
|
"\n(Gretl): ess-dialect=%s, buf=%s"
|
|
ess-dialect (current-buffer)))
|
|
(let* ((r-start-args
|
|
(concat inferior-gretl-args " " ; add space just in case
|
|
(if start-args
|
|
(read-string
|
|
(concat "Starting Args [other than `"
|
|
inferior-gretl-args
|
|
"'] ? "))
|
|
nil)))
|
|
(inf-buf (inferior-ess r-start-args gretl-customize-alist)))
|
|
(setq-local indent-line-function 'gretl-indent-line)
|
|
(setq-local gretl-basic-offset 4)
|
|
(setq indent-tabs-mode nil)
|
|
(goto-char (point-max))
|
|
;; (if inferior-ess-language-start
|
|
;; (ess-eval-linewise inferior-ess-language-start
|
|
;; nil nil nil 'wait-prompt)))
|
|
(with-current-buffer inf-buf
|
|
(run-mode-hooks 'ess-gretl-post-run-hook))
|
|
inf-buf))
|
|
|
|
|
|
;;;; IMENU
|
|
|
|
;; (defvar gretl-imenu-generic-expression
|
|
;; '(("Function (_)" "^\\s-*function\\s-+\\(_[^ \t\n]*\\)" 1)
|
|
;; ("Function" "^\\s-*function\\s-+\\([^_][^ \t\n]*\\)" 1)
|
|
;; ("Const" "^\\s-*const \\([^ \t\n]*\\)" 1)
|
|
;; ("Type" "^\\s-*\\w*type\\w* \\([^ \t\n]*\\)" 1)
|
|
;; ("Load" " *\\(load\\)(\\([^ \t\n)]*\\)" 2)
|
|
;; ;; ("Classes" "^.*setClass(\\(.*\\)," 1)
|
|
;; ;; ("Coercions" "^.*setAs(\\([^,]+,[^,]*\\)," 1) ; show from and to
|
|
;; ;; ("Generics" "^.*setGeneric(\\([^,]*\\)," 1)
|
|
;; ;; ("Methods" "^.*set\\(Group\\|Replace\\)?Method(\"\\(.+\\)\"," 2)
|
|
;; ;; ;;[ ]*\\(signature=\\)?(\\(.*,?\\)*\\)," 1)
|
|
;; ;; ;;
|
|
;; ;; ;;("Other" "^\\(.+\\)\\s-*<-[ \t\n]*[^\\(function\\|read\\|.*data\.frame\\)]" 1)
|
|
;; ;; ("Package" "^.*\\(library\\|require\\)(\\(.*\\)," 2)
|
|
;; ;; ("Data" "^\\(.+\\)\\s-*<-[ \t\n]*\\(read\\|.*data\.frame\\).*(" 1)))
|
|
;; ))
|
|
|
|
|
|
;; (defun ess-imenu-gretl (&optional arg)
|
|
;; "Gretl Language Imenu support for ESS."
|
|
;; (interactive)
|
|
;; (setq imenu-generic-expression gretl-imenu-generic-expression)
|
|
;; (imenu-add-to-menubar "Imenu-gretl"))
|
|
|
|
|
|
;; (defun ess-imenu-gretl (&optional arg)
|
|
;; "Gretl Language Imenu support for ESS."
|
|
;; (interactive)
|
|
;; (setq imenu-generic-expression gretl-imenu-generic-expression)
|
|
;; (imenu-add-to-menubar "Imenu-jl"))
|
|
|
|
|
|
(provide 'ess-gretl)
|
|
|
|
;;; ess-gretl.el ends here
|