[ESS-bugs] forwarded message from Jeffrey Arnold

Martin Maechler maechler at stat.math.ethz.ch
Fri Apr 9 15:31:29 CEST 2010


This was accidentally sent to ESS-bugs-owner at ...
the mailbox of the ESS-bugs mailing list manager;
not something I read daily.

The patch looks fairly comprehensive,
but as I'm not using  "#!... Rscript or "littler" scripts,
I'd be happy for someone else to test this.


Martin Maechler

------- start of forwarded message -------
Return-Path: <mailman-bounces at stat.math.ethz.ch>
MIME-Version: 1.0
In-Reply-To: <mailman.3619.1270546701.4248.ess-bugs at stat.math.ethz.ch>
References: <mailman.3619.1270546701.4248.ess-bugs at stat.math.ethz.ch>
Message-ID: <t2z3c9b41e1004060802lcc077e61g89f01a869f171a1f at mail.gmail.com>
Errors-To: mailman-bounces at stat.math.ethz.ch
From: Jeffrey Arnold <jarnold7 at mail.rochester.edu>
Sender: mailman-bounces at stat.math.ethz.ch
To: ess-bugs-owner at stat.math.ethz.ch
Subject: Re: Patch: correctly indent #! and recognize Rscript
Date: Tue, 6 Apr 2010 11:02:12 -0400


Hi, sorry about the earlier blank message.

I noticed that ess S-mode had a few problems in its handling of R scripts
that use the Rscript or littler interpreters: (1) ess-fancy-comments did not
recognize the shebang and indented it as a '#' comment, and (2) R scripts
that did not use end in an extension but had Rscript or littler as the
interpreter after the shabang.  I attached a svn patch that adds the Rscript
and littler interpreters to the interpreter-mode-alist variable and changes
the ess-indent-line and S-indent-line functions to recognize the shebang.

Thank you for all your work on ess.

Jeff
------------------------------
Jeffrey Arnold
Department of Political Science
University of Rochester
jarnold7 at mail.rochester.edu
jeffrey.arnold at gmail.com

Index: lisp/ess-mode.el
===============================================================
--- lisp/ess-mode.el    (revision 4284)
+++ lisp/ess-mode.el    (working copy)
@@ -927,7 +927,8 @@ of the expression are preserved."
 ;;;*;;; Support functions for indentation

 (defun ess-comment-indent ()
-  (if (looking-at "###")
+  (if (or (looking-at "###")
+      (and (looking-at "#!") (= 1 (line-number-at-pos))))
       (current-column)
     (if (looking-at "##")
     (let ((tem (ess-calculate-indent)))
@@ -949,25 +950,27 @@ Return the amount the indentation changed by."
        (setq indent (current-indentation)))
       (t
        (skip-chars-forward " \t")
-       (if (and ess-fancy-comments (looking-at "###"))
-           (setq indent 0))
-       (if (and ess-fancy-comments
-            (looking-at "#")
-            (not (looking-at "##")))
-           (setq indent comment-column)
-         (if (eq indent t) (setq indent 0))
-         (if (listp indent) (setq indent (car indent)))
-         (cond ((and (looking-at "else\\b")
-             (not (looking-at "else\\s_")))
-            (setq indent (save-excursion
-                   (ess-backward-to-start-of-if)
-                   (+ ess-else-offset (current-indentation)))))
-           ((= (following-char) ?})
-            (setq indent
-              (+ indent
-                 (- ess-close-brace-offset ess-indent-level))))
-           ((= (following-char) ?{)
-            (setq indent (+ indent ess-brace-offset)))))))
+       (cond ((and ess-fancy-comments  ;; ### or #! shebang
+               (or (looking-at "###")
+               (and (looking-at "#!") (= 1 (line-number-at-pos)))))
+          (setq indent 0))
+         ;; Single # comment
+         ((and ess-fancy-comments (looking-at "#") (not (looking-at "##")))
+          (setq indent comment-column))
+         (t
+          (if (eq indent t) (setq indent 0))
+          (if (listp indent) (setq indent (car indent)))
+          (cond ((and (looking-at "else\\b")
+                  (not (looking-at "else\\s_")))
+             (setq indent (save-excursion
+                    (ess-backward-to-start-of-if)
+                    (+ ess-else-offset (current-indentation)))))
+            ((= (following-char) ?})
+             (setq indent
+                   (+ indent
+                  (- ess-close-brace-offset ess-indent-level))))
+            ((= (following-char) ?{)
+             (setq indent (+ indent ess-brace-offset))))))))
     (skip-chars-forward " \t")
     (setq shift-amt (- indent (current-column)))
     (if (zerop shift-amt)
Index: lisp/ess-s-l.el
===============================================================
--- lisp/ess-s-l.el    (revision 4284)
+++ lisp/ess-s-l.el    (working copy)
@@ -254,8 +254,8 @@ when \\[ess-toggle-S-assign-key] is called.")

 (defun S-comment-indent ()
   "Indentation for S comments."
-
-  (if (looking-at "###")
+  (if (or (looking-at "###")
+      (and (looking-at "#!") (= 1 (line-number-at-pos))))
       (current-column)
     (if (looking-at "##")
     (let ((tem (S-calculate-indent)))
@@ -277,25 +277,29 @@ Return the amount the indentation changed by."
        (setq indent (current-indentation)))
       (t
        (skip-chars-forward " \t")
-       (if (and ess-fancy-comments (looking-at "###"))
-           (setq indent 0))
-       (if (and ess-fancy-comments
-            (looking-at "#")
-            (not (looking-at "##")))
-           (setq indent comment-column)
-         (if (eq indent t) (setq indent 0))
-         (if (listp indent) (setq indent (car indent)))
-         (cond ((and (looking-at "else\\b")
-             (not (looking-at "else\\s_")))
-            (setq indent (save-excursion
-                   (ess-backward-to-start-of-if)
-                   (+ ess-else-offset (current-indentation)))))
-           ((= (following-char) ?})
-            (setq indent
-              (+ indent
-                 (- ess-close-brace-offset ess-indent-level))))
-           ((= (following-char) ?{)
-            (setq indent (+ indent ess-brace-offset)))))))
+       (cond ((and ess-fancy-comments  ;; ### or #!
+               (or (looking-at "###")
+               (and (looking-at "#!") (= 1 (line-number-at-pos)))))
+          (setq indent 0))
+         ;; Single # comment
+         ((and ess-fancy-comments (looking-at "#") (not (looking-at "##")))
+          (setq indent comment-column))
+         (t
+          (if (eq indent t)
+              (setq indent 0))
+          (if (listp indent)
+              (setq indent (car indent)))
+          (cond ((and (looking-at "else\\b")
+                  (not (looking-at "else\\s_")))
+             (setq indent (save-excursion
+                    (ess-backward-to-start-of-if)
+                    (+ ess-else-offset (current-indentation)))))
+            ((= (following-char) ?})
+             (setq indent
+                   (+ indent
+                  (- ess-close-brace-offset ess-indent-level))))
+            ((= (following-char) ?{)
+             (setq indent (+ indent ess-brace-offset))))))))
     (skip-chars-forward " \t")
     (setq shift-amt (- indent (current-column)))
     (if (zerop shift-amt)
Index: lisp/ess-site.el
===============================================================
--- lisp/ess-site.el    (revision 4284)
+++ lisp/ess-site.el    (working copy)
@@ -259,6 +259,14 @@ between .s or .S files and assembly mode.
           )
      auto-mode-alist)))

