|
|
1.1 ! root 1: ;; --- Simula Mode for GNU Emacs ! 2: ;; Copyright (C) 1988 Free Software Foundation, Inc. ! 3: ! 4: ;; This file is part of GNU Emacs. ! 5: ! 6: ;; GNU Emacs is free software; you can redistribute it and/or modify ! 7: ;; it under the terms of the GNU General Public License as published by ! 8: ;; the Free Software Foundation; either version 1, or (at your option) ! 9: ;; any later version. ! 10: ! 11: ;; GNU Emacs is distributed in the hope that it will be useful, ! 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: ;; GNU General Public License for more details. ! 15: ! 16: ;; You should have received a copy of the GNU General Public License ! 17: ;; along with GNU Emacs; see the file COPYING. If not, write to ! 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: ! 20: ;; Written by Ole Bj|rn Hessen. ! 21: ;; Disclaimer: This is my first lisp program > 10 lines, and -- most of ! 22: ;; all an experiment using reg-exp to represent forms on the screen. ! 23: ;; The parser parses simula backward, an impossible job. ! 24: ;; Well, I nearly lost!! Luckily, [email protected] plan to make a better one. ! 25: ! 26: (defvar simula-label "^[A-Za-z_{|}]+:") ! 27: (defvar simula-CE "else\\b\\|when\\b\\|otherwise\\b") ! 28: (defvar simula-CB "end\\b\\|!\\|comment\\b") ! 29: (defvar simula-BE "end\\b") ! 30: (defvar simula-BB "begin\\b") ! 31: (defvar simula-FB "if\\b\\|while\\b\\|inspect\\b\\|for\\b") ! 32: (defvar simula-eol "\n") ! 33: (defvar simula-eof "@") ;the form is postfixed by this string ! 34: ! 35: (defvar simula-extended-form nil ! 36: "non-nil if want non-standard slowly (extended) form checking") ! 37: ! 38: (defvar simula-mode-syntax-table nil ! 39: "Syntax table in simula-mode buffers.") ! 40: ! 41: (defvar simula-mode-abbrev-table nil ! 42: "abbrev table in simula-mode buffers") ! 43: ! 44: (defvar simula-indent-mode 'simula-Nice-indent-mode) ! 45: ;;most users want this feature... ! 46: ! 47: (defvar Read-Simula-Keywords nil ! 48: "non-nil if read keywords already") ! 49: ! 50: (define-abbrev-table 'simula-mode-abbrev-table ()) ! 51: ! 52: (defvar Simula-Keyword-Abbrev-File "simula.defns" ! 53: "nil if not to load the Capitalize Keywords feature") ! 54: ! 55: (defvar simula-mode-ignore-directives t ! 56: "Set to non nil if doesn't use % comment type lines.") ! 57: ! 58: (if simula-mode-syntax-table ! 59: () ! 60: (let ((table (make-syntax-table))) ! 61: (modify-syntax-entry ?\n "." table) ! 62: (modify-syntax-entry ?\f "." table) ! 63: (modify-syntax-entry ?\" "\"" table) ! 64: (modify-syntax-entry ?' "\"" table) ! 65: (modify-syntax-entry ?( "()" table) ! 66: (modify-syntax-entry ?) ")(" table) ! 67: (modify-syntax-entry ?* "." table) ! 68: (modify-syntax-entry ?+ "." table) ! 69: (modify-syntax-entry ?, "." table) ! 70: (modify-syntax-entry ?- "." table) ! 71: (modify-syntax-entry ?. "_" table) ! 72: (modify-syntax-entry ?_ "w" table) ! 73: (modify-syntax-entry ?/ "." table) ! 74: (modify-syntax-entry ?: "." table) ! 75: (modify-syntax-entry ?; ">" table) ! 76: (modify-syntax-entry ?< "." table) ! 77: (modify-syntax-entry ?= "." table) ! 78: (modify-syntax-entry ?> "." table) ! 79: (modify-syntax-entry ?[ "(]" table) ! 80: (modify-syntax-entry ?\\ "." table) ! 81: (modify-syntax-entry ?] ")[" table) ! 82: (modify-syntax-entry ?^ "." table) ! 83: (modify-syntax-entry ?\| "w" table) ! 84: (modify-syntax-entry ?\{ "w" table) ! 85: (modify-syntax-entry ?\} "w" table) ! 86: (modify-syntax-entry ?! "<" table) ! 87: (setq simula-mode-syntax-table table))) ! 88: ! 89: (defvar simula-mode-map () ! 90: "Keymap used in simula mode.") ! 91: ! 92: (if simula-mode-map ! 93: () ! 94: (setq simula-mode-map (make-sparse-keymap)) ! 95: (define-key simula-mode-map "\t" 'simula-indent) ! 96: (define-key simula-mode-map "\r" 'simula-abbrev-expand-and-lf) ! 97: (define-key simula-mode-map "" 'backward-delete-char-untabify)) ! 98: ! 99: ! 100: (defun simula-mode () ! 101: "This is a mode intended to support program development in Simula.." ! 102: (interactive) ! 103: (kill-all-local-variables) ! 104: (use-local-map simula-mode-map) ! 105: (setq major-mode 'simula-mode) ! 106: (setq mode-name "Simula") ! 107: (make-local-variable 'comment-column) ! 108: (setq comment-column 40) ! 109: (make-local-variable 'end-comment-column) ! 110: (setq end-comment-column 75) ! 111: (set-syntax-table simula-mode-syntax-table) ! 112: (make-local-variable 'paragraph-start) ! 113: (setq paragraph-start "^[ \t]*$\\|\\f") ! 114: (make-local-variable 'paragraph-separate) ! 115: (setq paragraph-separate paragraph-start) ! 116: (make-local-variable 'indent-line-function) ! 117: (setq indent-line-function 'simula-null-indent) ! 118: (make-local-variable 'require-final-newline) ! 119: (setq require-final-newline t) ;put a newline at end! ! 120: (make-local-variable 'comment-start) ! 121: (setq comment-start "! ") ! 122: (make-local-variable 'comment-end) ! 123: (setq comment-end " ;") ! 124: (make-local-variable 'comment-start-skip) ! 125: (setq comment-start-skip "!+ *") ! 126: (make-local-variable 'comment-column) ! 127: (setq comment-start-skip "! *") ;not quite right, but.. ! 128: (make-local-variable 'parse-sexp-ignore-comments) ! 129: (setq parse-sexp-ignore-comments nil) ! 130: (make-local-variable 'comment-multi-line) ! 131: (setq comment-multi-line t) ! 132: (setq local-abbrev-table simula-mode-abbrev-table) ! 133: ;;Capitalize-Simula-Keywords ought to run a hook!!! ! 134: (if Simula-Keyword-Abbrev-File ! 135: (progn ! 136: (setq abbrev-mode t) ! 137: (if Read-Simula-Keywords ! 138: () ! 139: (condition-case err ! 140: (read-abbrev-file Simula-Keyword-Abbrev-File) ! 141: (file-error ! 142: (with-output-to-temp-buffer "*Help*" ! 143: (princ "Simula Mode can't load the Capitalize Simula ") ! 144: (princ "Keyword abbrev file\n\n") ! 145: (princ "Please do one of the following:\n") ! 146: (princ "1. Include this line in your .emacs file:\n") ! 147: (princ " (setq Simula-Keyword-Abbrev-File nil)\n") ! 148: (princ "2. Make a decent abbrev file by your self\n") ! 149: (princ "3. Mail [email protected] requesting the abbrev file\n")))) ! 150: (setq Read-Simula-Keywords t)))) ! 151: (funcall simula-indent-mode) ;set indentation ! 152: (run-hooks 'simula-mode-hook)) ! 153: ! 154: (defun simula-null-indent () ! 155: (interactive)) ! 156: ! 157: (setq simula-seen-FE nil) ;if seen FE during parsing; non-nil ! 158: (setq simula-form-starter nil) ;string, the FB. ! 159: (setq simula-form nil) ;string, the assembled form ! 160: (setq simula-FB-hpos nil) ;FB's Hpos ! 161: (setq simula-BB-hpos nil) ;BB's Hpos ! 162: (setq simula-hpos nil) ;Hpos of preceeding simula form ! 163: (setq simula-lf-count nil) ;A count of lf seen during parsing ! 164: (setq simula-stack nil) ;A stack of regions representing form ! 165: (setq simula-assemble nil) ;non-nil if assembling forms on stack ! 166: (setq simula-debug nil) ;t if debugging forms ! 167: ! 168: ! 169: ;; some simple stack routines. ! 170: (defun simula-push (v) ! 171: (if simula-assemble (setq simula-stack (cons v simula-stack)))) ! 172: ! 173: (defun simula-pop () ! 174: (prog1 (car simula-stack) ! 175: (setq simula-stack (cdr simula-stack)))) ! 176: ;;The concepts of a stack is now obsolete... ! 177: ;;Major rewrite is wanted.. ! 178: ! 179: (defun simula-inside-simple-string () ! 180: ;returns t if inside a simulask simple string ! 181: (save-excursion ! 182: (skip-chars-backward "^\"\n'") ! 183: (if (bolp) nil ! 184: (let ((count 1)) ! 185: (while (not (bolp)) ! 186: (forward-char -1) ! 187: (skip-chars-backward "^\"\n'") ! 188: (setq count (1+ count))) ! 189: (= (% count 2) 0))))) ! 190: ! 191: ! 192: ;;ignore line starting with a %. ! 193: ;;form is evaled until line is not a compiler directive ! 194: ;;way is t if going forward ! 195: ;;returns with value of form ! 196: ;;didn't found how to use the right kind of scoping, so shit!!! ! 197: ;; -- HELP -- ! 198: ! 199: (defun ignore-simula-directives (pedohejform &optional pedohejway) ! 200: (interactive) ! 201: (if simula-mode-ignore-directives (funcall pedohejform) ! 202: (let ((pedohejval (funcall pedohejform)) (pedohejhere (point))) ! 203: (beginning-of-line) ! 204: (while ;while directive line ! 205: (cond ! 206: ((not (= (following-char) ?%)) nil) ! 207: ((or (bobp) (eobp)) nil) ;and not beginning(end) of buffer ! 208: (t)) ! 209: (if pedohejway (forward-line) (forward-char -1)) ! 210: (setq pedohejval (funcall pedohejform)) ;execute form once more ! 211: (setq pedohejhere (point)) ;and goto beginning of that line. ! 212: (beginning-of-line)) ! 213: (if (not (= (following-char) ?%)) (goto-char pedohejhere)) ! 214: pedohejval))) ;return FROM if skipped something ! 215: ;Have you seen anybody prefixing a variable with my special password? ! 216: ;No? Good! ! 217: ! 218: ! 219: ;We are on a line which is _not_ a '%'-line directive, ! 220: ;and inside or _just_ after a '! blabla ;' or a 'end blabla ;' comment. ! 221: ;Our job is to skip that comment, returning position skipping from or ! 222: ;just nil if this is no comment ! 223: ! 224: (defun maybe-skip-simula-comment () ! 225: (let ((here (point)) last-end tmp tmp1) ! 226: (ignore-simula-directives ! 227: (function ! 228: (lambda () ! 229: (search-backward ";" (point-min) 0) ! 230: (while (simula-inside-simple-string) ! 231: (search-backward "\"") ! 232: (search-backward ";" (point-min) 0))))) ! 233: (re-search-forward ! 234: "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b" here 0) ! 235: (while (or (= (setq tmp (preceding-char)) ?%) ! 236: (= tmp ?\")) ! 237: (if (= tmp ?\") (search-forward "\"" here 0) ! 238: (forward-line 1) ! 239: (if (> (point) here) (goto-char here))) ! 240: (re-search-forward ! 241: "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b" here 0)) ! 242: (if (= here (point)) nil ;no comment between "; blabla " ! 243: (if (= (preceding-char) ?!) ! 244: (progn ;a "; ! blabla " commentt ! 245: (forward-char -1) ! 246: here) ;ignore semicolon. ! 247: (forward-word -1) ! 248: (if (looking-at "comment") ! 249: here ;a "; comment blabla " string ! 250: ;; this is a end-comment ! 251: (setq last-end (point)) ;remember where end started ! 252: (while ! 253: (and ;skip directive lines ! 254: (progn ;and strings. ! 255: (setq tmp1 ! 256: (re-search-forward ! 257: "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b\\|\\bwhen\\b\\|\\belse\\b\\|\\botherwise\\b" here 0)) ! 258: (while (and tmp1 ! 259: (or (= (setq tmp (preceding-char)) ?%) ! 260: (= tmp ?\"))) ! 261: (if (= tmp ?\") (search-forward "\"" here 0) ! 262: (forward-line 1)) ! 263: (setq tmp1 (re-search-forward ! 264: "^%\\|\"\\|!\\|\\bcomment\\b\\|\\bend\\b\\|\\bwhen\\b\\|\\belse\\b\\|\\botherwise\\b" here 0))) ! 265: tmp1) ! 266: (cond ! 267: ((= (preceding-char) ?!) ;a "end ! " is part of end-comment ! 268: (if last-end ;skip it. ! 269: t ! 270: (forward-char -1) nil)) ;seen e.g. "end else !" ! 271: ;skip back over word ! 272: ((progn (forward-word -1) nil)) ! 273: ((looking-at "comment") ! 274: (if (not last-end) ! 275: nil ! 276: (forward-word 1) t)) ! 277: (t (setq last-end (if (looking-at "end") (point) nil)) ! 278: (forward-word 1) t)))) ! 279: (if (looking-at "!\\|\\bcomment") ! 280: here ! 281: (if last-end ! 282: (progn (goto-char last-end) here) ! 283: (goto-char here) ! 284: nil))))))) ! 285: ! 286: ! 287: ;;save this block form ! 288: (defun save-simula-BB-BE() ! 289: (let ((end (point)) (beg nil)) ! 290: (simula-push end) ! 291: (simula-back-level) ;goto before the begin at this level ! 292: (if (not simula-BB-hpos) ;save column number if this the first ! 293: (setq simula-BB-hpos (current-column))) ! 294: (setq beg (point)) ! 295: (end-of-line) ! 296: (simula-push ;save unto stack a block level. ! 297: (concat ! 298: "BEGIN" ! 299: (if (> (point) end) () ! 300: (setq simula-lf-count (1+ simula-lf-count)) ! 301: simula-eol) ;there is a lf after the begin ! 302: " o " ! 303: (progn ! 304: (forward-line 2) ! 305: (if (> (point) end) () ! 306: (setq simula-lf-count (1+ simula-lf-count)) ! 307: simula-eol)))) ;and before the end. ! 308: (simula-push beg) ! 309: (goto-char beg))) ! 310: ! 311: ! 312: ! 313: ! 314: ;;assumes we are inside a begin blabla end sentence. ! 315: ;;returns _before_ the begin ! 316: (defun simula-back-level() ! 317: (interactive) ! 318: (let ((end-comment)) ! 319: (while ! 320: (and ! 321: (not (bobp)) ! 322: (ignore-simula-directives ! 323: (function ! 324: (lambda () ! 325: (re-search-backward "\\bend\\b\\|\\bbegin\\b" (point-min) 0) ! 326: (while (simula-inside-simple-string) ! 327: (search-backward "\"") ! 328: (re-search-backward "\\bend\\b\\|\\bbegin\\b" (point-min) 0)) ! 329: t))) ! 330: (if (looking-at "begin") ! 331: (if (maybe-skip-simula-comment) ;ignore begin in (end)comments ! 332: (progn (if (looking-at "end") (forward-word 1)) t) ! 333: nil) ;else exit while. ! 334: (if (setq end-comment (maybe-skip-simula-comment)) ! 335: (if (looking-at "comment\\|!") t ;then not an end-comment ! 336: (goto-char end-comment) ! 337: (simula-back-level) ! 338: t) ! 339: (simula-back-level) ! 340: t))))) ! 341: (if (not (looking-at "begin")) ! 342: (error "No matching BEGIN !!!"))) ! 343: ! 344: ! 345: ! 346: ;on entry cursor is on the line we should indent. It indent this line and ! 347: ;predicts the next line's hpos at return value!! ! 348: (defun simula-find-indent (&optional predict-next) ! 349: (interactive) ! 350: (let ! 351: ((not-stop t) ;set to nil if stop parsing, 0 at bolp ! 352: (simexp 0) ;simexp= simula-lf-count, + simula exp. ! 353: tmp ch ;last read character ! 354: indent) ;hpos to indent lines line to. ! 355: (end-of-line) ! 356: (ignore-simula-directives ;ignore if this is a directive line ! 357: (function (lambda () (skip-chars-backward " \t")))) ! 358: (if (maybe-skip-simula-comment) ! 359: (if (looking-at "end") (forward-word 1))) ! 360: (setq simula-lf-count 0 ! 361: simula-assemble t ! 362: simula-BB-hpos nil ! 363: simula-FB-hpos nil ! 364: simula-hpos nil ! 365: simula-seen-FE nil ! 366: simula-form nil ! 367: simula-form-starter nil ;string representing the form-starter ! 368: simula-stack (list (point) ;a stack of regions or strings. ! 369: simula-eof)) ! 370: (while not-stop ! 371: (setq simexp (1+ simexp)) ;count up simula expressions seen. ! 372: (skip-chars-backward " \t") ;skip ignoring whitespace ! 373: (if (bobp) ! 374: (setq not-stop nil) ;stop at start og buffer ! 375: (if (= (char-syntax (setq ch (preceding-char))) ?w) ! 376: (forward-word -1) ;back over item (ie. word or char.) ! 377: (forward-char -1)) ! 378: (cond ! 379: ((eolp) ;passed a new-line ! 380: (cond ! 381: ((numberp not-stop) ;if zero, then stop parsing. ! 382: (setq not-stop nil) ! 383: (forward-char 1)) ! 384: (t ;else count up lf's ! 385: (if (/= simula-lf-count (1- simexp)) ! 386: (setq simula-lf-count (1+ simula-lf-count))) ! 387: (setq simexp simula-lf-count) ;reset simexp. ! 388: (simula-push (1+ (point))) ;don't assemble newlines in ! 389: (ignore-simula-directives ;simula-form ! 390: (function (lambda () (skip-chars-backward " \t\n")))) ! 391: (simula-push simula-eol) ;save the newline ! 392: (simula-push (point))))) ;ignore region skipped ! 393: ! 394: ((= ch ?\") ! 395: (save-simula-string)) ;skip the string ! 396: ! 397: ((= ch ?\') ! 398: (forward-char -1) ! 399: (if (search-backward "'" (point-min) t) ! 400: (forward-char -1) ;skip to before ' ! 401: (error "Unbalanced Character Quote"))) ! 402: ! 403: ((= ch ?:) (forward-word -1)) ! 404: ! 405: ((= ch ?\;) ;semicolon ! 406: (setq tmp (maybe-skip-simula-comment)) ;is this a comment? ! 407: (if (and tmp (looking-at "!\\|comment")) ! 408: (simula-parsed-over (1+ tmp)) ;ignore comments ! 409: (cond ! 410: ((and (> simula-lf-count 1) ;abort parsing if FE last exp in ! 411: (= simula-lf-count (1- simexp))) ;line only ! 412: (setq not-stop nil) ;stop parsing ! 413: (simula-stack-trick)) ;goto "next-line" ! 414: ((if (not tmp) nil ;do more parsing, but forget ! 415: (forward-word 1) ;the end-comment ! 416: (simula-parsed-over tmp) ! 417: nil)) ! 418: ((= simexp 1) (setq simula-seen-FE t)) ! 419: ((> simula-lf-count 0) ! 420: (simula-push (1+ (point))) ! 421: (setq simula-assemble nil))))) ;assemble only the last form ! 422: ! 423: ((looking-at simula-BB) ! 424: (setq simula-seen-FE nil) ;forget the past ! 425: (if (> simula-lf-count 1) ! 426: (setq not-stop (simula-stack-trick)) ;stop here!! ! 427: (if (not simula-assemble) ! 428: (progn ! 429: (setq simula-stack (list (point) ! 430: (concat "/n o " simula-eof)) ! 431: simula-assemble t))) ! 432: (if (not simula-BB-hpos) ! 433: (setq simula-BB-hpos (current-column))))) ! 434: ! 435: ((and (looking-at simula-CE) ! 436: (setq tmp (maybe-skip-simula-comment))) ! 437: (forward-word 1) ;skip past end. ! 438: (simula-parsed-over tmp)) ! 439: ! 440: ((looking-at simula-BE) (save-simula-BB-BE)) ! 441: ! 442: ((and (not indent) ;if already found, skip this FB ! 443: (looking-at simula-FB)) ! 444: (setq simula-form-starter ! 445: (buffer-substring (point) (match-end 0))) ! 446: (setq simula-FB-hpos (current-column)) ! 447: (if (not (setq indent (Simula-Form-Handler))) ! 448: (setq simula-FB-hpos nil simula-form nil)) ! 449: (if simula-seen-FE () ;if not seen FE, stop parsing ! 450: (setq not-stop nil) ;and indent from this line ! 451: (beginning-of-line)))))) ! 452: ! 453: (setq simula-hpos (current-simula-indentation)) ;save indentation ! 454: (if simula-form ! 455: (if (and predict-next simula-seen-FE) ! 456: (setcdr indent (cdr (Simula-Default-Handler)))) ! 457: (setq indent (Simula-Default-Handler))) ! 458: indent)) ! 459: ! 460: ! 461: (defun simula-parsed-over (from) ! 462: (skip-chars-backward "\t") ;skip whitespace before comment. ! 463: (simula-push from) ;forget from ! 464: (save-excursion ! 465: (end-of-line) ;if passed newline don't forget ! 466: (if (< (point) from) ;that ! 467: (progn ! 468: (simula-push simula-eol) ! 469: (setq simula-lf-count (1+ simula-lf-count))))) ! 470: (simula-push (point))) ;mark region to be skipped past ! 471: ! 472: ! 473: ;;some better names wanted. ! 474: (defun simula-stack-trick () ! 475: ;;axiom: if skipped back over 2-* lines, then use the indentation ! 476: ;;of the line after the line where the BB was found. Or if skipped past ! 477: ;;at least two lines and see ";" + newline. Use next lines indentation. ! 478: ;;that means one must fix the stack.. ! 479: (forward-line 1) ! 480: (ignore-simula-directives ! 481: (function ! 482: (lambda () (skip-chars-forward " \t\n") ! 483: (while (= (following-char) ?\!) ! 484: (search-forward ";" (point-max) 0) ! 485: (skip-chars-forward " \t\n")))) ! 486: t) ! 487: (let ((pointer simula-stack)) ! 488: (while pointer ! 489: (if (and (numberp (car pointer)) ! 490: (> (point) (car pointer))) ! 491: (setq simula-stack pointer pointer nil) ! 492: (setq pointer (cdr pointer))))) nil) ! 493: ! 494: ! 495: (defun save-simula-string () ! 496: (simula-push (point)) ;skip string contents ! 497: (skip-chars-backward "^\"\n" (point-min)) ! 498: (if (= (preceding-char) ?\") nil ! 499: (error "UnBalanced String Quote \". ")) ! 500: (simula-push (point)) ! 501: (forward-char -1)) ;save the "" unto stack. ! 502: ! 503: ! 504: (defun Simula-Form-Handler () ! 505: (let ((handler (intern-soft ! 506: (concat "Simula-" (capitalize simula-form-starter) ! 507: "-Handler")))) ! 508: (if handler (funcall handler) nil))) ! 509: ! 510: ! 511: (defun Simula-Default-Handler () ! 512: (prog1 ! 513: (if (and simula-seen-FE ! 514: (not simula-extended-form) ! 515: (not (or simula-BB-hpos simula-form))) ! 516: (list simula-hpos '(0 0)) ! 517: (Simula-Default-Form-Handler Simula-Default-Form)) ! 518: (setq simula-form nil))) ! 519: ! 520: ! 521: ! 522: (defun Simula-Default-Form-Handler (form) ! 523: (simula-collapse-stack) ;get assembled form ! 524: (let ((indentation (get-indent-amount form))) ! 525: (if (not indentation) nil ! 526: (setq simula-hpos ! 527: (if (not (bolp)) ! 528: (save-excursion ! 529: (beginning-of-line) ! 530: (current-simula-indentation)) ! 531: (current-simula-indentation)) ! 532: indentation (cons (simula-indent-calc (car indentation)) ! 533: (cdr indentation))) ! 534: indentation))) ;return (hpos (abs relhpos)) ! 535: ! 536: (defun simula-collapse-stack () ! 537: (let ((last-beg (if simula-assemble (point) (simula-pop))) ! 538: (pointer simula-stack)) ! 539: (while pointer ! 540: (if (stringp (car pointer)) (setq pointer (cdr pointer)) ! 541: (if last-beg ! 542: (progn ! 543: (setcar pointer (buffer-substring last-beg (car pointer))) ! 544: (setq last-beg nil pointer (cdr pointer))) ! 545: (setq last-beg (car pointer)) ! 546: (setcar pointer (car (cdr pointer))) ;delete cons-cell ! 547: (setcdr pointer (cdr (cdr pointer)))))) ! 548: (setq simula-form (apply 'concat simula-stack) ! 549: simula-stack (list (point) simula-form)))) ! 550: ! 551: (defun get-indent-amount (indent-form-list) ! 552: (if indent-form-list ! 553: (if (string-match (car (car indent-form-list)) simula-form) ! 554: (progn ! 555: (if simula-debug ! 556: (with-output-to-temp-buffer "* forms *" ! 557: (print ! 558: (concat (car (car indent-form-list))"<---->" simula-form)))) ! 559: (cdr (car indent-form-list))) ! 560: (get-indent-amount (cdr indent-form-list))) ! 561: nil)) ! 562: ! 563: ! 564: ! 565: ;axiom: (bolp) eq t ! 566: (defun current-simula-indentation () ! 567: (if (looking-at simula-label) ;skip labels ! 568: (re-search-forward simula-label)) ;ignore labels ! 569: (skip-chars-forward " \t") ;skip to first non-blank ! 570: (current-column)) ;and return with column nubmer ! 571: ! 572: ! 573: (defun simula-indent-calc (amount) ! 574: (if amount ! 575: (let ((from (car amount))) ! 576: (+ (car (cdr amount)) ! 577: (cond ! 578: ((= 0 from) simula-hpos) ;axiom: exists ! 579: ((and simula-FB-hpos (= 1 from)) simula-FB-hpos) ! 580: ((and simula-BB-hpos (= 2 from)) simula-BB-hpos) ! 581: (simula-hpos)))) ! 582: simula-hpos)) ! 583: ! 584: ! 585: (defun simula-indent-line (to) ! 586: (beginning-of-line) ! 587: (if (= (following-char) ?\%) () ! 588: (let ((space (% to tab-width)) (tabs (/ to tab-width))) ! 589: (if (looking-at simula-label) ;indent line after label ! 590: (progn ! 591: (re-search-forward simula-label) ;ignore labels ! 592: (if (> (current-column) to) ! 593: (setq tabs 0 space 1) ! 594: (insert-char ?\t 1) ;try fill to nearest tab position ! 595: (if (> (current-column) to) ;else fill blanks. ! 596: (backward-delete-char 1)) ! 597: (setq to (- to (current-column))) ! 598: (setq tabs (/ to tab-width) space (% to tab-width))))) ! 599: (insert-char ?\t tabs) ;insert all the necessary tabs and ! 600: (insert-char ?\ space) ;spaces to indent line ! 601: (delete-region ! 602: (point) (progn (skip-chars-forward " \t" (point-max)) (point)))))) ! 603: ! 604: ! 605: (defun simula-abbrev-expand-and-lf (arg) ! 606: (interactive "p") ! 607: (expand-abbrev) ! 608: (insert-char ?\n 1) ! 609: (forward-char -1) ! 610: (let ((indent (save-excursion (simula-find-indent t)))) ! 611: (if (progn (beginning-of-line) ! 612: (skip-chars-forward " \t") ! 613: (/= (following-char) ?!)) ;Only indent lines not starting with ! 614: ;a comment or something like it.. ! 615: (simula-indent-line (car indent))) ! 616: (forward-line 1) ! 617: (simula-indent-line (simula-indent-calc (car (cdr indent)))))) ! 618: ! 619: (defun simula-indent () ! 620: (interactive) ! 621: (simula-indent-line (car (save-excursion (simula-find-indent))))) ! 622: ! 623: (defun Simula-While-Handler () ! 624: (Simula-Default-Form-Handler Simula-While-Form)) ! 625: ! 626: (defun Simula-If-Handler () ! 627: (Simula-Default-Form-Handler Simula-If-Form)) ! 628: ! 629: (defun Simula-Inspect-Handler () ! 630: (Simula-Default-Form-Handler Simula-Inspect-Form)) ! 631: ! 632: (defun Simula-For-Handler () ! 633: (Simula-Default-Form-Handler Simula-For-Form)) ! 634: ! 635: ! 636: ;;;;;; Nice Mode.. ! 637: (defun simula-Nice-indent-mode () ! 638: (interactive) ! 639: (setq Simula-While-Form ! 640: '( ("while.*begin.*end;@" (0 0) (1 0)) ! 641: ("while .*do.*begin\n.*\n.*end;@" (1 0) (0 0)) ! 642: ("while .*do.*begin\n.*@" (1 3) (1 3)) ! 643: ("while .*do.*begin.*@" (0 0) (1 3)) ! 644: ("while .*do\n.*begin\n.*\n.*end;@" (2 0) (0 0)) ! 645: ("while .*do\n.*begin\n.*@" (2 3) (2 3)) ! 646: ("while .*do\n.*begin@" (1 3) (2 3)) ! 647: ("while .*do\n.*;@" (1 3) (0 0)) ! 648: ("while .*do\n.*@" (1 3) (1 3)) ! 649: ("while .*do@" (0 0) (1 3)))) ! 650: (setq Simula-Default-Form ! 651: '( ("begin.*end;@" (0 0) (0 0)) ! 652: ("while .*do.*begin\n.*\n.*end;@" (0 0) (0 0)) ! 653: ("begin.*@" (0 0) (2 3)) ! 654: ("begin\n.*\n.*end.*@" (0 0) (0 0)) ! 655: ("begin\n.*end;@" (2 3) (0 0)) ! 656: ("begin\n.*\n.*end;@" (2 0) (0 0)) ! 657: ("begin\n.*@" (2 3) (2 3)) ! 658: ("begin\n.*\n@" (2 3) (2 3)) ! 659: ("begin\n*.*\n*.*@" (2 3) (2 3)) ! 660: (".*;@" (0 0) (0 0)) ! 661: ("\n.*;@" (0 0) (0 0)) ! 662: ("\n.*@" (0 0) (0 0)) ! 663: ("." (0 0) (0 3)))) ! 664: (setq Simula-If-Form ! 665: '( ("if.*begin.*end;@" (0 0) (1 0)) ! 666: ("if .*begin.*@" (0 0) (2 3)) ! 667: ("if .*else@" (0 0) (0 0)) ! 668: ("if .*;@" (0 0) (0 0)) ! 669: ("if .*@" (0 0) (0 3)) ! 670: ("if .*begin.*\n.*@" (2 3) (2 3)) ! 671: ("if .*\n.*;@" (0 3) (0 0)) ! 672: ("if .*\n.*begin.*end.*@" (0 3) (0 0)) ! 673: ("if .*\n.*begin.*@" (0 3) (2 3)) ! 674: ("if .*else\n.*@" (0 3) (0 0)) ! 675: ("if .*\n.*begin.*\n.*@" (2 3) (2 3)) ! 676: ("if .*\n.*begin.*\n.*\n.*end.*@" (2 0) (0 0)) ! 677: ("if .*begin.*\n.*\n.*end;.*@" (0 0) (0 0)) ! 678: ("if .*begin.*\n.*\n.*end@" (2 0) (0 0)) ! 679: ("else if.*@" (0 0) (0 3)) ! 680: ("else@" (0 0) (0 3)) ! 681: ("else.*begin.*@" (0 0) (2 3)) ! 682: ("else.*begin.*\n.*@" (2 3) (2 3)) ! 683: ("else.*begin.*\n.*\n.*end;@" (2 0) (0 0)) ! 684: ("else .*;@" (0 0) (0 0)) ! 685: ("else\n.*begin@" (0 3) (2 3)) ! 686: ("else\n.*begin\n.*@" (2 3) (2 3)) ! 687: ("else\n.*begin\n.*\n.*end.*@" (2 0) (0 0)))) ! 688: (setq Simula-For-Form ! 689: '( ("for .*begin.*end;@" (0 0) (1 0)) ! 690: ("for .*do.*;@" (0 0) (0 0)) ! 691: ("for .*do@" (0 0) (1 3)) ! 692: ("for .*do\n.*begin@" (1 3) (2 3)) ! 693: ("for .*do\n.*begin\n.*@" (2 3) (2 3)) ! 694: ("for .*do\n.*begin\n.*\n.*end.*@" (1 3) (0 0)) ! 695: ("for .*do\n.*;@" (1 3) (0 0)) ! 696: ("for .*do\n.*begin.*\n.*end.*@" (1 3) (0 0)) ! 697: ("for .*do.*begin@" (0 0) (1 3)) ! 698: ("for .*do.*begin\n.*end.*@" (1 3) (0 0)) ! 699: ("for .*do.*begin\n.*@" (1 3) (1 3)) ! 700: ("for .*do.*begin\n.*\n.*end.*@" (1 0) (0 0)))) ! 701: (setq Simula-Inspect-Form ! 702: '( ("inspect .*do.*;@" (0 0) (0 0)) ! 703: ("inspect .*do@" (0 0) (1 3)) ! 704: ("inspect .*do\n.*begin.*end.*@" (1 3) (0 0)) ! 705: ("inspect .*do\n.*begin.*@" (1 3) (2 3)) ! 706: ("inspect .*do\n.*begin\n.*end.*@" (2 3) (0 0)) ! 707: ("inspect .*do\n.*begin\n.*\n.*end.*@" (2 0) (0 0)) ! 708: ("inspect .*do.*begin@" (0 0) (2 3)) ! 709: ("inspect .*do.*begin\n.*end.*@" (2 3) (0 0)) ! 710: ("inspect .*do.*begin\n.*@" (2 3) (2 3)) ! 711: ("inspect .*do.*begin\n.*\n.*end.*;@" (2 0) (0 0)) ! 712: ("inspect .*;@" (0 0) (0 0)) ! 713: ("inspect .*@" (0 0) (0 3)) ! 714: ("otherwise@" (0 0) (0 3)) ! 715: ("otherwise\n.*begin@" (0 3) (2 3)) ! 716: ("otherwise\n.*begin\n.*end.*@" (2 3) (0 0)) ! 717: ("otherwise\n.*begin\n.*@" (2 3) (2 3)) ! 718: ("otherwise\n.*begin\n.*\n.*end.*@" (2 0) (0 0)) ! 719: ("otherwise .*begin .*end.*@" (0 0) (0 0)) ! 720: ("otherwise .*begin.*@" (0 0) (2 3)) ! 721: ("otherwise .*begin\n.*end.*@" (2 3) (0 0)) ! 722: ("otherwise .*begin\n.*@" (2 3) (2 3)) ! 723: ("otherwise .*begin\n.*\n.*end.*@" (2 0) (0 0)) ! 724: ("when .*do@" (0 3) (0 6)) ! 725: ("when .*do.*;@" (0 3) (0 0)) ! 726: ("when .*do.*@" (0 3) (0 3)) ! 727: ("when .*do\n.*begin@" (0 6) (2 3)) ! 728: ("when .*do\n.*begin\n.*end;@" (2 3) (0 0)) ! 729: ("when .*do\n.*begin\n.*@" (2 3) (2 3)) ! 730: ("when .*do\n.*begin\n.*\n.*end;@" (2 0) (0 0)) ! 731: ("when .*do\n.*begin\n.*\n.*end@" (2 0) (0 3)) ! 732: ("when .*do\n.*begin .*end;@" (0 6) (0 0)) ! 733: ("when .*do\n.*begin .*end@" (0 6) (0 3))))) ! 734: ! 735: (defun simula-Simed-indent-mode () ! 736: ;;Should only indent after begin, so this is a overkill ! 737: ;;Hopefully, I'll do better when I care for it. ! 738: (interactive) ! 739: (setq Simula-While-Form ! 740: '( ("while .*do.*begin\n.*\nend;@" (1 0) (0 0)) ! 741: ("while .*do.*begin\n.*@" (1 3) (1 3)) ! 742: ("while .*do.*begin.*@" (0 0) (1 3)) ! 743: ("while .*do\n.*begin\n.*\n.*end;@" (1 0) (0 0)) ! 744: ("while .*do\n.*begin\n.*@" (2 3) (2 3)) ! 745: ("while .*do\n.*begin@" (1 0) (1 3)) ! 746: ("while .*do\n.*;@" (1 3) (0 0)) ! 747: ("while .*do\n.*@" (1 3) (1 3)) ! 748: ("while .*do@" (0 0) (1 0)))) ! 749: (setq Simula-Default-Form ! 750: '( ("begin.*end;@" (0 0) (0 0)) ! 751: ("begin.*@" (0 0) (2 3)) ! 752: ("begin\n.*\nend" (0 0) (0 0)) ! 753: ("begin\n.*end;@" (2 3) (0 0)) ! 754: ("begin\n.*@" (2 3) (2 3)) ! 755: ("begin\n*.*\n*.*@" (2 3) (2 3)) ! 756: (".*;@" (0 0) (0 0)) ! 757: ("\n.*;@" (0 0) (0 0)) ! 758: ("\n.*@" (0 0) (0 0)) ! 759: ("." (0 0) (0 3)))) ! 760: (setq Simula-If-Form ! 761: '( ("if .*begin.*@" (0 0) (0 3)) ! 762: ("if .*else@" (0 0) (0 0)) ! 763: ("if .*;@" (0 0) (0 0)) ! 764: ("if .*@" (0 0) (0 0)) ! 765: ("if .*begin.*\n.*@" (0 3) (0 3)) ! 766: ("if .*\n.*;@" (0 3) (0 0)) ! 767: ("if .*\n.*begin.*end.*@" (0 0) (0 0)) ! 768: ("if .*\n.*begin.*@" (0 0) (0 3)) ! 769: ("if .*else\n.*@" (0 0) (0 0)) ! 770: ("if .*\n.*begin.*\n.*@" (0 3) (0 3)) ! 771: ("if .*\n.*begin.*\n.*\n.*end.*@" (0 0) (0 0)) ! 772: ("if .*begin.*\n.*\n.*end;.*@" (0 0) (0 0)) ! 773: ("if .*begin.*\n.*\n.*end@" (0 0) (0 0)) ! 774: ("else if.*@" (0 0) (0 0)) ! 775: ("else@" (0 0) (0 0)) ! 776: ("else.*begin.*@" (0 0) (0 3)) ! 777: ("else.*begin.*\n.*@" (0 3) (0 3)) ! 778: ("else.*begin.*\n.*\n.*end;@" (0 0) (0 0)) ! 779: ("else .*;@" (0 0) (0 0)) ! 780: ("else\n.*begin@" (0 0) (0 3)) ! 781: ("else\n.*begin\n.*@" (0 3) (0 3)) ! 782: ("else\n.*begin\n.*\n.*end.*@" (0 0) (0 0)))) ! 783: (setq Simula-For-Form ! 784: '( ("for .*do.*;@" (0 0) (0 0)) ! 785: ("for .*do@" (0 0) (0 0)) ! 786: ("for .*do\n.*begin@" (0 0) (0 3)) ! 787: ("for .*do\n.*begin\n.*@" (0 3) (0 3)) ! 788: ("for .*do\n.*begin\n.*\n.*end.*@" (0 0) (0 0)) ! 789: ("for .*do\n.*;@" (0 3) (0 0)) ! 790: ("for .*do\n.*begin.*\n.*end.*@" (0 0) (0 0)) ! 791: ("for .*do.*begin@" (0 0) (0 3)) ! 792: ("for .*do.*begin\n.*end.*@" (0 3) (0 0)) ! 793: ("for .*do.*begin\n.*@" (0 3) (0 3)) ! 794: ("for .*do.*begin\n.*\n.*end.*@" (0 0) (0 0)))) ! 795: (setq Simula-Inspect-Form ! 796: '( ("inspect .*do.*;@" (0 0) (0 0)) ! 797: ("inspect .*do@" (0 0) (0 0)) ! 798: ("inspect .*do\n.*begin.*end.*@" (0 3) (0 0)) ! 799: ("inspect .*do\n.*begin.*@" (0 0) (0 3)) ! 800: ("inspect .*do\n.*begin\n.*end.*@" (0 0) (0 0)) ! 801: ("inspect .*do\n.*begin\n.*\n.*end.*@" (0 0) (0 0)) ! 802: ("inspect .*do.*begin@" (0 0) (0 3)) ! 803: ("inspect .*do.*begin\n.*end.*@" (0 3) (0 0)) ! 804: ("inspect .*do.*begin\n.*@" (0 3) (0 3)) ! 805: ("inspect .*do.*begin\n.*\n.*end.*;@" (0 0) (0 0)) ! 806: ("inspect .*;@" (0 0) (0 0)) ! 807: ("inspect .*@" (0 0) (0 0)) ! 808: ("otherwise@" (0 0) (0 0)) ! 809: ("otherwise\n.*begin@" (0 0) (0 3)) ! 810: ("otherwise\n.*begin\n.*end.*@" (0 3) (0 0)) ! 811: ("otherwise\n.*begin\n.*@" (0 3) (0 3)) ! 812: ("otherwise\n.*begin\n.*\n.*end.*@" (0 0) (0 0)) ! 813: ("otherwise .*begin .*end.*@" (0 0) (0 0)) ! 814: ("otherwise .*begin.*@" (0 0) (0 3)) ! 815: ("otherwise .*begin\n.*end.*@" (0 3) (0 0)) ! 816: ("otherwise .*begin\n.*@" (0 3) (0 3)) ! 817: ("otherwise .*begin\n.*\n.*end.*@" (0 0) (0 0)) ! 818: ("when .*do@" (0 0) (0 0)) ! 819: ("when .*do.*;@" (0 0) (0 0)) ! 820: ("when .*do.*@" (0 0) (0 0)) ! 821: ("when .*do\n.*begin@" (0 0) (0 3)) ! 822: ("when .*do\n.*begin\n.*end;@" (0 3) (0 0)) ! 823: ("when .*do\n.*begin\n.*@" (0 3) (0 3)) ! 824: ("when .*do\n.*begin\n.*\n.*end;@" (0 0) (0 0)) ! 825: ("when .*do\n.*begin\n.*\n.*end@" (0 0) (0 0)) ! 826: ("when .*do\n.*begin .*end;@" (0 3) (0 0)) ! 827: ("when .*do\n.*begin .*end@" (0 3) (0 0)))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.