Emacs support for embedded test/demo scripts, using %!
Paul Kienzle
pkienzle@kienzle.powernet.co.uk
*** emacs/octave-mod.el.orig Tue May 2 19:20:38 2000
--- emacs/octave-mod.el Tue May 2 02:58:06 2000
***************
*** 532,538 ****
(cond
((eq position 'bol) (beginning-of-line))
((eq position 'eol) (end-of-line))
! ((eq position 'boi) (back-to-indentation))
((eq position 'bonl) (forward-line 1))
((eq position 'bopl) (forward-line -1))
(t (error "unknown buffer position requested: %s" position)))
--- 532,538 ----
(cond
((eq position 'bol) (beginning-of-line))
((eq position 'eol) (end-of-line))
! ((eq position 'boi) (octave-back-to-indentation))
((eq position 'bonl) (forward-line 1))
((eq position 'bopl) (forward-line -1))
(t (error "unknown buffer position requested: %s" position)))
***************
*** 637,643 ****
(if (zerop (octave-previous-code-line))
(progn
(octave-beginning-of-line)
! (back-to-indentation)
(setq icol (current-column))
(let ((bot (point))
(eol (octave-point 'eol)))
--- 637,643 ----
(if (zerop (octave-previous-code-line))
(progn
(octave-beginning-of-line)
! (octave-back-to-indentation)
(setq icol (current-column))
(let ((bot (point))
(eol (octave-point 'eol)))
***************
*** 659,665 ****
(if is-continuation-line
(setq icol (+ icol octave-continuation-offset)))))))
(save-excursion
! (back-to-indentation)
(cond
((and (looking-at octave-block-else-regexp)
(octave-not-in-string-or-comment-p))
--- 659,665 ----
(if is-continuation-line
(setq icol (+ icol octave-continuation-offset)))))))
(save-excursion
! (octave-back-to-indentation)
(cond
((and (looking-at octave-block-else-regexp)
(octave-not-in-string-or-comment-p))
***************
*** 672,677 ****
--- 672,687 ----
(setq icol (list 0 icol)))
((looking-at "\\s<\\S<")
(setq icol (list comment-column icol)))))
+ (if (save-excursion ; if the line starts a test block,
+ (beginning-of-line) ; keep indent at 2
+ (looking-at "%![^ \t]"))
+ (setq icol 2)
+ (if (and (not (listp icol)) ; otherwise, if it is in a test block
+ (< icol 3) ; and the indent wants to be less than 3
+ (save-excursion ; override and set it to 3 so the %!
+ (beginning-of-line) ; doesn't get eaten.
+ (looking-at "%!")))
+ (setq icol 3)))
icol))
(defun octave-block-end-offset ()
***************
*** 705,710 ****
--- 715,742 ----
(indent-for-comment)
(indent-according-to-mode))
+ (defun octave-back-to-indentation ()
+ (beginning-of-line)
+ (if (looking-at "%!") (move-to-column 2))
+ (skip-chars-forward " \t"))
+
+ (defun octave-indent-line-to (column)
+ (octave-back-to-indentation)
+ (let ((cur-col (current-column)))
+ (cond ((< cur-col column)
+ (if (> (- column (* (/ cur-col tab-width) tab-width)) tab-width)
+ (delete-region (point)
+ (progn (skip-chars-backward " ") (point))))
+ (indent-to column))
+ ((> cur-col column) ; too far right (after tab?)
+ (delete-region (progn (move-to-column column t) (point))
+ (progn (octave-back-to-indentation) (point)))))))
+
+ (defun octave-current-indentation ()
+ (save-excursion
+ (octave-back-to-indentation)
+ (current-column)))
+
(defun octave-indent-line (&optional arg)
"Indent current line as Octave code.
With optional ARG, use this as offset unless this line is a comment with
***************
*** 712,724 ****
(interactive)
(or arg (setq arg 0))
(let ((icol (calculate-octave-indent))
! (relpos (- (current-column) (current-indentation))))
(if (listp icol)
(setq icol (car icol))
(setq icol (+ icol arg)))
(if (< icol 0)
(error "Unmatched end keyword")
! (indent-line-to icol)
(if (> relpos 0)
(move-to-column (+ icol relpos))))))
--- 744,756 ----
(interactive)
(or arg (setq arg 0))
(let ((icol (calculate-octave-indent))
! (relpos (- (current-column) (octave-current-indentation))))
(if (listp icol)
(setq icol (car icol))
(setq icol (+ icol arg)))
(if (< icol 0)
(error "Unmatched end keyword")
! (octave-indent-line-to icol)
(if (> relpos 0)
(move-to-column (+ icol relpos))))))
***************
*** 757,768 ****
(interactive "p")
(or arg (setq arg 1))
(beginning-of-line)
! (let ((n 0)
(inc (if (> arg 0) 1 -1)))
(while (and (/= arg 0) (= n 0))
(setq n (forward-line inc))
(while (and (= n 0)
! (looking-at "\\s-*\\($\\|\\s<\\)"))
(setq n (forward-line inc)))
(setq arg (- arg inc)))
n))
--- 789,804 ----
(interactive "p")
(or arg (setq arg 1))
(beginning-of-line)
! (let ((is-test-line (looking-at "%!"))
! (n 0)
(inc (if (> arg 0) 1 -1)))
(while (and (/= arg 0) (= n 0))
(setq n (forward-line inc))
(while (and (= n 0)
! (if is-test-line
! (or (not (looking-at "%!"))
! (looking-at "%!\\s-*\\($\\|\\s<\\|%\\)"))
! (looking-at "\\s-*\\($\\|\\s<\\|%\\)")))
(setq n (forward-line inc)))
(setq arg (- arg inc)))
n))
syntax highlighted by Code2HTML, v. 0.9.1