+;; Rscript and littler interpreters recognized
+(setq interpreter-mode-alist
+      (append
+       '(("Rscript" . r-mode)
+     ("r" . r-mode)
+     )
+       interpreter-mode-alist))
+
 ;; (1.4) Customize the dialects for your setup.

 ;;; AS OF ESS 5.1.14, if you are using Emacs 20.x, x>3, or XEmacs
Index: lisp/ess-mode.el
===============================================================
--- lisp/ess-mode.el    (revision 4284)
+++ lisp/ess-mode.el    (working copy)
@@ -927,7 +927,8 @@ of the expression are preserved."
 ;;;*;;; Support functions for indentation

 (defun ess-comment-indent ()
-  (if (looking-at "###")
+  (if (or (looking-at "###")
+      (and (looking-at "#!") (= 1 (line-number-at-pos))))
       (current-column)
     (if (looking-at "##")
     (let ((tem (ess-calculate-indent)))
@@ -949,25 +950,27 @@ Return the amount the indentation changed by."
        (setq indent (current-indentation)))
       (t
        (skip-chars-forward " \t")
-       (if (and ess-fancy-comments (looking-at "###"))
-           (setq indent 0))
-       (if (and ess-fancy-comments
-            (looking-at "#")
-            (not (looking-at "##")))
-           (setq indent comment-column)
-         (if (eq indent t) (setq indent 0))
-         (if (listp indent) (setq indent (car indent)))
-         (cond ((and (looking-at "else\\b")
-             (not (looking-at "else\\s_")))
-            (setq indent (save-excursion
-                   (ess-backward-to-start-of-if)
-                   (+ ess-else-offset (current-indentation)))))
-           ((= (following-char) ?})
-            (setq indent
-              (+ indent
-                 (- ess-close-brace-offset ess-indent-level))))
-           ((= (following-char) ?{)
-            (setq indent (+ indent ess-brace-offset)))))))
+       (cond ((and ess-fancy-comments  ;; ### or #! shebang
+               (or (looking-at "###")
+               (and (looking-at "#!") (= 1 (line-number-at-pos)))))
+          (setq indent 0))
+         ;; Single # comment
+         ((and ess-fancy-comments (looking-at "#") (not (looking-at "##")))
+          (setq indent comment-column))
+         (t
+          (if (eq indent t) (setq indent 0))
+          (if (listp indent) (setq indent (car indent)))
+          (cond ((and (looking-at "else\\b")
+                  (not (looking-at "else\\s_")))
+             (setq indent (save-excursion
+                    (ess-backward-to-start-of-if)
+                    (+ ess-else-offset (current-indentation)))))
+            ((= (following-char) ?})
+             (setq indent
+                   (+ indent
+                  (- ess-close-brace-offset ess-indent-level))))
+            ((= (following-char) ?{)
+             (setq indent (+ indent ess-brace-offset))))))))
     (skip-chars-forward " \t")
     (setq shift-amt (- indent (current-column)))
     (if (zerop shift-amt)
Index: lisp/ess-s-l.el
===============================================================
--- lisp/ess-s-l.el    (revision 4284)
+++ lisp/ess-s-l.el    (working copy)
@@ -254,8 +254,8 @@ when \\[ess-toggle-S-assign-key] is called.")

 (defun S-comment-indent ()
   "Indentation for S comments."
-
-  (if (looking-at "###")
+  (if (or (looking-at "###")
+      (and (looking-at "#!") (= 1 (line-number-at-pos))))
       (current-column)
     (if (looking-at "##")
     (let ((tem (S-calculate-indent)))
@@ -277,25 +277,29 @@ Return the amount the indentation changed by."
        (setq indent (current-indentation)))
       (t
        (skip-chars-forward " \t")
-       (if (and ess-fancy-comments (looking-at "###"))
-           (setq indent 0))
-       (if (and ess-fancy-comments
-            (looking-at "#")
-            (not (looking-at "##")))
-           (setq indent comment-column)
-         (if (eq indent t) (setq indent 0))
-         (if (listp indent) (setq indent (car indent)))
-         (cond ((and (looking-at "else\\b")
-             (not (looking-at "else\\s_")))
-            (setq indent (save-excursion
-                   (ess-backward-to-start-of-if)
-                   (+ ess-else-offset (current-indentation)))))
-           ((= (following-char) ?})
-            (setq indent
-              (+ indent
-                 (- ess-close-brace-offset ess-indent-level))))
-           ((= (following-char) ?{)
-            (setq indent (+ indent ess-brace-offset)))))))
+       (cond ((and ess-fancy-comments  ;; ### or #!
+               (or (looking-at "###")
+               (and (looking-at "#!") (= 1 (line-number-at-pos)))))
+          (setq indent 0))
+         ;; Single # comment
+         ((and ess-fancy-comments (looking-at "#") (not (looking-at "##")))
+          (setq indent comment-column))
+         (t
+          (if (eq indent t)
+              (setq indent 0))
+          (if (listp indent)
+              (setq indent (car indent)))
+          (cond ((and (looking-at "else\\b")
+                  (not (looking-at "else\\s_")))
+             (setq indent (save-excursion
+                    (ess-backward-to-start-of-if)
+                    (+ ess-else-offset (current-indentation)))))
+            ((= (following-char) ?})
+             (setq indent
+                   (+ indent
+                  (- ess-close-brace-offset ess-indent-level))))
+            ((= (following-char) ?{)
+             (setq indent (+ indent ess-brace-offset))))))))
     (skip-chars-forward " \t")
     (setq shift-amt (- indent (current-column)))
     (if (zerop shift-amt)
Index: lisp/ess-site.el
===============================================================
--- lisp/ess-site.el    (revision 4284)
+++ lisp/ess-site.el    (working copy)
@@ -259,6 +259,14 @@ between .s or .S files and assembly mode.
           )
      auto-mode-alist)))

+;; Rscript and littler interpreters recognized
+(setq interpreter-mode-alist
+      (append
+       '(("Rscript" . r-mode)
+     ("r" . r-mode)
+     )
+       interpreter-mode-alist))
+
 ;; (1.4) Customize the dialects for your setup.

 ;;; AS OF ESS 5.1.14, if you are using Emacs 20.x, x>3, or XEmacs


On Tue, Apr 6, 2010 at 5:38 AM, <ess-bugs-owner at stat.math.ethz.ch> wrote:

> After content filtering, the message was empty
>
>
>
> ---------- Forwarded message ----------
> From: Jeffrey Arnold <jarnold7 at mail.rochester.edu>
> To: ess-bugs <ess-bugs at stat.math.ethz.ch>
> Date: Sun, 4 Apr 2010 18:00:22 -0400
> Subject: Patch: correctly indent #! and recognize Rscript
>
>

------- end of forwarded message -------



More information about the ESS-bugs mailing list