[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