summaryrefslogtreecommitdiff
path: root/lisp/progmodes
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2010-01-02 14:40:59 -0500
committerChong Yidong <cyd@stupidchicken.com>2010-01-02 14:40:59 -0500
commitb2ad70b67bb8760a53192322a351b3c8d7376c64 (patch)
treefc6be6723a390bfc42be94f4d79f18c4d21de162 /lisp/progmodes
parent61f49e0bb661c3adbcc088bfc23a2e759561099f (diff)
downloademacs-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.el28
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)