[ESS] font-lock-keywords-case-fold-search in BUGS mode

S. McKay Curtis smcurtis at stat.washington.edu
Mon Mar 9 20:07:58 CET 2009


Hi Rodney,

Thanks for you insights and suggestions.

Regarding the highlighting of "i" when not followed by a "(":

I altered the regular expression for keywords in the essd-bugs.el
file.  The original version would highlight both the keyword and the
following open parenthesis "(".  I changed the regular expression to

   (cons (concat "\\<\\(for\\|cloglog\\|equals\\|exp\\|inprod\\|"
		 "inverse\\|log\\(det\\|fact\\|gam\\|it\\)?\\|max\\|"
		 "mean\\|min\\|phi\\|pow\\|probit\\|sd\\|sqrt\\|"
		 "step\\|sum\\|I\\)\\>")
	 font-lock-function-name-face)

which now only highlights the keywords (and not the opening
parenthesis).  I apologize for not having mentioned this earlier! I
encountered this problem with "font-lock-keywords-case-fold-search" a
while back and have just now decided to submit it to the help (as I
have started working with BUGS again), so I forgot to mention that I
changed this regular expression.

I would think that changing this regular expression should not affect
the ability to set the variable "font-lock-keywords-case-fold-search"
within a hook, though.  I still get the behavior I expect once I
manually set the variable "font-lock-keywords-case-fold-search" to
"nil", but I can't seem to set this value with the ess-bugs-mode-hook.

I should upgrade to the latest version of ESS, though; thanks for
pointing this out.

Again, sorry for any confusion I've caused, Rodney (and Stephen).

Just so I clear up any confusion I may have caused, here is the
complete defvar statement in my essd-bugs.el file (with my
changes---mostly just adding "\\<" and "\\>" to each statement):

(defvar ess-bugs-font-lock-keywords
  (list
   ;; .bug files
   (cons "#.*\n"
	 font-lock-comment-face)

   (cons "^[ \t]*\\<\\(model\\|const\\|data\\|inits\\|var\\)\\>"
	 font-lock-keyword-face)

   (cons "\\<in\\>"
	 font-lock-keyword-face)

   (cons (concat "\\<d\\(bern\\|beta\\|bin\\|cat\\|chisqr\\|"
		 "dexp\\|dirch\\|exp\\|gamma\\|lnorm\\|logis\\|"
		 "mnorm\\|multi\\|negbin\\|norm\\|par\\|pois\\|"
		 "t\\|unif\\|weib\\|wish\\)\\>")
	 font-lock-constant-face)

   (cons (concat "\\<\\(for\\|cloglog\\|equals\\|exp\\|inprod\\|"
		 "inverse\\|log\\(det\\|fact\\|gam\\|it\\)?\\|max\\|"
		 "mean\\|min\\|phi\\|pow\\|probit\\|sd\\|sqrt\\|"
		 "step\\|sum\\|I\\)\\>")
	 font-lock-function-name-face)

   ;; .bmd files
   (cons (concat "\\<\\(clear\\|checkpoint\\|compile\\|data\\|"
		 "diag\\|help\\|inits\\|iter\\|model\\|monitor\\|"
		 "out\\|q\\|save\\|stats\\|update\\)[ \t\n]*")
	 font-lock-function-name-face)
   )
  "ESS[BUGS]: Font lock keywords."
  )

Thanks
McKay

On Mon, Mar 9, 2009 at 11:17 AM, Rodney Sparapani <rsparapa at mcw.edu> wrote:
> S. McKay Curtis wrote:
>>
>> Hi Stephen,
>>
>> Here is the particular file that I am working on:
>>
>> model {
>>        for (i in 1:nS){
>>            for (j in 1:nI){ mn[i,j] <- mu[j] + lam[j]*theta[i] }
>>            Y[i,1:4] ~ dmnorm(mn[i,1:4],Pmat1[,])
>>            Y[i,5:8] ~ dmnorm(mn[i,5:8],Pmat2[,])
>>            }
>>
>>        ##==================================================
>>        ## Priors for latent variables
>>        for (i in 1:nS){ theta[i] ~ dnorm(0,1) }
>>
>>        ##==================================================
>>        ## Loadings and Intercepts
>>        for (j in 1:nI){ lam[j] ~ dnorm(0,1) T(0,) }
>>        for (j in 1:nI){ mu[j] ~ dnorm(0,1) }
>>
>>        ##==================================================
>>        ## Priors for variance parameters
>>        Pmat1[1:4,1:4] ~ dwish(W[,],4)
>>        Sig1[1:4,1:4] <- inverse(Pmat1[,])
>>        Pmat2[1:4,1:4] ~ dwish(W[,],4)
>>        Sig2[1:4,1:4] <- inverse(Pmat2[,])
>>
>> }
>>
>> All keywords (like "for", "dnorm", etc.) are font locked as I would
>> expect them to be, *except* the subscript "i" is also font locked
>> (e.g. in Y[i,1:4]).  This is because "I" (capital i) is defined as a
>> keyword (because it's used in specifying truncated distributions like
>> "dnorm(0,1) I(0,)"), but because "font-lock-keywords-case-fold-search"
>> is set to "t" so the lower case "i" when used as an index is also
>> highlighted.  Similarly, if I were to type "FOR" (all caps) into this
>> buffer, it would also be highlighted.
>>
>> I can get the syntax highlighting that I expect by setting the value
>> of font-lock-keywords-case-fold-search manually ("M-x set-variable
>> [RET] font-lock-keywords-case-fold-search [RET] nil"), but my attempt
>> to add a hook to do this automatically hasn't worked.
>>
>> I am using GNU Emacs 22.3.1 and ESS 5.3.8.
>>
>> Thanks again,
>> McKay
>>
>
> Hi McKay:
>
> Quite frankly, none of this makes any sense.  I do agree that it is
> reminiscent of an Emacs 22.3 bug.  However, to get the behavior
> that you describe, Emacs 22.3 would have to be so horribly broken
> as to be nearly unusable.  For example, you mention that "i"
> is fontified as if it was the censoring function I(.,.).  However,
> that would require a left parentheses to follow the "i" and none
> does.  So, here's two things to try:
>
> 1) upgrade ESS to 5.3.11.  A good idea anyways, but not likely
> to help I'm guessing.
> 2) get rid of Emacs 22.3.  If it is as bad as it sounds, then
> I'm guessing this will fix it.
>
> --
> Rodney Sparapani      Center for Patient Care & Outcomes Research (PCOR)
> Sr. Biostatistician              http://www.mcw.edu/pcor
> 4 wheels good, 2 wheels better!  Medical College of Wisconsin (MCW)
> WWLD?:  What Would Lombardi Do?  Milwaukee, WI, USA
>




More information about the ESS-help mailing list