home *** CD-ROM | disk | FTP | other *** search
- ;; --- Simula Mode for GNU Emacs
- ;; Copyright (C) 1988 Free Software Foundation, Inc.
-
- ;; This file is part of GNU Emacs.
-
- ;; GNU Emacs is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 1, or (at your option)
- ;; any later version.
-
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
-
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING. If not, write to
- ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
- ;; Written by Ole Bj|rn Hessen.
- ;; Disclaimer: This is my first lisp program > 10 lines, and -- most of
- ;; all an experiment using reg-exp to represent forms on the screen.
- ;; The parser parses simula backward, an impossible job.
- ;; Well, I nearly lost!! Luckily, hhe@ifi.uio.no plan to make a better one.
-
- (defvar simula-label "^[A-Za-z_{|}]+:")
- (defvar simula-CE "else\\b\\|when\\b\\|otherwise\\b")
- (defvar simula-CB "end\\b\\|!\\|comment\\b")
- (defvar simula-BE "end\\b")
- (defvar simula-BB "begin\\b")
- (defvar simula-FB "if\\b\\|while\\b\\|inspect\\b\\|for\\b")
- (defvar simula-eol "\n")
- (defvar simula-eof "@") ;the form is postfixed by this string
-
- (defvar simula-extended-form nil
- "non-nil if want non-standard slowly (extended) form checking")
-
- (defvar simula-mode-syntax-table nil
- "Syntax table in simula-mode buffers.")
-
- (defvar simula-mode-abbrev-table nil
- "abbrev table in simula-mode buffers")
-
- (defvar simula-indent-mode 'simula-Nice-indent-mode)
- ;;most users want this feature...
-
- (defvar Read-Simula-Keywords nil
- "non-nil if read keywords already")
-
- (define-abbrev-table 'simula-mode-abbrev-table ())
-
- (defvar Simula-Keyword-Abbrev-File "simula.defns"
- "nil if not to load the Capitalize Keywords feature")
-
- (defvar simula-mode-ignore-directives t
- "Set to non nil if doesn't use % comment type lines.")
-
- (if simula-mode-syntax-table
- ()
- (let ((table (make-syntax-table)))
- (modify-syntax-entry ?\n "." table)
- (modify-syntax-entry ?\f "." table)
- (modify-syntax-entry ?\" "\"" table)
- (modify-syntax-entry ?' "\"" table)
- (modify-syntax-entry ?( "()" table)
- (modify-syntax-entry ?) ")(" table)
- (modify-syntax-entry ?* "." table)
- (modify-syntax-entry ?+ "." table)
- (modify-syntax-entry ?, "." table)
- (modify-syntax-entry ?- "." table)
- (modify-syntax-entry ?. "_" table)
- (modify-syntax-entry ?_ "w" table)
- (modify-syntax-entry ?/ "." table)
- (modify-syntax-entry ?: "." table)
- (modify-syntax-entry ?; ">" table)
- (modify-syntax-entry ?< "." table)
- (modify-syntax-entry ?= "." table)
- (modify-syntax-entry ?> "." table)
- (modify-syntax-entry ?[ "(]" table)
- (modify-syntax-entry ?\\ "." table)
- (modify-syntax-entry ?] ")[" table)
- (modify-syntax-entry ?^ "." table)
- (modify-syntax-entry ?\| "w" table)
- (modify-syntax-entry ?\{ "w" table)
- (modify-syntax-entry ?\} "w" table)
- (modify-syntax-entry ?! "<" table)
- (setq simula-mode-syntax-table table)))
-
- (defvar simula-mode-map ()
- "Keymap used in simula mode.")
-
- (if simula-mode-map
- ()
- (setq simula-mode-map (make-sparse-keymap))
- (define-key simula-mode-map "\t" 'simula-indent)
- (define-key simula-mode-map "\r" 'simula-abbrev-expand-and-lf)
- (define-key simula-mode-map "" 'backward-delete-char-untabify))
-
-
- (defun simula-mode ()
- "This is a mode intended to support program development in Simula.."
- (interactive)
- (kill-all-local-variables)
- (use-local-map simula-mode-map)
- (setq major-mode 'simula-mode)
- (setq mode-name "Simula")
- (make-local-variable 'comment-column)
- (setq comment-column 40)
- (make-local-variable 'end-comment-column)
- (setq end-comment-column 75)
- (set-syntax-table simula-mode-syntax-table)
- (make-local-variable 'paragraph-start)
- (setq paragraph-start "^[ \t]*$\\|\\f")
- (make-local-variable 'paragraph-separate)
- (setq paragraph-separate paragraph-start)
- (make-local-variable 'indent-line-function)
- (setq indent-line-function 'simula-null-indent)
- (make-local-variable 'require-final-newline)
- (setq require-final-newline t) ;put a newline at end!
- (make-local-variable 'comment-start)
- (setq comment-start "! ")
- (make-local-variable 'comment-end)
- (setq comment-end " ;")
- (make-local-variable 'comment-start-skip)
- (setq comment-start-skip "!+ *")
- (make-local-variable 'comment-column)
- (setq comment-start-skip "! *") ;not quite right, but..
- (make-local-variable 'parse-sexp-ignore-comments)
- (setq parse-sexp-ignore-comments nil)
- (make-local-variable 'comment-multi-line)
- (setq comment-multi-line t)
- (setq local-abbrev-table simula-mode-abbrev-table)
- ;;Capitalize-Simula-Keywords ought to run a hook!!!
- (if Simula-Keyword-Abbrev-File
- (progn
- (setq abbrev-mode t)
- (if Read-Simula-Keywords
- ()
- (condition-case err
- (read-abbrev-file Simula-Keyword-Abbrev-File)
- (file-error
- (with-output-to-temp-buffer "*Help*"
- (princ "Simula Mode can't load the Capitalize Simula ")
- (princ "Keyword abbrev file\n\n")
- (princ "Please do one of the following:\n")
- (princ "1. Include this line in your .emacs file:\n")
- (princ " (setq Simula-Keyword-Abbrev-File nil)\n")
- (princ "2. Make a decent abbrev file by your self\n")
- (princ "3. Mail obh@ifi.uio.no requesting the abbrev file\n"))))
- (setq Read-Simula-Keywords t))))
- (funcall simula-indent-mode) ;set indentation
- (run-hooks 'simula-mode-hook))
-
- (defun simula-null-indent ()
- (interactive))
-
- (setq simula-seen-FE nil) ;if seen FE during parsing; non-nil
- (setq simula-form-starter nil) ;string, the FB.
- (setq simula-form nil) ;string, the assembled form
- (setq simula-FB-hpos nil) ;FB's Hpos
- (setq simula-BB-hpos nil) ;BB's Hpos
- (setq simula-hpos nil) ;Hpos of preceeding simula form
- (setq simula-lf-count nil) ;A count of lf seen during parsing
- (setq simula-stack nil) ;A stack of regions representing form
- (setq simula-assemble nil) ;non-nil if assembling forms on stack
- (setq simula-debug nil) ;t if debugging forms
-
-
- ;; some simple stack routines.
- (defun simula-push (v)
- (if simula-assemble (setq simula-stack (cons v simula-stack))))
-
- (defun simula-pop ()
- (prog1 (car simula-stack)
- (setq simula-stack (cdr simula-stack))))
- ;;The concepts of a stack is now obsolete...
- ;;Major rewrite is wanted..
-
- (defun simula-inside-simple-string ()
- ;returns t if inside a simulask simple string
- (save-excursion
- (skip-chars-backward "^\"\n'")
- (if (bolp) nil
- (let ((count 1))
- (while (not (bolp))
- (forward-char -1)
- (skip-chars-backward "^\"\n'")
- (setq count (1+ count)))
- (= (% count 2) 0)))))
-
-
- ;;ignore line starting with a %.
- ;;form is evaled until line is not a compiler directive
- ;;way is t if going forward
- ;;returns with value of form
- ;;didn't found how to use the right kind of scoping, so shit!!!
- ;; -- HELP --
-
- (defun ignore-simula-directives (pedohejform &optional pedohejway)
- (interactive)
- (if simula-mode-ignore-directives (funcall pedohejform)
- (let ((pedohejval (funcall pedohejform)) (pedohejhere (point)))
- (beginning-of-line)
- (while ;while directive line
- (cond
- ((not (= (following-char) ?%)) nil)
- ((or (bobp) (eobp)) nil) ;and not beginning(end) of buffer
- (t))
- (if pedohejway (forward-line) (forward-char -1))
- (setq pedohejval (funcall pedohejform)) ;execute form once more
- (setq pedohejhere (point)) ;and goto beginning of that line.
- (beginning-of-line))
- (if (not (= (following-char) ?%)) (goto-char pedohejhere))
- pedohejval))) ;return FROM if skipped something
- ;Have you seen anybody prefixing a variable with my special password?
- ;No? Good!
-
-
- ;We are on a line which is _not_ a '%'-line directive,
- ;and inside or _just_ after a '! blabla ;' or a 'end blabla ;' comment.
- ;Our job is to skip that comment, returning position skipping from or
- ;just nil if this is no comment
-
- (defun maybe-skip-simula-comment ()
- (let ((here (point)) last-end tmp tmp1)
- (ignore-simula-directives
- (function
- (lambda ()
- (search-backward ";" (point-min) 0)
- (while (simula-inside-simple-string)
- (search-backward "\"")
- (search-backward ";" (point-min) 0)))))
- (re-search-forward
- "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b" here 0)
- (while (or (= (setq tmp (preceding-char)) ?%)
- (= tmp ?\"))
- (if (= tmp ?\") (search-forward "\"" here 0)
- (forward-line 1)
- (if (> (point) here) (goto-char here)))
- (re-search-forward
- "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b" here 0))
- (if (= here (point)) nil ;no comment between "; blabla "
- (if (= (preceding-char) ?!)
- (progn ;a "; ! blabla " commentt
- (forward-char -1)
- here) ;ignore semicolon.
- (forward-word -1)
- (if (looking-at "comment")
- here ;a "; comment blabla " string
- ;; this is a end-comment
- (setq last-end (point)) ;remember where end started
- (while
- (and ;skip directive lines
- (progn ;and strings.
- (setq tmp1
- (re-search-forward
- "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b\\|\\bwhen\\b\\|\\belse\\b\\|\\botherwise\\b" here 0))
- (while (and tmp1
- (or (= (setq tmp (preceding-char)) ?%)
- (= tmp ?\")))
- (if (= tmp ?\") (search-forward "\"" here 0)
- (forward-line 1))
- (setq tmp1 (re-search-forward
- "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b\\|\\bwhen\\b\\|\\belse\\b\\|\\botherwise\\b" here 0)))
- tmp1)
- (cond
- ((= (preceding-char) ?!) ;a "end ! " is part of end-comment
- (if last-end ;skip it.
- t
- (forward-char -1) nil)) ;seen e.g. "end else !"
- ;skip back over word
- ((progn (forward-word -1) nil))
- ((looking-at "comment")
- (if (not last-end)
- nil
- (forward-word 1) t))
- (t (setq last-end (if (looking-at "end") (point) nil))
- (forward-word 1) t))))
- (if (looking-at "!\\|\\bcomment")
- here
- (if last-end
- (progn (goto-char last-end) here)
- (goto-char here)
- nil)))))))
-
-
- ;;save this block form
- (defun save-simula-BB-BE()
- (let ((end (point)) (beg nil))
- (simula-push end)
- (simula-back-level) ;goto before the begin at this level
- (if (not simula-BB-hpos) ;save column number if this the first
- (setq simula-BB-hpos (current-column)))
- (setq beg (point))
- (end-of-line)
- (simula-push ;save unto stack a block level.
- (concat
- "BEGIN"
- (if (> (point) end) ()
- (setq simula-lf-count (1+ simula-lf-count))
- simula-eol) ;there is a lf after the begin
- " o "
- (progn
- (forward-line 2)
- (if (> (point) end) ()
- (setq simula-lf-count (1+ simula-lf-count))
- simula-eol)))) ;and before the end.
- (simula-push beg)
- (goto-char beg)))
-
-
-
-
- ;;assumes we are inside a begin blabla end sentence.
- ;;returns _before_ the begin
- (defun simula-back-level()
- (interactive)
- (let ((end-comment))
- (while
- (and
- (not (bobp))
- (ignore-simula-directives
- (function
- (lambda ()
- (re-search-backward "\\bend\\b\\|\\bbegin\\b" (point-min) 0)
- (while (simula-inside-simple-string)
- (search-backward "\"")
- (re-search-backward "\\bend\\b\\|\\bbegin\\b" (point-min) 0))
- t)))
- (if (looking-at "begin")
- (if (maybe-skip-simula-comment) ;ignore begin in (end)comments
- (progn (if (looking-at "end") (forward-word 1)) t)
- nil) ;else exit while.
- (if (setq end-comment (maybe-skip-simula-comment))
- (if (looking-at "comment\\|!") t ;then not an end-comment
- (goto-char end-comment)
- (simula-back-level)
- t)
- (simula-back-level)
- t)))))
- (if (not (looking-at "begin"))
- (error "No matching BEGIN !!!")))
-
-
-
- ;on entry cursor is on the line we should indent. It indent this line and
- ;predicts the next line's hpos at return value!!
- (defun simula-find-indent (&optional predict-next)
- (interactive)
- (let
- ((not-stop t) ;set to nil if stop parsing, 0 at bolp
- (simexp 0) ;simexp= simula-lf-count, + simula exp.
- tmp ch ;last read character
- indent) ;hpos to indent lines line to.
- (end-of-line)
- (ignore-simula-directives ;ignore if this is a directive line
- (function (lambda () (skip-chars-backward " \t"))))
- (if (maybe-skip-simula-comment)
- (if (looking-at "end") (forward-word 1)))
- (setq simula-lf-count 0
- simula-assemble t
- simula-BB-hpos nil
- simula-FB-hpos nil
- simula-hpos nil
- simula-seen-FE nil
- simula-form nil
- simula-form-starter nil ;string representing the form-starter
- simula-stack (list (point) ;a stack of regions or strings.
- simula-eof))
- (while not-stop
- (setq simexp (1+ simexp)) ;count up simula expressions seen.
- (skip-chars-backward " \t") ;skip ignoring whitespace
- (if (bobp)
- (setq not-stop nil) ;stop at start og buffer
- (if (= (char-syntax (setq ch (preceding-char))) ?w)
- (forward-word -1) ;back over item (ie. word or char.)
- (forward-char -1))
- (cond
- ((eolp) ;passed a new-line
- (cond
- ((numberp not-stop) ;if zero, then stop parsing.
- (setq not-stop nil)
- (forward-char 1))
- (t ;else count up lf's
- (if (/= simula-lf-count (1- simexp))
- (setq simula-lf-count (1+ simula-lf-count)))
- (setq simexp simula-lf-count) ;reset simexp.
- (simula-push (1+ (point))) ;don't assemble newlines in
- (ignore-simula-directives ;simula-form
- (function (lambda () (skip-chars-backward " \t\n"))))
- (simula-push simula-eol) ;save the newline
- (simula-push (point))))) ;ignore region skipped
-
- ((= ch ?\")
- (save-simula-string)) ;skip the string
-
- ((= ch ?\')
- (forward-char -1)
- (if (search-backward "'" (point-min) t)
- (forward-char -1) ;skip to before '
- (error "Unbalanced Character Quote")))
-
- ((= ch ?:) (forward-word -1))
-
- ((= ch ?\;) ;semicolon
- (setq tmp (maybe-skip-simula-comment)) ;is this a comment?
- (if (and tmp (looking-at "!\\|comment"))
- (simula-parsed-over (1+ tmp)) ;ignore comments
- (cond
- ((and (> simula-lf-count 1) ;abort parsing if FE last exp in
- (= simula-lf-count (1- simexp))) ;line only
- (setq not-stop nil) ;stop parsing
- (simula-stack-trick)) ;goto "next-line"
- ((if (not tmp) nil ;do more parsing, but forget
- (forward-word 1) ;the end-comment
- (simula-parsed-over tmp)
- nil))
- ((= simexp 1) (setq simula-seen-FE t))
- ((> simula-lf-count 0)
- (simula-push (1+ (point)))
- (setq simula-assemble nil))))) ;assemble only the last form
-
- ((looking-at simula-BB)
- (setq simula-seen-FE nil) ;forget the past
- (if (> simula-lf-count 1)
- (setq not-stop (simula-stack-trick)) ;stop here!!
- (if (not simula-assemble)
- (progn
- (setq simula-stack (list (point)
- (concat "/n o " simula-eof))
- simula-assemble t)))
- (if (not simula-BB-hpos)
- (setq simula-BB-hpos (current-column)))))
-
- ((and (looking-at simula-CE)
- (setq tmp (maybe-skip-simula-comment)))
- (forward-word 1) ;skip past end.
- (simula-parsed-over tmp))
-
- ((looking-at simula-BE) (save-simula-BB-BE))
-
- ((and (not indent) ;if already found, skip this FB
- (looking-at simula-FB))
- (setq simula-form-starter
- (buffer-substring (point) (match-end 0)))
- (setq simula-FB-hpos (current-column))
- (if (not (setq indent (Simula-Form-Handler)))
- (setq simula-FB-hpos nil simula-form nil))
- (if simula-seen-FE () ;if not seen FE, stop parsing
- (setq not-stop nil) ;and indent from this line
- (beginning-of-line))))))
-
- (setq simula-hpos (current-simula-indentation)) ;save indentation
- (if simula-form
- (if (and predict-next simula-seen-FE)
- (setcdr indent (cdr (Simula-Default-Handler))))
- (setq indent (Simula-Default-Handler)))
- indent))
-
-
- (defun simula-parsed-over (from)
- (skip-chars-backward "\t") ;skip whitespace before comment.
- (simula-push from) ;forget from
- (save-excursion
- (end-of-line) ;if passed newline don't forget
- (if (< (point) from) ;that
- (progn
- (simula-push simula-eol)
- (setq simula-lf-count (1+ simula-lf-count)))))
- (simula-push (point))) ;mark region to be skipped past
-
-
- ;;some better names wanted.
- (defun simula-stack-trick ()
- ;;axiom: if skipped back over 2-* lines, then use the indentation
- ;;of the line after the line where the BB was found. Or if skipped past
- ;;at least two lines and see ";" + newline. Use next lines indentation.
- ;;that means one must fix the stack..
- (forward-line 1)
- (ignore-simula-directives
- (function
- (lambda () (skip-chars-forward " \t\n")
- (while (= (following-char) ?\!)
- (search-forward ";" (point-max) 0)
- (skip-chars-forward " \t\n"))))
- t)
- (let ((pointer simula-stack))
- (while pointer
- (if (and (numberp (car pointer))
- (> (point) (car pointer)))
- (setq simula-stack pointer pointer nil)
- (setq pointer (cdr pointer))))) nil)
-
-
- (defun save-simula-string ()
- (simula-push (point)) ;skip string contents
- (skip-chars-backward "^\"\n" (point-min))
- (if (= (preceding-char) ?\") nil
- (error "UnBalanced String Quote \". "))
- (simula-push (point))
- (forward-char -1)) ;save the "" unto stack.
-
-
- (defun Simula-Form-Handler ()
- (let ((handler (intern-soft
- (concat "Simula-" (capitalize simula-form-starter)
- "-Handler"))))
- (if handler (funcall handler) nil)))
-
-
- (defun Simula-Default-Handler ()
- (prog1
- (if (and simula-seen-FE
- (not simula-extended-form)
- (not (or simula-BB-hpos simula-form)))
- (list simula-hpos '(0 0))
- (Simula-Default-Form-Handler Simula-Default-Form))
- (setq simula-form nil)))
-
-
-
- (defun Simula-Default-Form-Handler (form)
- (simula-collapse-stack) ;get assembled form
- (let ((indentation (get-indent-amount form)))
- (if (not indentation) nil
- (setq simula-hpos
- (if (not (bolp))
- (save-excursion
- (beginning-of-line)
- (current-simula-indentation))
- (current-simula-indentation))
- indentation (cons (simula-indent-calc (car indentation))
- (cdr indentation)))
- indentation))) ;return (hpos (abs relhpos))
-
- (defun simula-collapse-stack ()
- (let ((last-beg (if simula-assemble (point) (simula-pop)))
- (pointer simula-stack))
- (while pointer
- (if (stringp (car pointer)) (setq pointer (cdr pointer))
- (if last-beg
- (progn
- (setcar pointer (buffer-substring last-beg (car pointer)))
- (setq last-beg nil pointer (cdr pointer)))
- (setq last-beg (car pointer))
- (setcar pointer (car (cdr pointer))) ;delete cons-cell
- (setcdr pointer (cdr (cdr pointer))))))
- (setq simula-form (apply 'concat simula-stack)
- simula-stack (list (point) simula-form))))
-
- (defun get-indent-amount (indent-form-list)
- (if indent-form-list
- (if (string-match (car (car indent-form-list)) simula-form)
- (progn
- (if simula-debug
- (with-output-to-temp-buffer "* forms *"
- (print
- (concat (car (car indent-form-list))"<---->" simula-form))))
- (cdr (car indent-form-list)))
- (get-indent-amount (cdr indent-form-list)))
- nil))
-
-
-
- ;axiom: (bolp) eq t
- (defun current-simula-indentation ()
- (if (looking-at simula-label) ;skip labels
- (re-search-forward simula-label)) ;ignore labels
- (skip-chars-forward " \t") ;skip to first non-blank
- (current-column)) ;and return with column nubmer
-
-
- (defun simula-indent-calc (amount)
- (if amount
- (let ((from (car amount)))
- (+ (car (cdr amount))
- (cond
- ((= 0 from) simula-hpos) ;axiom: exists
- ((and simula-FB-hpos (= 1 from)) simula-FB-hpos)
- ((and simula-BB-hpos (= 2 from)) simula-BB-hpos)
- (simula-hpos))))
- simula-hpos))
-
-
- (defun simula-indent-line (to)
- (beginning-of-line)
- (if (= (following-char) ?\%) ()
- (let ((space (% to tab-width)) (tabs (/ to tab-width)))
- (if (looking-at simula-label) ;indent line after label
- (progn
- (re-search-forward simula-label) ;ignore labels
- (if (> (current-column) to)
- (setq tabs 0 space 1)
- (insert-char ?\t 1) ;try fill to nearest tab position
- (if (> (current-column) to) ;else fill blanks.
- (backward-delete-char 1))
- (setq to (- to (current-column)))
- (setq tabs (/ to tab-width) space (% to tab-width)))))
- (insert-char ?\t tabs) ;insert all the necessary tabs and
- (insert-char ?\ space) ;spaces to indent line
- (delete-region
- (point) (progn (skip-chars-forward " \t" (point-max)) (point))))))
-
-
- (defun simula-abbrev-expand-and-lf (arg)
- (interactive "p")
- (expand-abbrev)
- (insert-char ?\n 1)
- (forward-char -1)
- (let ((indent (save-excursion (simula-find-indent t))))
- (if (progn (beginning-of-line)
- (skip-chars-forward " \t")
- (/= (following-char) ?!)) ;Only indent lines not starting with
- ;a comment or something like it..
- (simula-indent-line (car indent)))
- (forward-line 1)
- (simula-indent-line (simula-indent-calc (car (cdr indent))))))
-
- (defun simula-indent ()
- (interactive)
- (simula-indent-line (car (save-excursion (simula-find-indent)))))
-
- (defun Simula-While-Handler ()
- (Simula-Default-Form-Handler Simula-While-Form))
-
- (defun Simula-If-Handler ()
- (Simula-Default-Form-Handler Simula-If-Form))
-
- (defun Simula-Inspect-Handler ()
- (Simula-Default-Form-Handler Simula-Inspect-Form))
-
- (defun Simula-For-Handler ()
- (Simula-Default-Form-Handler Simula-For-Form))
-
-
- ;;;;;; Nice Mode..
- (defun simula-Nice-indent-mode ()
- (interactive)
- (setq Simula-While-Form
- '( ("while.*begin.*end;@" (0 0) (1 0))
- ("while .*do.*begin\n.*\n.*end;@" (1 0) (0 0))
- ("while .*do.*begin\n.*@" (1 3) (1 3))
- ("while .*do.*begin.*@" (0 0) (1 3))
- ("while .*do\n.*begin\n.*\n.*end;@" (2 0) (0 0))
- ("while .*do\n.*begin\n.*@" (2 3) (2 3))
- ("while .*do\n.*begin@" (1 3) (2 3))
- ("while .*do\n.*;@" (1 3) (0 0))
- ("while .*do\n.*@" (1 3) (1 3))
- ("while .*do@" (0 0) (1 3))))
- (setq Simula-Default-Form
- '( ("begin.*end;@" (0 0) (0 0))
- ("while .*do.*begin\n.*\n.*end;@" (0 0) (0 0))
- ("begin.*@" (0 0) (2 3))
- ("begin\n.*\n.*end.*@" (0 0) (0 0))
- ("begin\n.*end;@" (2 3) (0 0))
- ("begin\n.*\n.*end;@" (2 0) (0 0))
- ("begin\n.*@" (2 3) (2 3))
- ("begin\n.*\n@" (2 3) (2 3))
- ("begin\n*.*\n*.*@" (2 3) (2 3))
- (".*;@" (0 0) (0 0))
- ("\n.*;@" (0 0) (0 0))
- ("\n.*@" (0 0) (0 0))
- ("." (0 0) (0 3))))
- (setq Simula-If-Form
- '( ("if.*begin.*end;@" (0 0) (1 0))
- ("if .*begin.*@" (0 0) (2 3))
- ("if .*else@" (0 0) (0 0))
- ("if .*;@" (0 0) (0 0))
- ("if .*@" (0 0) (0 3))
- ("if .*begin.*\n.*@" (2 3) (2 3))
- ("if .*\n.*;@" (0 3) (0 0))
- ("if .*\n.*begin.*end.*@" (0 3) (0 0))
- ("if .*\n.*begin.*@" (0 3) (2 3))
- ("if .*else\n.*@" (0 3) (0 0))
- ("if .*\n.*begin.*\n.*@" (2 3) (2 3))
- ("if .*\n.*begin.*\n.*\n.*end.*@" (2 0) (0 0))
- ("if .*begin.*\n.*\n.*end;.*@" (0 0) (0 0))
- ("if .*begin.*\n.*\n.*end@" (2 0) (0 0))
- ("else if.*@" (0 0) (0 3))
- ("else@" (0 0) (0 3))
- ("else.*begin.*@" (0 0) (2 3))
- ("else.*begin.*\n.*@" (2 3) (2 3))
- ("else.*begin.*\n.*\n.*end;@" (2 0) (0 0))
- ("else .*;@" (0 0) (0 0))
- ("else\n.*begin@" (0 3) (2 3))
- ("else\n.*begin\n.*@" (2 3) (2 3))
- ("else\n.*begin\n.*\n.*end.*@" (2 0) (0 0))))
- (setq Simula-For-Form
- '( ("for .*begin.*end;@" (0 0) (1 0))
- ("for .*do.*;@" (0 0) (0 0))
- ("for .*do@" (0 0) (1 3))
- ("for .*do\n.*begin@" (1 3) (2 3))
- ("for .*do\n.*begin\n.*@" (2 3) (2 3))
- ("for .*do\n.*begin\n.*\n.*end.*@" (1 3) (0 0))
- ("for .*do\n.*;@" (1 3) (0 0))
- ("for .*do\n.*begin.*\n.*end.*@" (1 3) (0 0))
- ("for .*do.*begin@" (0 0) (1 3))
- ("for .*do.*begin\n.*end.*@" (1 3) (0 0))
- ("for .*do.*begin\n.*@" (1 3) (1 3))
- ("for .*do.*begin\n.*\n.*end.*@" (1 0) (0 0))))
- (setq Simula-Inspect-Form
- '( ("inspect .*do.*;@" (0 0) (0 0))
- ("inspect .*do@" (0 0) (1 3))
- ("inspect .*do\n.*begin.*end.*@" (1 3) (0 0))
- ("inspect .*do\n.*begin.*@" (1 3) (2 3))
- ("inspect .*do\n.*begin\n.*end.*@" (2 3) (0 0))
- ("inspect .*do\n.*begin\n.*\n.*end.*@" (2 0) (0 0))
- ("inspect .*do.*begin@" (0 0) (2 3))
- ("inspect .*do.*begin\n.*end.*@" (2 3) (0 0))
- ("inspect .*do.*begin\n.*@" (2 3) (2 3))
- ("inspect .*do.*begin\n.*\n.*end.*;@" (2 0) (0 0))
- ("inspect .*;@" (0 0) (0 0))
- ("inspect .*@" (0 0) (0 3))
- ("otherwise@" (0 0) (0 3))
- ("otherwise\n.*begin@" (0 3) (2 3))
- ("otherwise\n.*begin\n.*end.*@" (2 3) (0 0))
- ("otherwise\n.*begin\n.*@" (2 3) (2 3))
- ("otherwise\n.*begin\n.*\n.*end.*@" (2 0) (0 0))
- ("otherwise .*begin .*end.*@" (0 0) (0 0))
- ("otherwise .*begin.*@" (0 0) (2 3))
- ("otherwise .*begin\n.*end.*@" (2 3) (0 0))
- ("otherwise .*begin\n.*@" (2 3) (2 3))
- ("otherwise .*begin\n.*\n.*end.*@" (2 0) (0 0))
- ("when .*do@" (0 3) (0 6))
- ("when .*do.*;@" (0 3) (0 0))
- ("when .*do.*@" (0 3) (0 3))
- ("when .*do\n.*begin@" (0 6) (2 3))
- ("when .*do\n.*begin\n.*end;@" (2 3) (0 0))
- ("when .*do\n.*begin\n.*@" (2 3) (2 3))
- ("when .*do\n.*begin\n.*\n.*end;@" (2 0) (0 0))
- ("when .*do\n.*begin\n.*\n.*end@" (2 0) (0 3))
- ("when .*do\n.*begin .*end;@" (0 6) (0 0))
- ("when .*do\n.*begin .*end@" (0 6) (0 3)))))
-
- (defun simula-Simed-indent-mode ()
- ;;Should only indent after begin, so this is a overkill
- ;;Hopefully, I'll do better when I care for it.
- (interactive)
- (setq Simula-While-Form
- '( ("while .*do.*begin\n.*\nend;@" (1 0) (0 0))
- ("while .*do.*begin\n.*@" (1 3) (1 3))
- ("while .*do.*begin.*@" (0 0) (1 3))
- ("while .*do\n.*begin\n.*\n.*end;@" (1 0) (0 0))
- ("while .*do\n.*begin\n.*@" (2 3) (2 3))
- ("while .*do\n.*begin@" (1 0) (1 3))
- ("while .*do\n.*;@" (1 3) (0 0))
- ("while .*do\n.*@" (1 3) (1 3))
- ("while .*do@" (0 0) (1 0))))
- (setq Simula-Default-Form
- '( ("begin.*end;@" (0 0) (0 0))
- ("begin.*@" (0 0) (2 3))
- ("begin\n.*\nend" (0 0) (0 0))
- ("begin\n.*end;@" (2 3) (0 0))
- ("begin\n.*@" (2 3) (2 3))
- ("begin\n*.*\n*.*@" (2 3) (2 3))
- (".*;@" (0 0) (0 0))
- ("\n.*;@" (0 0) (0 0))
- ("\n.*@" (0 0) (0 0))
- ("." (0 0) (0 3))))
- (setq Simula-If-Form
- '( ("if .*begin.*@" (0 0) (0 3))
- ("if .*else@" (0 0) (0 0))
- ("if .*;@" (0 0) (0 0))
- ("if .*@" (0 0) (0 0))
- ("if .*begin.*\n.*@" (0 3) (0 3))
- ("if .*\n.*;@" (0 3) (0 0))
- ("if .*\n.*begin.*end.*@" (0 0) (0 0))
- ("if .*\n.*begin.*@" (0 0) (0 3))
- ("if .*else\n.*@" (0 0) (0 0))
- ("if .*\n.*begin.*\n.*@" (0 3) (0 3))
- ("if .*\n.*begin.*\n.*\n.*end.*@" (0 0) (0 0))
- ("if .*begin.*\n.*\n.*end;.*@" (0 0) (0 0))
- ("if .*begin.*\n.*\n.*end@" (0 0) (0 0))
- ("else if.*@" (0 0) (0 0))
- ("else@" (0 0) (0 0))
- ("else.*begin.*@" (0 0) (0 3))
- ("else.*begin.*\n.*@" (0 3) (0 3))
- ("else.*begin.*\n.*\n.*end;@" (0 0) (0 0))
- ("else .*;@" (0 0) (0 0))
- ("else\n.*begin@" (0 0) (0 3))
- ("else\n.*begin\n.*@" (0 3) (0 3))
- ("else\n.*begin\n.*\n.*end.*@" (0 0) (0 0))))
- (setq Simula-For-Form
- '( ("for .*do.*;@" (0 0) (0 0))
- ("for .*do@" (0 0) (0 0))
- ("for .*do\n.*begin@" (0 0) (0 3))
- ("for .*do\n.*begin\n.*@" (0 3) (0 3))
- ("for .*do\n.*begin\n.*\n.*end.*@" (0 0) (0 0))
- ("for .*do\n.*;@" (0 3) (0 0))
- ("for .*do\n.*begin.*\n.*end.*@" (0 0) (0 0))
- ("for .*do.*begin@" (0 0) (0 3))
- ("for .*do.*begin\n.*end.*@" (0 3) (0 0))
- ("for .*do.*begin\n.*@" (0 3) (0 3))
- ("for .*do.*begin\n.*\n.*end.*@" (0 0) (0 0))))
- (setq Simula-Inspect-Form
- '( ("inspect .*do.*;@" (0 0) (0 0))
- ("inspect .*do@" (0 0) (0 0))
- ("inspect .*do\n.*begin.*end.*@" (0 3) (0 0))
- ("inspect .*do\n.*begin.*@" (0 0) (0 3))
- ("inspect .*do\n.*begin\n.*end.*@" (0 0) (0 0))
- ("inspect .*do\n.*begin\n.*\n.*end.*@" (0 0) (0 0))
- ("inspect .*do.*begin@" (0 0) (0 3))
- ("inspect .*do.*begin\n.*end.*@" (0 3) (0 0))
- ("inspect .*do.*begin\n.*@" (0 3) (0 3))
- ("inspect .*do.*begin\n.*\n.*end.*;@" (0 0) (0 0))
- ("inspect .*;@" (0 0) (0 0))
- ("inspect .*@" (0 0) (0 0))
- ("otherwise@" (0 0) (0 0))
- ("otherwise\n.*begin@" (0 0) (0 3))
- ("otherwise\n.*begin\n.*end.*@" (0 3) (0 0))
- ("otherwise\n.*begin\n.*@" (0 3) (0 3))
- ("otherwise\n.*begin\n.*\n.*end.*@" (0 0) (0 0))
- ("otherwise .*begin .*end.*@" (0 0) (0 0))
- ("otherwise .*begin.*@" (0 0) (0 3))
- ("otherwise .*begin\n.*end.*@" (0 3) (0 0))
- ("otherwise .*begin\n.*@" (0 3) (0 3))
- ("otherwise .*begin\n.*\n.*end.*@" (0 0) (0 0))
- ("when .*do@" (0 0) (0 0))
- ("when .*do.*;@" (0 0) (0 0))
- ("when .*do.*@" (0 0) (0 0))
- ("when .*do\n.*begin@" (0 0) (0 3))
- ("when .*do\n.*begin\n.*end;@" (0 3) (0 0))
- ("when .*do\n.*begin\n.*@" (0 3) (0 3))
- ("when .*do\n.*begin\n.*\n.*end;@" (0 0) (0 0))
- ("when .*do\n.*begin\n.*\n.*end@" (0 0) (0 0))
- ("when .*do\n.*begin .*end;@" (0 3) (0 0))
- ("when .*do\n.*begin .*end@" (0 3) (0 0)))))
-