;;; ess-stata-lang.el --- Stata customization -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 1999--2000, Thomas Lumley, A. J. Rossini, Brendan Halpin.
|
|
;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin
|
|
;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen.
|
|
|
|
;; Author: Thomas Lumley <thomas@biostat.washington.edu>,
|
|
;; Brendan Halpin <brendan@essex.ac.uk>
|
|
;; Created: 2 Nov 1997
|
|
;; Maintainer: ESS-core <ESS-core@r-project.org>
|
|
|
|
;; Keywords: languages
|
|
|
|
;; This file is part of ESS (Emacs Speaks Statistics).
|
|
|
|
;; 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 is based upon Version 0.4 of Stata mode.
|
|
|
|
;; Stata modes. Emacs modes for using the Stata statistical package
|
|
;; Modified from S-mode, comint-mode
|
|
;;
|
|
;; (c) Thomas Lumley 1997
|
|
;;
|
|
;; version 0.4 20/7/97
|
|
;;
|
|
;; 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.
|
|
;;
|
|
;; (for the GNU GPL see above)
|
|
|
|
|
|
;;; Code:
|
|
|
|
(declare-function ess-help-mode "ess-help")
|
|
|
|
(require 'make-regexp) ; it's now local to the directory.
|
|
;;(load-library "make-regexp") ;; this is necessary for
|
|
;; ado-set-font-lock-keywords
|
|
;; only needed in Emacs >= 22.x
|
|
(require 'comint)
|
|
(require 'ess-trns)
|
|
|
|
(defconst ess-help-STA-sec-keys-alist
|
|
'((?d . "Description")
|
|
(?e . "Examples")
|
|
(?o . "Options")
|
|
(?s . "Also see")
|
|
(?S . "Syntax")
|
|
(?r . "Remarks")
|
|
(?t . "Title"))
|
|
"Help section keys.
|
|
`key' indicates the keystroke to use to search for the section heading
|
|
`string' in an Stata help file. `string' is used as part of a
|
|
regexp-search, and so specials should be quoted.
|
|
")
|
|
|
|
(defconst ess-help-STA-sec-regex "^[A-Z a-z]+:?\n-+\\|http:"
|
|
"Reg(ular) Ex(pression) of section headers in help file.")
|
|
|
|
(defun ado-set-font-lock-keywords ()
|
|
"Create font lock keywords for Stata syntax. This is from the
|
|
ado-mode of Bill Rising <brising@jhsph.edu>, and uses make-regexp."
|
|
;; (make-local-variable 'ado-font-lock-keywords)
|
|
(interactive)
|
|
(list
|
|
;; special highlighting
|
|
;; program definitions
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("^\\*!.*") font-lock-keyword-face)
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^"
|
|
'((
|
|
"pr" "pro" "prog" "progr" "progra" "program"
|
|
) font-lock-keyword-face)
|
|
"[ \t]+"
|
|
'((
|
|
"de" "def" "defi" "defin" "define"
|
|
"di" "dir"
|
|
"drop"
|
|
"l" "li" "lis" "list"
|
|
) font-lock-type-face nil)
|
|
"[ \t]+"
|
|
'(("[_a-z]+[_a-z0-9]*") font-lock-keyword-face nil)
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("^[ \t]*version") font-lock-reference-face)
|
|
"[ \t]*"
|
|
'(("1.0 2.0 2.1 3.0 3.1 4.0 5.0 6 6.0") font-lock-type-face)
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^"
|
|
'(("end" "pause"
|
|
) font-lock-keyword-face)
|
|
"[ /t]*.*$"
|
|
))
|
|
;; delimit command
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("^[ \t]*#delimit") font-lock-reference-face)
|
|
"\\s-*"
|
|
'(("\\(cr\\|;\\)\\s-*$") font-lock-type-face nil)
|
|
))
|
|
;; set command (with endless options!)
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("^[ \t]*set") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("adosize" "ANSI"
|
|
"b" "be" "bee" "beep" "checksum" "contents"
|
|
"d" "di" "dis" "disp" "displ" "displa" "display"
|
|
"g" "gr" "gra" "grap" "graph" "graphi" "graphic" "graphics"
|
|
"help"
|
|
"IBM"
|
|
"l" "le" "lev" "leve" "level"
|
|
"linesize"
|
|
"lo" "log"
|
|
"mat" "mats" "matsi" "matsiz" "matsize"
|
|
"maxobs" "maxvar"
|
|
"mem" "memo" "memor" "memory"
|
|
"mo" "mor" "more"
|
|
"obs"
|
|
"ou" "out" "outp" "outpu" "output"
|
|
"pagesize"
|
|
"r" "rm" "rms" "rmsg"
|
|
"se" "see" "seed" "seed0" "shell"
|
|
"te" "tex" "text" "texts" "textsi" "textsiz" "textsize"
|
|
"tr" "tra" "trac" "trace"
|
|
"t" "ty" "typ" "type" "video"
|
|
"vir" "virt" "virtu" "virtua" "virtual"
|
|
)
|
|
font-lock-reference-face t)
|
|
"[ \t]*"
|
|
'(("[a-zA-Z0-9]*") font-lock-type-face)
|
|
))
|
|
;; the constraint commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"cons" "const" "constr" "constra" "constrai" "constrain" "constraint"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"d"
|
|
"de" "def" "defi" "defin" "define"
|
|
"di" "dir"
|
|
"drop"
|
|
"l" "li" "lis" "list"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the confirm commands - could be a mess!
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"conf" "confi" "confir" "confirm"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"e" "ex" "exi" "exis" "exist" "existe" "existen" "existenc" "existence"
|
|
"f" "fi" "fil" "file"
|
|
"n" "nu" "num" "numb" "numbe" "number"
|
|
"v" "va" "var" "vari" "varia" "variab" "variabl" "variable"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"conf" "confi" "confir" "confirm"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"integer"
|
|
) font-lock-type-face)
|
|
"[ \t]+"
|
|
'((
|
|
"n" "nu" "num" "numb" "numbe" "number"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"conf" "confi" "confir" "confirm"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"n" "ne" "new"
|
|
) font-lock-type-face)
|
|
"[ \t]+"
|
|
'((
|
|
"f" "fi" "fil" "file"
|
|
"v" "va" "var" "vari" "varia" "variab" "variabl" "variable"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"conf" "confi" "confir" "confirm"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"byte" "double" "float" "int" "long"
|
|
"numeric"
|
|
"str" "stri" "strin" "string"
|
|
) font-lock-type-face)
|
|
"[ \t]+"
|
|
'((
|
|
"v" "va" "var" "vari" "varia" "variab" "variabl" "variable"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;;; the str# won't quite look right, but that's the breaks for using
|
|
;;; a tool like this...
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"conf" "confi" "confir" "confirm"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"str"
|
|
) font-lock-type-face)
|
|
"[1-9]+[0-9]*[ \t]+"
|
|
'((
|
|
"v" "va" "var" "vari" "varia" "variab" "variabl" "variable"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the estimates commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"est" "esti" "estim" "estima" "estimat" "estimate" "estimates"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"clear"
|
|
"di" "dir" "dis" "disp" "displ" "displa" "display"
|
|
"drop"
|
|
"h" "ho" "hol" "hold"
|
|
"li" "lis" "list"
|
|
"loc" "loca" "local"
|
|
"mat" "matr" "matri" "matrix"
|
|
"post"
|
|
"repost"
|
|
"sca" "scal" "scala" "scalar"
|
|
"u" "un" "unh" "unho" "unhol" "unhold"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the gph commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"gph"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"arc"
|
|
"box"
|
|
"clear" "close"
|
|
"font"
|
|
"line"
|
|
"open"
|
|
"pen" "point"
|
|
"text"
|
|
"vline" "vpoint" "vpoly" "vtext"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
|
|
;; some of the matrix commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("mat" "matr" "matri" "matrix") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("ac" "acc" "accu" "accum"
|
|
"cole" "coleq"
|
|
"coln" "colna" "colnam" "cloname" "colnames"
|
|
"d" "def" "defi" "defin" "define"
|
|
"di" "dir" "dispCns" "drop" "drop _all"
|
|
"glsa" "glsac" "glsacc" "glsaccu" "glsaccum"
|
|
"l" "li" "lis" "list" "makeCns" "mlou" "mlout" "post"
|
|
"rowe" "roweq"
|
|
"rown" "rowna" "rownam" "rowname" "rownames"
|
|
"sco" "scor" "score"
|
|
"sub" "subs" "subst" "substi" "substit" "substitu" "substitut" "substitute"
|
|
"svd" "syme" "symei" "symeig" "symeige" "symeigen"
|
|
"veca" "vecac" "vecacc" "vecaccu" "vecaccum"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the ml commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("ml") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("b" "be" "beg" "begi" "begin"
|
|
"check" "count"
|
|
"de" "dep" "depn" "depna" "depnam" "depname" "depnames"
|
|
"di" "dis" "disp" "displ" "displa" "display"
|
|
"f" "fu" "fun" "func" "funct" "functi" "functio" "function"
|
|
"gr" "gra" "grap" "graph"
|
|
"init"
|
|
"max" "maxi" "maxim" "maximi" "maximiz" "maximize"
|
|
"me" "met" "meth" "metho" "method"
|
|
"ml" "mlo" "mlou" "mlout"
|
|
"mo" "mod" "mode" "model"
|
|
"pl" "plo" "plot"
|
|
"po" "pos" "post"
|
|
"q" "qu" "que" "quer" "query"
|
|
"re" "rep" "repo" "repor" "report"
|
|
"sa" "sam" "samp" "sampl" "sample"
|
|
"se" "sea" "sear" "searc" "search"
|
|
"trace")
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the net commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("net") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"cd"
|
|
"d" "de" "des" "desc" "descr" "descri" "describ" "describe"
|
|
"from" "get" "install"
|
|
"link"
|
|
"q" "qu" "que" "quer" "query")
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("net") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("set") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("ado" "other") font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("ado") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("d" "de" "des" "desc" "descr" "descri" "describ" "describe"
|
|
"dir"
|
|
"uninstall")
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the reshape commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("reshape") font-lock-keyword-face)
|
|
"[ \t]+"
|
|
'((
|
|
"clear"
|
|
"error"
|
|
"i" "j"
|
|
"long"
|
|
"wide"
|
|
"xi" "xij")
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the return commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("ret" "retu" "retur" "return") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("add" "clear" "local" "matrix" "scalar") font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("sret" "sretu" "sretur" "sreturn") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'(("clear" "local") font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the sts commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("sts") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"g"
|
|
"gen" "gene" "gener" "genera" "generat" "generate"
|
|
"gr" "gra" "grap" "graph"
|
|
"l" "li" "lis" "list"
|
|
"t" "te" "tes" "test"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the sw commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("sw") font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"cloglog" "cnreg" "cox" "ereg" "gamma" "glm" "gompertz" "hetprob"
|
|
"llogist" "lnormal" "logistic" "logit" "ologit" "oprobit"
|
|
"poisson" "probit" "qreg" "reg" "regr" "regre" "regres" "regress"
|
|
"scobit" "tobit" "weibull"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the window commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"win" "wind" "windo" "window"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"d"
|
|
"di" "dia" "dial" "dialo" "dialog"
|
|
"dir" "drop"
|
|
"fo" "fop" "fope" "fopen"
|
|
"fs" "fsa" "fsav" "fsave"
|
|
"l" "list"
|
|
"push"
|
|
"stop" "stopb" "stopbo" "stopbox"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the window controls
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"win" "wind" "windo" "window"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"c" "co" "con" "cont" "contr" "contro" "control"
|
|
) font-lock-reference-face)
|
|
'((
|
|
"button" "check" "clear"
|
|
"edit"
|
|
"mcombo" "msimple"
|
|
"radbegin"
|
|
"radend"
|
|
"radio"
|
|
"scombo"
|
|
"ssimple"
|
|
"static"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the window manage commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"win" "wind" "windo" "window"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"man" "mana" "manag" "manage"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"forward"
|
|
"minimize"
|
|
"prefs load"
|
|
"prefs save"
|
|
"prefs default"
|
|
"print graph"
|
|
"print log"
|
|
"restore"
|
|
"update variable"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the window menu commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"win" "wind" "windo" "window"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"m" "me" "men" "menu"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"append popout"
|
|
"append string"
|
|
"append separator"
|
|
"clear"
|
|
"popout"
|
|
"set"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
;; the xwindow commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"xwin" "xwind" "xwindo" "xwindow"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"de" "def" "defi" "defin" "define"
|
|
"di" "dir"
|
|
"drop"
|
|
"l" "li" "lis" "list"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
|
|
;; all the endless Stata keywords (not in a good order)
|
|
;; first those keywords which must start line
|
|
;; note that these will look like text if preceded by a comment
|
|
;; (but comments shouldn't be before the command, anyway)
|
|
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]+"
|
|
'((
|
|
"cap" "capt" "captu" "captur" "capture"
|
|
"char" "err" "erro" "error" "e" "ex" "exi" "exit"
|
|
"par" "pars" "parse"
|
|
"set"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
;; here are some keywords which appear in the middle of lines
|
|
;; note that the really short abbreviations could make a mess of things
|
|
;;
|
|
;; These are split to allow compiling!
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\b"
|
|
'((
|
|
"_huber" "_qreg" "_robust"
|
|
"acprplot" "adjust"
|
|
"adopath" "alpha"
|
|
"an" "ano" "anov" "anova" "arch"
|
|
"areg" "arima"
|
|
"as" "ass" "asse" "asser" "assert"
|
|
"avplot" "avplots"
|
|
"bcskew0"
|
|
"be" "bee" "beep"
|
|
"biprobit" "bitest" "bitesti" "blogit"
|
|
"boxcox" "bprobit" "br" "break" "brier"
|
|
"bro" "brow" "brows" "browse"
|
|
"bsqreg" "bstat" "by"
|
|
"canon" "cat" "cc" "cci" "cchart" "centile" "cf" "ci" "cii"
|
|
"clogi" "clogit" "clogitp" "cloglog"
|
|
"close" "cmdtool"
|
|
"cnr" "cnre" "cnreg" "cnsreg" "codebook" "compare"
|
|
"copy"
|
|
"cor" "corc" "corr" "corre" "correl" "correla" "correlat" "correlate"
|
|
"corrgram"
|
|
"cou" "coun" "count"
|
|
"cox" "cprplot" "_crcswxx" "cs" "csi"
|
|
"ct" "ctset" "cttost"
|
|
"cumul" "cusum")
|
|
font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"d" "de" "des" "desc" "descr" "descri" "describ" "describe"
|
|
"dfbeta" "dfuller" "di"
|
|
"dir" "dis" "disp" "disp_res" "disp_s"
|
|
"displ" "displa" "display"
|
|
"do" "dotplot"
|
|
"dprobit" "ds" "dstdize" "dwstat"
|
|
"eivreg" "eq" "ereg"
|
|
"fac" "fact" "facto" "factor"
|
|
"fit" "for" "fpredict"
|
|
"fracplot" "fracpoly" "fsl"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"gettoken" "gladder" "glm" "glmpred" "glogit" "gnbreg" "gompertz"
|
|
"gphdot" "gphpen" "graph" "gprobit" "greigen" "grmeanby"
|
|
"hadimvo" "hausman" "heckman" "heckprob" "hetprob" "hettest" "hilite"
|
|
"hist" "hlu" "hotel"
|
|
"iqreg" "istdize" "iis"
|
|
"ins" "insp" "inspe" "inspec" "inspect"
|
|
"integ" "intreg" "ir" "iri" "ivreg"
|
|
"kap" "kappa" "kapwgt" "kdensity" "ksm" "ksmirnov" "ktau"
|
|
"kwallis"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"l" "ladder" "lfit" "lincom" "linktest"
|
|
"li" "lis" "list"
|
|
"log"
|
|
"logistic"
|
|
"logi" "logit"
|
|
"loneway" "lookfor"
|
|
"lo" "loo" "look" "looku" "lookup"
|
|
"lpredict" "lroc" "lrtest" "ls" "lsens" "lstat" "ltable" "lv" "lvr2plot"
|
|
"man" "matcproc" "mcc" "mcci"
|
|
"means"
|
|
"mlog" "mlogi" "mlogit"
|
|
"mor" "more"
|
|
"mvreg" "mx_param"
|
|
"n" "nbreg" "newey" "news"
|
|
"nl" "nlinit"
|
|
"no" "noi" "nois" "noisi" "noisil" "noisily"
|
|
"note" "notes"
|
|
"nptrend" "numlist"
|
|
"olog" "ologi" "ologit"
|
|
"ologitp"
|
|
"on" "one" "onew" "onewa" "oneway"
|
|
"oprob" "oprobi" "oprobit"
|
|
"oprobitp"
|
|
"orthog" "orthpoly"
|
|
"ovtest")
|
|
font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("pac" "pchart" "pchi" "pcorr" "pergram"
|
|
"pl" "plo" "plot"
|
|
"pnorm" "poisgof" "poisson" "pperron"
|
|
"prais"
|
|
"prob" "probi" "probit"
|
|
"prtest" "prtesti"
|
|
"pwcorr" "pwd"
|
|
"q" "qchi" "qnorm" "qqplot" "qreg" "quadchk" "quantile"
|
|
"qu" "que" "quer" "query"
|
|
"qui" "quie" "quiet" "quietl" "quietly"
|
|
"ranksum" "rchart" "regdw" "regph"
|
|
"reg" "reg3" "regr" "regre" "regres" "regress" "reshape"
|
|
"rot" "rota" "rotat" "rotate"
|
|
"rreg"
|
|
"run" "runtest" "rvfplot" "rvpplot"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"sampsi" "sconfirm"
|
|
"sco" "scobit" "scor" "score"
|
|
"sdtest" "sdtesti" "search" "serrbar"
|
|
"sfrancia" "shell" "shelltool" "shewhart" "signrank" "signtest"
|
|
"sktest" "slog" "spearman" "spikeplt" "sqreg"
|
|
"st" "st_is" "st_show" "st_ct"
|
|
"stcox" "stcoxkm" "stcurv" "stdes"
|
|
"stem"
|
|
"stereg" "stir" "stmc" "stmh" "stphplot" "stphtest"
|
|
"strate" "streg"
|
|
"sts" "stse" "stset" "stsum" "stvary" "stweib"
|
|
"su" "sum" "summ" "summa" "summar" "summari" "summariz" "summarize"
|
|
"sureg"
|
|
"svydes" "svyintrg" "svyivreg" "svylc" "svylogit"
|
|
"svymean" "svymean" "svymlog" "svyolog" "svyoprob" "svypois" "svyprobt"
|
|
"svyprop" "svyratio" "svyreg" "svyset" "svytab" "svytest" "svytotal"
|
|
"swilk" "symmetry" "symmi" "symplot" "syntax" "sysdir"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"ta" "tab"
|
|
"tab1" "tab2"
|
|
"tabdisp"
|
|
"tabi"
|
|
"table"
|
|
"tabu" "tabul" "tabula" "tabulat" "tabulate"
|
|
"te" "tes" "test"
|
|
"testnl" "testparm" "tis"
|
|
"tob" "tobi" "tobit"
|
|
"token" "tokeni" "tokeniz" "tokenize"
|
|
"touch" "tsreport" "tsset" "tsunab" "ttest" "ttesti"
|
|
"ty" "typ" "type"
|
|
"unab" "using"
|
|
"vce"
|
|
"verinst" "vif" "vwls"
|
|
"weibull" "which" "who" "wntestb" "wntestq"
|
|
"xchart" "xcorr"
|
|
"xtclog" "xtdes" "xtgee" "xtgls" "xthaus" "xtintreg"
|
|
"xtlogit" "xtnbreg" "xtpois" "xtprobit"
|
|
"xtrchh" "xtreg" "xtsum" "xttab" "xttest0" "xttobit" "xttrans"
|
|
"zip" "zinb"
|
|
) font-lock-reference-face)
|
|
"\\b"
|
|
))
|
|
|
|
;; conditional statements
|
|
;; if might not work right ('cuz it is also a keyword)
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]*\\sw+[ \t]*"
|
|
'(("if"
|
|
) font-lock-reference-face t t)
|
|
"\\b"
|
|
))
|
|
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]*"
|
|
'(("if" "while"
|
|
) font-lock-reference-face t t)
|
|
"[ \t]+.*{"
|
|
))
|
|
;; else statement (which must just have a {)
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]*"
|
|
'(("else"
|
|
) font-lock-reference-face)
|
|
"[ \t]*{"
|
|
))
|
|
|
|
;; short version of list --- which can get fooled if used as a var
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("^[ \t]*l\\b"
|
|
) font-lock-reference-face)
|
|
))
|
|
|
|
;; all the Stata options
|
|
;; commonly used options
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("byte" "int" "long" "str[1-9]+[0-9]?" "float" "double"
|
|
"width" "maxobs" "maxvar"
|
|
) font-lock-type-face)
|
|
"[ \t]+"
|
|
))
|
|
;; special local variables (used in parsing)
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]+\\(local\\)+[ \t]+"
|
|
'(("varlist" "exp" "weight" "if" "in" "using" "options"
|
|
) font-lock-type-face nil t t)
|
|
"\\b"
|
|
))
|
|
|
|
;; things used with display
|
|
;; since these are often split across lines, and Stata commands are hard
|
|
;; to delimit, this will highlight even if out of context
|
|
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"_c" "_co" "_con" "_cont" "_conti" "_contin" "_continu" "_continue"
|
|
"_n" "_ne" "_new" "_newl" "_newli" "_newlin" "_newline"
|
|
"_quote"
|
|
"_r" "_re" "_req" "_requ" "_reque" "_reques" "_request"
|
|
)
|
|
font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'((
|
|
"_col" "_colu" "_colum" "_column"
|
|
"_d" "_du" "_dup"
|
|
"_s" "_sk" "_ski" "_skip"
|
|
)
|
|
font-lock-type-face)
|
|
"([1-9]+[0-9]*)\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\bin[ \t]+"
|
|
'((
|
|
"b" "bl" "blu" "blue"
|
|
"g" "gr" "gre" "gree" "green"
|
|
"r" "re" "red"
|
|
"w" "wh" "whi" "whit" "white"
|
|
"y" "ye" "yel" "yell" "yello" "yellow"
|
|
) font-lock-type-face)
|
|
"\\b"
|
|
))
|
|
|
|
;; labels
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]+"
|
|
'(("lab" "labe" "label"
|
|
) font-lock-reference-face t)
|
|
"[ \t]+"
|
|
'((
|
|
"da" "dat" "data"
|
|
"de" "def" "defi" "defin" "define"
|
|
"di" "dir"
|
|
"drop"
|
|
"l" "li" "lis" "list"
|
|
"save"
|
|
"val" "valu" "value" "values"
|
|
"var" "vari" "varia" "variab" "variabl" "variable"
|
|
) font-lock-type-face nil t t)
|
|
"[ \t]"
|
|
))
|
|
|
|
;; all Stata data-altering stuff
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\b"
|
|
'((
|
|
"_pctile" "_predict"
|
|
"aorder" "append"
|
|
"bcskew0" "bsample" "bs" "bstrap"
|
|
"cd" "chdir" "clear" "compress"
|
|
"contract" "convert" "cross"
|
|
"dec" "deco" "decod" "decode"
|
|
"discard" "drop" "dydx"
|
|
"ed" "edi" "edit" "egen"
|
|
"en" "enc" "enco" "encod" "encode"
|
|
"erase"
|
|
"expand"
|
|
"fillin"
|
|
"form" "forma" "format"
|
|
"fracgen" "fracpred"
|
|
"g" "ge" "gen" "gene" "gener" "genera" "generat" "generate"
|
|
"gsort"
|
|
"impute"
|
|
"infile" "infix" "input" "insheet" "integ" "ipolate"
|
|
"joinby"
|
|
"keep"
|
|
"lnskew0"
|
|
) font-lock-keyword-face)
|
|
"\\b"
|
|
))
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\b"
|
|
'((
|
|
"mark" "markout" "marksample"
|
|
"matname"
|
|
"mer" "merg" "merge"
|
|
"mkdir" "mkmat" "mkspline"
|
|
"mleval" "mlmatsum" "mlsum""mlvecsum"
|
|
"modify" "mov" "move"
|
|
"mvdecode" "mvencode" "nlpred" "nobreak" "order"
|
|
"ou" "out" "outf" "outfi" "outfil" "outfile"
|
|
"outs" "outsh" "outshe" "outshee" "outsheet"
|
|
"pctile"
|
|
"post" "postclose" "postfile"
|
|
"pre" "pred" "predi" "predic" "predict"
|
|
"preserve" "range"
|
|
"recast" "recode"
|
|
"ren" "rena" "renam" "rename"
|
|
"renpfix" "replace" "restore" "rm"
|
|
"sappend"
|
|
"sa" "sav" "save"
|
|
"sample" "sdrop"
|
|
"separate"
|
|
"simul" "sinfile" "smerge"
|
|
"smooth" "snapspan"
|
|
"so" "sor" "sort"
|
|
"ssave" "ssort" "stack"
|
|
"stbase" "stfill" "stgen" "stjoin" "stsplit" "sttocc" "sttoct"
|
|
"suse" "svmat"
|
|
"tsfill" "tsrevar"
|
|
"u" "us" "use"
|
|
"xi" "xi:" "xtile" "xpose"
|
|
"xtdata" "xtpred"
|
|
) font-lock-keyword-face)
|
|
"\\b"
|
|
))
|
|
|
|
;; assignment of macros
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]*"
|
|
'(("global" "local" "scalar"
|
|
) font-lock-reference-face)
|
|
'(("\\([ \t]+[a-zA-Z_]+[a-zA-Z_0-9]*\\b\\)?"
|
|
) font-lock-variable-name-face t)
|
|
))
|
|
;; choosing temp names
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"^[ \t]*"
|
|
'(("tempname" "tempfile" "tempvar"
|
|
) font-lock-reference-face)
|
|
'(("\\([ \t]+[a-zA-Z_]+[a-zA-Z_0-9`']*\\)+"
|
|
) font-lock-type-face t)
|
|
))
|
|
;; all variable/macro stuff (put late so it will override)
|
|
;; internal constants
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[^a-zA-Z]"
|
|
'(("_merge" "_n" "_pi" "_rc" "_N"
|
|
) font-lock-variable-name-face)
|
|
"[^a-zA-Z]"
|
|
))
|
|
;; some generated vars
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("_result([1-9]+)"
|
|
) font-lock-variable-name-face)
|
|
))
|
|
;; global macros
|
|
(eval-when-compile
|
|
(make-regexps
|
|
'(("\\$[a-zA-Z_*]+[a-zA-Z_0-9]*"
|
|
) font-lock-variable-name-face t)
|
|
))
|
|
;; local macros
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"`+"
|
|
'(("[a-zA-Z_`*]+[a-zA-Z_0-9]*" ;has glitch interior ` is highlighted
|
|
) font-lock-variable-name-face t)
|
|
"'+"
|
|
))
|
|
;; other macro commands
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]*"
|
|
'((
|
|
"ma" "mac" "macr" "macro"
|
|
) font-lock-reference-face)
|
|
"[ \t]+"
|
|
'((
|
|
"de" "def" "define"
|
|
"di" "dir"
|
|
"drop"
|
|
"l" "li" "lis" "list"
|
|
"s" "sh" "shi" "shif" "shift"
|
|
)
|
|
font-lock-type-face)
|
|
"[ \t]+"
|
|
))
|
|
;; stata 'functions' i.e. things which require () after them
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\b"
|
|
'(("_caller"
|
|
"abs" "acos" "asin" "atan" "autocode"
|
|
"Binomial"
|
|
"binorm"
|
|
"chiprob" "comb" "cond" "cos"
|
|
"d" "date" "digamma" "day"
|
|
"dofh" "dofm" "dofq" "dofw" "dofy" "dow" "doy"
|
|
"e" "exp"
|
|
"float" "fprob" "gammap" "get" "group"
|
|
"h" "halfyear" "halfyearly" "hofd"
|
|
"ibeta" "index" "int"
|
|
"invbinomial" "invchi" "invfprob" "invgammap" "invnchi" "invnorm" "invt"
|
|
"length" "ln" "lnfact" "lngamma" "log" "log10" "lower" "ltrim"
|
|
"m" "matrix" "max" "mdy" "min" "missing" "mod" "mofd" "month" "monthly"
|
|
"nchi" "normd" "normprob" "npnchi"
|
|
"q" "qofd" "quarter" "quarterly"
|
|
"r" "real" "recode" "reldif" "replay" "return" "round" "rtrim"
|
|
"s" "scalar" "sign" "sin" "sqrt" "string" "substr" "sum"
|
|
"tan" "tprob" "trigamma" "trim"
|
|
"uniform" "uniform0" "upper"
|
|
"w" "week" "weekly" "wofd"
|
|
"y" "year" "yearly" "yh" "ym" "yofd" "yq" "yw"
|
|
)
|
|
font-lock-reference-face t)
|
|
"("
|
|
))
|
|
;; stata 'functions' i.e. things which require [] after them
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"\\b"
|
|
'(("_b" "_coef" "_se")
|
|
font-lock-reference-face t)
|
|
"\\["
|
|
))
|
|
;; common Stata options which require a () after them
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[, \t]+"
|
|
'(("bands" "by" "connect" "density" "gap" "iterate" "ltolerance" "margin"
|
|
"psize" "saving" "tlabel" "tolerance"
|
|
"xlabel" "xscale" "ylabel" "yscale")
|
|
font-lock-type-face t)
|
|
"("
|
|
))
|
|
;; egen 'function' options
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]*egen[ \t]+.*=[ \t]*"
|
|
'(("count" "diff" "fill" "group" "iqr"
|
|
"ma" "max" "mean" "median" "min" "mtr" "pctile"
|
|
"rank" "rfirst" "rlast" "rmax" "rmean" "rmin" "rmiss" "robs" "rsd" "rsum"
|
|
"sd" "std" "sum")
|
|
font-lock-reference-face t)
|
|
"(.*)"
|
|
))
|
|
;; All Custom ado files which are 'reliable' and which are not file killers
|
|
;; this might be a useless endeavor --- but I cannot generate tag files
|
|
;; all the s-extensions are listed under Stata's name (since they alter
|
|
;; data and will be moved to the utils directory
|
|
(eval-when-compile
|
|
(make-regexps
|
|
"[ \t]*"
|
|
'(("addnote" "anypath" "autolab" "checkvar" "ck1icd9" "ckicd9"
|
|
"datetoe" "dattomdy" "den2dem" "dishis" "dtapath" "dupclean" "echo"
|
|
"exdupbil" "ezip2hsa" "getdate" "getlbl" "getnames" "getobs" "gplur"
|
|
"icd9" "issorted" "isfile" "jultoe" "jultof" "jultomdy" "knowndup"
|
|
"labeldir" "linker"
|
|
"markit" "makewide" "missize" "mpcounts"
|
|
"nodups" "notefile" "prov2zip"
|
|
"qcolsum" "qorder"
|
|
"random" "readraw" "readzip" "repart"
|
|
"setup" "stdrate"
|
|
"timeslot"
|
|
"wdatetoe" "wdatomdy" "zip2ezip"
|
|
"_addext" "_brclean" "_brckado" "_brdlog"
|
|
"_ckbad" "_ckdunno" "_ckdupl" "_ckmiss" "_ckok" "_ckwarn"
|
|
"_delimit" "_filenm" "_lookup" "_mk_ck"
|
|
) font-lock-function-name-face)
|
|
"\\b"
|
|
))
|
|
))
|
|
|
|
|
|
(defvar ess-STA-mode-font-lock-defaults (ado-set-font-lock-keywords)
|
|
"Set the Stata mode font-lock keywords to Bill Rising's ado-mode keywords.")
|
|
|
|
(defvar STA-editing-alist
|
|
'((paragraph-start . (concat "[ \t\f]*$\\|" page-delimiter))
|
|
(paragraph-separate . (concat "[ \t\f]*$\\|" page-delimiter))
|
|
(paragraph-ignore-fill-prefix . t)
|
|
(comment-column . 40)
|
|
;;(comment-indent-function . 'S-comment-indent)
|
|
;;(ess-comment-indent . 'S-comment-indent)
|
|
;;(ess-calculate-indent . 'ess-calculate-indent)
|
|
(ess-local-process-name . nil)
|
|
;;(ess-keep-dump-files . 'ask)
|
|
(font-lock-defaults . '(ess-STA-mode-font-lock-defaults
|
|
nil nil ((?\. . "w")))))
|
|
"General options for editing Stata do and ado source files.")
|
|
|
|
;; YOU USED TO HAVE TO (with Thomas's version):
|
|
;;;;; Add the following to your .emacs file
|
|
;;
|
|
;;(autoload 'stata "~/ess-sta-l.el" "inferior stata mode" t )
|
|
;;(autoload 'stata-help "stata" "stata help mode" t)
|
|
;;(autoload 'stata-mode "~/ess-sta-l.el" "stata mode" t)
|
|
;;
|
|
;;(if (assoc "\\.do$" auto-mode-alist) nil
|
|
;; (setq auto-mode-alist
|
|
;; (append
|
|
;; '(("\\.do$" . stata-mode)
|
|
;; ("\\.ado$" . stata-mode))
|
|
;; auto-mode-alist)))
|
|
;;
|
|
|
|
|
|
;; QUESTIONS TO ASK THOMAS:
|
|
;; 1 - are 'help' and 'lookup' the same?
|
|
;; 2 - what is the point of the review buffer?
|
|
;; 3 - how to quit?
|
|
|
|
;;
|
|
;; NOTE: all of Thomas's functions have been left here, to be removed
|
|
;; or merged into real locations as we work on this.
|
|
;;
|
|
|
|
|
|
;;;;;;;;; Things to change
|
|
|
|
(defvar stata-switches "-q"
|
|
"Switches to apply to stata invocation.")
|
|
|
|
(defvar stata-profile "~/.stataprofile"
|
|
"File to read on startup (nil for no file).")
|
|
|
|
(define-obsolete-function-alias 'stata-help 'ess-display-help-on-object "ESS[15.09]")
|
|
(define-obsolete-function-alias 'stata-lookup 'ess-display-help-apropos "ESS[16.03]")
|
|
|
|
;; fixme? Hook this on C-c C-s /ess-execute-search does an R search() right now/
|
|
(defun stata-variables ()
|
|
"Stata variable list in other buffer."
|
|
(interactive)
|
|
(let* ((stata-process (get-process "stata"))
|
|
(stata-buffer (if stata-process
|
|
(process-buffer stata-process)
|
|
(error "Stata is not running.")))
|
|
oldpf oldpb oldpm)
|
|
(set-buffer stata-buffer)
|
|
(setq oldpf (process-filter stata-process))
|
|
(setq oldpb (process-buffer stata-process))
|
|
(setq oldpm (marker-position (process-mark stata-process)))
|
|
(save-excursion
|
|
(if stata-process nil (error "Stata is not running."))
|
|
(beginning-of-line)
|
|
(if (looking-at ". ") nil (error "Stata not ready."))
|
|
(save-excursion
|
|
(set-process-buffer stata-process
|
|
(get-buffer-create "*stata variables*"))
|
|
(set-process-filter stata-process 'inferior-ess-ordinary-filter)
|
|
(set-buffer "*stata variables*")
|
|
(setq buffer-read-only nil)
|
|
(erase-buffer)
|
|
(process-send-string stata-process "desc \n ")
|
|
(stata-prompt-wait stata-process)
|
|
(setq buffer-read-only t)
|
|
(set-buffer stata-buffer)
|
|
(set-process-buffer stata-process oldpb)
|
|
(set-marker (process-mark stata-process) oldpm)
|
|
(set-process-filter stata-process oldpf)))
|
|
(display-buffer "*stata variables*")
|
|
(goto-char (point-max))))
|
|
|
|
(defun stata-prompt-wait (proc &optional start-of-output)
|
|
"Wait for a prompt to appear at BOL of current buffer.
|
|
PROC is the stata process. Does not change point."
|
|
(if start-of-output nil (setq start-of-output (point-min)))
|
|
(save-excursion
|
|
(while (progn
|
|
;; get output if there is some ready
|
|
(accept-process-output proc 0 50)
|
|
(goto-char (marker-position (process-mark proc)))
|
|
(beginning-of-line)
|
|
(if (< (point) start-of-output) (goto-char start-of-output))
|
|
(not (looking-at "^. "))))))
|
|
|
|
(cl-defmethod ess--help-major-mode (&context (ess-dialect "stata"))
|
|
(ess-stata-help-mode))
|
|
|
|
(define-derived-mode ess-stata-help-mode ess-help-mode "Stata help"
|
|
"Major mode for displaying Stata help in a read-only buffer.
|
|
Active commands are Help (\\[stata-help]) and hyperlink
|
|
(\\[stata-rehelp] or mouse-2)."
|
|
:group 'ess-Stata)
|
|
|
|
;;; Suggested function from Brendan Halpin:
|
|
(defvar ess-STA-delimit-do-file "delimit-do.do")
|
|
|
|
(defun ess-STA-delimit-do ()
|
|
(save-excursion
|
|
(let ((commands (buffer-substring-no-properties (region-beginning)
|
|
(region-end))))
|
|
(set-buffer (get-buffer-create ess-STA-delimit-do-file))
|
|
(delete-region (point-min) (point-max))
|
|
(insert "#delimit ;\n"
|
|
commands
|
|
"\n#delimit cr\n")
|
|
(write-file ess-STA-delimit-do-file nil)
|
|
(comint-send-string "Stata"
|
|
(format "do %s \n" ess-STA-delimit-do-file)))))
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
(provide 'ess-stata-lang)
|
|
|
|
;;; ess-stata-lang.el ends here
|