Subject: bug#1407: end keyword bug

From: dan <[email-masked]>
Date: Tue, 16 Dec 2008 14:10:03 -0800 (PST)

Hello.

Here is my suggested fix for this problem.  It has the negative aspect
of identifying all end keywords between parens as not block-ending
keywords.  However, I doubt that is a problem.

I've used this for a couple days and everything seems fine.  I'm also
not certain if we can add end as a valid keyword for things in the
octave-block-match-alist.

- dan elliott

--- octave-mod.bak.el   2008-12-16 14:35:14.000000000 -0700
+++ octave-mod.el       2008-12-16 14:45:53.000000000 -0700
@@ -101,11 +101,9 @@
   '("do" "for" "function" "if" "switch" "try" "unwind_protect"
"while"))
 (defvar octave-else-keywords
   '("case" "catch" "else" "elseif" "otherwise"
"unwind_protect_cleanup"))
-;; FIXME: only use specific "end" tokens here to avoid confusion when
"end"
-;; is used in indexing (the real fix is much more complex).
 (defvar octave-end-keywords
   '("endfor" "endfunction" "endif" "endswitch" "end_try_catch"
-    "end_unwind_protect" "endwhile" "until"))
+    "end_unwind_protect" "endwhile" "until" "end"))

 (defvar octave-reserved-words
   (append octave-begin-keywords
@@ -346,13 +344,13 @@
 ;; is used in indexing (the real fix is much more complex).
 (defvar octave-block-match-alist
   '(("do" . ("until"))
-    ("for" . ("endfor"))
+    ("for" . ("endfor" "end"))
     ("function" . ("endfunction"))
-    ("if" . ("else" "elseif" "endif"))
-    ("switch" . ("case" "otherwise" "endswitch"))
+    ("if" . ("else" "elseif" "endif" "end"))
+    ("switch" . ("case" "otherwise" "endswitch" "end"))
     ("try" . ("catch" "end_try_catch"))
     ("unwind_protect" . ("unwind_protect_cleanup"
"end_unwind_protect"))
-    ("while" . ("endwhile")))
+    ("while" . ("endwhile" "end")))
   "Alist with Octave's matching block keywords.
 Has Octave's begin keywords as keys and a list of the matching else
or
 end keywords as associated values.")
@@ -680,7 +678,8 @@
                        (if (= bot (point))
                            (setq icol (+ icol octave-block-offset))))
                       ((octave-looking-at-kw octave-block-end-regexp)
-                       (if (not (= bot (point)))
+                       (if (and (not (= bot (point)))
+                                (not (octave-end-as-array-index-
p))) ;special case for end keyword but is applied to all keywords
                            (setq icol (- icol
                                          (octave-block-end-
offset)))))))
                  (forward-char)))
@@ -1525,3 +1524,14 @@

 ;; arch-tag: 05f1ce09-be87-4c00-803e-4919ffa26c23
 ;;; octave-mod.el ends here
+
+
+;; TODO: this should probably also make sure we are actually looking
at and "end" keyword
+(defun octave-end-as-array-index-p ()
+  "pos is the position of the end keyword (end 'e', 'n', or 'd')"
+  (save-excursion
+    (condition-case nil                        ;test if point is
between parens
+       (progn
+         (up-list 1)
+         t)
+      (error nil))))

On Dec 10, 10:12 am, "Daniel Elliott" <[email-masked]>
wrote:
> I would say that this is definately not fixed.  Now the octave mode no
> longer considers end to be a valid keyword to end blocks like if,
> while, for, etc.  Octave mode should allow end to close these things
> in the same way that it uses endif, endwhile, and endfor respectively.
>
> Thanks.
>
> - dan
>
> On Mon, Nov 24, 2008 at 1:55 AM, Emacs bug Tracking System
>
> <[email-masked]> wrote:
>
> > This is an automatic notification regarding your bug report
> > which was filed against the emacs,octave package:
>
> > #1407: end keyword bug
>
> > It has been closed by Glenn Morris <[email-masked]>.
>
> > Their explanation is attached below along with your original report.
> > If this explanation is unsatisfactory and you have not received a
> > better one in a separate message then please contact Glenn Morris <[email-masked]> by
> > replying to this email.
>
> > --
> > 1407:http://debbugs.gnu.org/cgi/bugreport.cgi?bug=1407
> > Emacs Bug Tracking System
> > Contact [email-masked] with problems
>
> > ---------- Forwarded message ----------
> > From: Glenn Morris <[email-masked]>
> > To: Juanma Barranquero <[email-masked]>
> > Date: Mon, 24 Nov 2008 02:45:00 -0500
> > Subject: Re: bug#1407: end keyword bug
> > "Juanma Barranquero" wrote:
>
> >> Does this problem still happen with the latest Emacs code from the
> >> CVS? Apparently it was fixed some time ago.
>
> > My mistake; I forwarded what I thought was an old unanswered bug, but
> > you are right, it is fixed. (I was thinking it was about font-lock
> > rather than indentation.)
>
> > ---------- Forwarded message ----------
> > From: "Daniel Elliott" <[email-masked]>
> > To: [email-masked]
> > Date: Fri, 26 Oct 2007 02:35:06 +0000
> > Subject: end keyword bug
> > Package: emacs,octave
>
> > [ resent from
> >  http://lists.gnu.org/archive/html/bug-gnu-emacs/2007-10/msg00166.html]
>
> > Hello,
>
> > Thank you for your work on the emacs octave-mode!
>
> > Has the incorrect indentation when the end keyword is used as an array
> > index been fixed?  Currently, any use of end other than to close a
> > loop or conditional block confuses the indentation of octave-mode.
>
> > Example:
>
> > for c=1:C
> >    Lambda(lastGood_Lambda(c)+1:end,c) = sigma;D_c(c) = M;
> >  endfor
>
> > The octave-mode thinks that the end used as an array index is the end
> > for the for loop.
>
> > If this has been fixed, where should I download the latest, fixed,
> > stable version?
>
> > Thank you,
>
> > dan elliott