diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2010-01-02 14:40:59 -0500 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2010-01-02 14:40:59 -0500 |
commit | b2ad70b67bb8760a53192322a351b3c8d7376c64 (patch) | |
tree | fc6be6723a390bfc42be94f4d79f18c4d21de162 /lisp/progmodes | |
parent | 61f49e0bb661c3adbcc088bfc23a2e759561099f (diff) | |
download | emacs-b2ad70b67bb8760a53192322a351b3c8d7376c64.tar.gz |
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.
Diffstat (limited to 'lisp/progmodes')
-rw-r--r-- | lisp/progmodes/octave-mod.el | 28 |
1 files changed, 18 insertions, 10 deletions
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) |