+2010-01-02 Daniel Elliott <danelliottster@gmail.com> (tiny change)
+
+ * progmodes/octave-mod.el (octave-end-keywords)
+ (octave-block-begin-or-end-regexp, octave-block-match-alist): Add
+ "end" keyword (Bug#3061).
+ (octave-end-as-array-index-p): New function.
+ (calculate-octave-indent): Use it.
+
2010-01-02 Karl Fogel <kfogel@red-bean.com>
* bookmark.el: Consistently put the text property on the bookmark name.
'("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
(concat octave-block-begin-regexp "\\|" octave-block-end-regexp))
(defvar octave-block-else-or-end-regexp
(concat octave-block-else-regexp "\\|" octave-block-end-regexp))
-;; 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-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.")
(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)))
+ ;; special case for `end' keyword,
+ ;; applied to all keywords
+ (not (octave-end-as-array-index-p)))
(setq icol (- icol
(octave-block-end-offset)))))))
(forward-char)))
(setq icol (list comment-column icol)))))
icol))
+;; FIXME: this should probably also make sure we are actually looking
+;; at the "end" keyword.
+(defun octave-end-as-array-index-p ()
+ (save-excursion
+ (condition-case nil
+ ;; Check if point is between parens
+ (progn (up-list 1) t)
+ (error nil))))
+
(defun octave-block-end-offset ()
(save-excursion
(octave-backward-up-block 1)