[ESS-bugs] Font lock bugs in R mode
A.J. Rossini
blindglobe at gmail.com
Wed Feb 15 16:47:59 CET 2006
Thanks for the patch. I'll work on integrating it by next Monday.
On 2/15/06, Ari Kornfeld <ari at perspective.com> wrote:
> Tony, et. al.
>
> Thanks for the reply. The idea of prompt being end-of-string/close
> paren sounds great if it could be made into a "master close," i.e.
> closes all unbalanced parens and quotes. It's well beyond my
> skill/knowledge to do that, unfortunately.
>
> On the other hand,here are all of the changes I made to ess-cust.el in
> diff format. There are three basic changes
>
> (1) Support for Mark Bravington's debug package (for S and R, but I
> only use R): His debugger uses "D(xx)> " as a prompt.
> (1A) Added parens to inferior-ess-primary-prompt, I also changed it in
> essd-r.el, which overrides this variable with a constant.
> The relevant line in essd-r.el is:
> (inferior-ess-primary-prompt . "\\([A-Z][][()A-Za-z0-9.]*\\)*> ")
> This change appears to be necessary for C-a to work correctly.
> (1B) Modified font-lock-keyword-face so that package debug and the
> built-in browse() ("Browse[xx]> ") prompts are fontified.
>
> (2) Added a custom variable, ess-r-TF-is-const, and necessary logic as
> you suggested. If set t, it highlights T and F as constants.
>
> (3) Repositioned keywords so that warnings get fontified properly, as
> we talked about before.
>
> Best regards,
> -ari
>
> diff -c c:\Program Files\XEmacs\ess-5.2.12\lisp\ess-cust-orig.el
> c:\Program Files\XEmacs\ess-5.2.12\lisp\ess-cust.el
> *** c:\Program Files\XEmacs\ess-5.2.12\lisp\ess-cust-orig.el Tue Feb
> 14 23:49:20 2006
> --- c:\Program Files\XEmacs\ess-5.2.12\lisp\ess-cust.el Tue Feb 14
> 23:49:20 2006
> ***************
> *** 1053,1066 ****
> :group 'ess-proc
> :type 'string)
>
> ! (defcustom inferior-ess-primary-prompt "[a-zA-Z0-9() ]*> ?"
> "Regular expression used by `ess-mode' to detect the primary prompt.
> Do not anchor to bol with `^'."
> :group 'ess-proc
> :type 'string)
>
> (make-variable-buffer-local 'inferior-ess-primary-prompt)
> ! (setq-default inferior-ess-primary-prompt "[a-zA-Z0-9() ]*> ?")
>
> (defcustom inferior-ess-secondary-prompt "+ ?"
> "Regular expression used by ess-mode to detect the secondary prompt.
> --- 1053,1070 ----
> :group 'ess-proc
> :type 'string)
>
> ! ;; Ari (JAK) add brackets for "Browse [1]>"?
> ! ;; note: this doesn't affect font lock: see
> inferior-ess-R-font-lock-keywords
> ! ;; note2: for R, at least, this value is ignored, see: essd-r.el
> ! (defcustom inferior-ess-primary-prompt "[][a-zA-Z0-9() ]*> ?"
> "Regular expression used by `ess-mode' to detect the primary prompt.
> Do not anchor to bol with `^'."
> :group 'ess-proc
> :type 'string)
>
> (make-variable-buffer-local 'inferior-ess-primary-prompt)
> ! ; Ari (JAK) add brackets for "Browse [1]>"?
> ! (setq-default inferior-ess-primary-prompt "[][a-zA-Z0-9() ]*> ?")
>
> (defcustom inferior-ess-secondary-prompt "+ ?"
> "Regular expression used by ess-mode to detect the secondary prompt.
> ***************
> *** 1321,1328 ****
> :group 'ess
> :type 'boolean)
>
> (defvar ess-R-constants
> ! '("TRUE" "FALSE" "NA" "NULL" "Inf" "NaN"))
>
> (defvar ess-S-constants
> (append ess-R-constants '("T" "F")))
> --- 1325,1342 ----
> :group 'ess
> :type 'boolean)
>
> + ;; Ari (JAK)
> + (defcustom ess-r-TF-is-const nil
> + "Let font-lock highlight T and F as constants."
> + :group 'ess-R
> + :type 'boolean)
> + ; add this to ~/.xemacs/init.el before loading ess site-init.el
> + ;(setq-default ess-r-TF-is-const t)
> +
> + ; Ari: (JAK) add "T" and "F" since these *are* in R by default
> (defvar ess-R-constants
> ! (append '("TRUE" "FALSE" "NA" "NULL" "Inf" "NaN")
> ! (if ess-r-TF-is-const '("T" "F"))))
>
> (defvar ess-S-constants
> (append ess-R-constants '("T" "F")))
> ***************
> *** 1334,1348 ****
> '("library" "attach" "detach" "source" "require"))
>
> (defvar ess-R-keywords
> ! '("while" "for" "in" "repeat" "if" "else" "switch" "break" "next"
> ! "function" "return" "message" "warning" "stop"))
> (defvar ess-S-keywords
> (append ess-R-keywords '("terminate")))
>
> (defvar ess-R-message-prefixes
> '("Error:" "Error in"
> ! "Warning:" "Warning in"
> ! "Warning messages?"))
> (defvar ess-S-message-prefixes
> (append ess-R-message-prefixes
> '("Syntax error:" "Dumped")))
> --- 1348,1365 ----
> '("library" "attach" "detach" "source" "require"))
>
> (defvar ess-R-keywords
> ! '("while" "for" "repeat" "in" "if" "else" "switch" "break" "next"
> ! "function" "return" "warning" "message" "stop"))
> (defvar ess-S-keywords
> (append ess-R-keywords '("terminate")))
>
> + ;; Ari (JAK): The RE "Warning messages?" does not work.
> + ;; Cut off the "s?" and just added both variations
> + ;; (See also related fix in: ess-R-message-prefixes)
> (defvar ess-R-message-prefixes
> '("Error:" "Error in"
> ! "Warning:" "Warning in" "Warning message"
> ! "Warning messages"))
> (defvar ess-S-message-prefixes
> (append ess-R-message-prefixes
> '("Syntax error:" "Dumped")))
> ***************
> *** 1401,1417 ****
>
>
>
> !
> (defvar inferior-ess-R-font-lock-keywords
> (append
> ! '(("^[a-zA-Z0-9 ]*[>+]" . font-lock-keyword-face)) ; "prompt" must
> be first
>
> (if (not inferior-ess-font-lock-input) ;; don't font-lock input :
> (list (cons "^[a-zA-Z0-9 ]*[>+]\\(.*$\\)"
> '(1 font-lock-variable-name-face keep t))) )
>
> - ess-R-mode-font-lock-keywords
> -
> (list
> (cons "^\\*\\*\\*.*\\*\\*\\*\\s *$" 'font-lock-comment-face);
> ess-mode msg
> (cons "\\[,?[1-9][0-9]*,?\\]"
> 'font-lock-reference-face);Vector/matrix labels
> --- 1418,1436 ----
>
>
>
> ! ;; Ari (JAK) moved location of ess-R-mode-font-lock-keywords
> ! ;; so it doesn't override "Warning message" type of stuff
> ! ;; in ess-R-message-prefixes
> ! ;; + add brackets for "Browse [1]>" used in debug()/browse()
> ! ;; + add parens for package debug: "D(1)>"
> (defvar inferior-ess-R-font-lock-keywords
> (append
> ! '(("^[][()a-zA-Z0-9 ]*[>+]" . font-lock-keyword-face)) ; "prompt"
> must be first
>
> (if (not inferior-ess-font-lock-input) ;; don't font-lock input :
> (list (cons "^[a-zA-Z0-9 ]*[>+]\\(.*$\\)"
> '(1 font-lock-variable-name-face keep t))) )
>
> (list
> (cons "^\\*\\*\\*.*\\*\\*\\*\\s *$" 'font-lock-comment-face);
> ess-mode msg
> (cons "\\[,?[1-9][0-9]*,?\\]"
> 'font-lock-reference-face);Vector/matrix labels
> ***************
> *** 1419,1437 ****
> 'font-lock-reference-face) ; inferior-ess problems or errors
> (cons "#" 'font-lock-comment-face) ; comment
> (cons "^[^#]*#\\(.*$\\)" '(1 font-lock-comment-face keep t)) ;
> comments
> ! ))
> "Font-lock patterns used in inferior-R-mode buffers.")
>
> (defvar inferior-ess-S-font-lock-keywords
> (append
> ! '(("^[a-zA-Z0-9 ]*[>+]" . font-lock-keyword-face)) ; "prompt" must
> be first
>
> (if (not inferior-ess-font-lock-input) ;; don't font-lock input :
> (list (cons "^[a-zA-Z0-9 ]*[>+]\\(.*$\\)"
> '(1 font-lock-variable-name-face keep t))) )
>
> - ess-S-mode-font-lock-keywords
> -
> (list
> (cons "^\\*\\*\\*.*\\*\\*\\*\\s *$" 'font-lock-comment-face) ;
> ess-mode msg
> (cons "\\[,?[1-9][0-9]*,?\\]"
> 'font-lock-reference-face);Vector/matrix labels
> --- 1438,1461 ----
> 'font-lock-reference-face) ; inferior-ess problems or errors
> (cons "#" 'font-lock-comment-face) ; comment
> (cons "^[^#]*#\\(.*$\\)" '(1 font-lock-comment-face keep t)) ;
> comments
> ! )
> ! ess-R-mode-font-lock-keywords
> !
> ! )
> "Font-lock patterns used in inferior-R-mode buffers.")
>
> + ;; Ari (JAK) moved location of ess-S-mode-font-lock-keywords
> + ;; so it doesn't override "Warning message" type of stuff
> + ;; in ess-S-message-prefixes
> + ;; + add parens for package debug: "D(1)>"
> (defvar inferior-ess-S-font-lock-keywords
> (append
> ! '(("^[()a-zA-Z0-9 ]*[>+]" . font-lock-keyword-face)) ; "prompt"
> must be first
>
> (if (not inferior-ess-font-lock-input) ;; don't font-lock input :
> (list (cons "^[a-zA-Z0-9 ]*[>+]\\(.*$\\)"
> '(1 font-lock-variable-name-face keep t))) )
>
> (list
> (cons "^\\*\\*\\*.*\\*\\*\\*\\s *$" 'font-lock-comment-face) ;
> ess-mode msg
> (cons "\\[,?[1-9][0-9]*,?\\]"
> 'font-lock-reference-face);Vector/matrix labels
> ***************
> *** 1439,1445 ****
> 'font-lock-reference-face) ; inferior-ess problems or errors
> (cons "#" 'font-lock-comment-face) ; comment
> (cons "^[^#]*#\\(.*$\\)" '(1 font-lock-comment-face keep t)) ;
> comments
> ! ))
> "Font-lock patterns used in inferior-S-mode buffers.")
>
> ;; use the inferior-* ones directly in ess-trns.el
> --- 1463,1472 ----
> 'font-lock-reference-face) ; inferior-ess problems or errors
> (cons "#" 'font-lock-comment-face) ; comment
> (cons "^[^#]*#\\(.*$\\)" '(1 font-lock-comment-face keep t)) ;
> comments
> ! )
> ! ess-S-mode-font-lock-keywords
> !
> ! )
> "Font-lock patterns used in inferior-S-mode buffers.")
>
> ;; use the inferior-* ones directly in ess-trns.el
>
>
> A.J. Rossini wrote:
> > Please send to the ess-bugs list to keep the rest of the folks
> > informed as well -- I'm not our local font-lock expert, and after a
> > bit of hacking last week, won't have time for a few weeks.
> >
> > As I said, I agreed about the warnings issue, just not the T/F issue.
> > If you can send the examples, we should look into that (the
> > warnings), but by "agreement" I also agree that it isn't a simple
> > problem. Perhaps some form of manual intervention, i.e. noting that
> > a prompt is also a valid "end-of-string", would be the right thing.
> >
> > Also, if you do send the patch I mentioned, then we can put it in, and
> > you don't have to "fix" every release!
> >
> > best,
> > -tony
> >
> >
> >
>
>
--
best,
-tony
blindglobe at gmail.com
Muttenz, Switzerland.
"Commit early,commit often, and commit in a repository from which we can easily
roll-back your mistakes" (AJR, 4Jan05).
More information about the ESS-bugs
mailing list