From b2ad70b67bb8760a53192322a351b3c8d7376c64 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 2 Jan 2010 14:40:59 -0500 Subject: [PATCH] Allow use of "end" keyword for terminating Octave-mode blocks. * 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. --- lisp/ChangeLog | 8 ++++++++ lisp/progmodes/octave-mod.el | 28 ++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 965d4780ae2..a6ca9dd4dde 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2010-01-02 Daniel Elliott (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 * bookmark.el: Consistently put the text property on the bookmark name. diff --git a/lisp/progmodes/octave-mod.el b/lisp/progmodes/octave-mod.el index 7f09d83399b..5c5e9851dcb 100644 --- a/lisp/progmodes/octave-mod.el +++ b/lisp/progmodes/octave-mod.el @@ -101,11 +101,9 @@ All Octave abbrevs start with a grave accent (`)." '("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 @@ -342,17 +340,15 @@ newline or semicolon after an else or end keyword." (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.") @@ -680,7 +676,10 @@ level." (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))) @@ -702,6 +701,15 @@ level." (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) -- 2.39.2