1; cascade-mode.el 2; 3;Emacs major mode for editing Cascade input files 4 5 6; $Id: cascade-mode.el,v 1.2 2001/09/05 17:52:46 dan Exp $ 7; 8; Copyright (c) 2001 Dan McMahill 9; All rights reserved. 10; 11; This code is derived from software written by Dan McMahill 12; 13; Redistribution and use in source and binary forms, with or without 14; modification, are permitted provided that the following conditions 15; are met: 16; 1. Redistributions of source code must retain the above copyright 17; notice, this list of conditions and the following disclaimer. 18; 2. Redistributions in binary form must reproduce the above copyright 19; notice, this list of conditions and the following disclaimer in the 20; documentation and/or other materials provided with the distribution. 21; 3. All advertising materials mentioning features or use of this software 22; must display the following acknowledgement: 23; This product includes software developed by Dan McMahill 24; 4. The name of the author may not be used to endorse or promote products 25; derived from this software without specific prior written permission. 26; 27; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 28; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 29; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 30; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 31; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 32; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 33; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 34; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 35; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37; SUCH DAMAGE. 38; 39 40 41(defconst cascade-mode-version "0.9.1" 42 "Current version of cascade mode.") 43 44(defvar cascade-mode-syntax-table nil 45 "Syntax table used in cascade-mode buffers.") 46 47(defvar cascade-mode-abbrev-table nil 48 "Abbrev table in use in cascade-mode buffers.") 49 50(define-abbrev-table 'cascade-mode-abbrev-table ()) 51 52; (princ (concat "\\<\\(\\$[a-zA-Z][a-zA-Z0-9_\\$]*\\|" 53; (regexp-opt (list 54; "g" "nf" "iip3" "r" 55; "cn0" "n0" "tn" "cn" "bw" )) 56; "\\)\\>" )) 57 58(setq cascade-font-lock-keywords 59 (list 60 '("^[ \t]*[*#;@].*\$". font-lock-comment-face) 61 '("^[ \t]*\\(source\\|defaults\\)" . font-lock-keyword-face) 62 '("\\<\\(\\$[a-zA-Z][a-zA-Z0-9_\\$]*\\|g\\|gp\\|gv\\|rin\\|rout\\|rho\\|Rs\\|nf\\|iip3\\|r\\|cn0\\|n0\\|tn\\|c\\|cn\\|bw\\)\\>" . font-lock-variable-name-face) 63 )) 64; "Expressions to hightlight in Cascade Mode.") 65 66 67;; mode map 68(defvar cascade-mode-map 69 (let ((km (make-sparse-keymap))) 70 (define-key km [return] 'cascade-return) 71 km) 72 "The keymap used in `cascade-mode'.") 73 74 75 76 77(defun cascade-mode () 78 (interactive) 79 (text-mode) 80;; (use-local-map cascade-mode-map) 81 (setq mode-name "Cascade") 82 (setq major-mode 'cascade-mode) 83 (set (make-local-variable 'paragraph-start) (concat "^$\\|" page-delimiter)) 84 (set (make-local-variable 'paragraph-separate) paragraph-start) 85 (set (make-local-variable 'paragraph-ignore-fill-prefix) t) 86 (set (make-local-variable 'require-final-newline) t) 87 (set (make-local-variable 'parse-sexp-ignore-comments) nil) 88 (set (make-local-variable 'comment-start) "* ") 89 (set (make-local-variable 'comment-end) "") 90 (set (make-local-variable 'comment-column) 32) 91 (make-local-variable 'font-lock-keywords) 92 (setq font-lock-keywords cascade-font-lock-keywords) 93 (if cascade-mode-syntax-table 94 () 95 (setq cascade-mode-syntax-table (make-syntax-table)) 96 (modify-syntax-entry ?* "<" cascade-mode-syntax-table) 97 (modify-syntax-entry ?$ "<" cascade-mode-syntax-table) 98 (modify-syntax-entry ?\n ">" cascade-mode-syntax-table) 99 (modify-syntax-entry ?\' "\"" cascade-mode-syntax-table) 100 (set-syntax-table cascade-mode-syntax-table)) 101 (set (make-local-variable 'font-lock-defaults) 102 '(cascade-font-lock-keywords 103 nil t cascade-mode-syntax-table beginning-of-line)) 104 (if window-system (cascade-frame-init)) 105 (run-hooks 'cascade-mode-hook) 106 (if cascade-vers-on-startup (cascade-show-version)) 107) 108 109 110(defun cascade-frame-init () 111 (interactive) 112 ;;(modify-frame-parameters (selected-frame) '((menu-bar-lines . 2))) 113 ;; make a menu keymap 114 (easy-menu-define 115 cascade-mode-menu 116 cascade-mode-map 117 "Cascade menu" 118 '("Cascade" 119 ["Save and go" cascade-not-impl t] 120 "----" 121 ["Version" cascade-show-version t] 122 )) 123 (easy-menu-add cascade-mode-menu cascade-mode-map)) 124 125 126;;; User-changeable variables ================================================= 127 128(defcustom cascade-vers-on-startup t 129 "*If non-nil, show the version number on startup." 130 :group 'cascade 131 :type 'boolean) 132 133 134;;; Utilities ================================================================= 135 136(defun cascade-show-version () 137 "Show the version number in the minibuffer." 138 (interactive) 139 (message "cascade-mode, version %s" cascade-mode-version)) 140 141(defun cascade-not-impl () 142 "Not implemented yet message." 143 (interactive) 144 (message "not implemented yet (sorry.)")) 145 146 147 148(defvar cascade-shell-buffer-name "Cascade" 149 "Name used to create `cascade-shell' mode buffers. 150This name will have *'s surrounding it.") 151 152 153(defun cascade-shell-save-and-go () 154 "Save this CAS file, and evaluate it in a Cascade shell." 155 (interactive) 156 (if (not (eq major-mode 'cascade-mode)) 157 (error "Save and go is only useful in a cascade buffer!")) 158 (let ((fn-name (file-name-sans-extension 159 (file-name-nondirectory (buffer-file-name)))) 160 (msbn (concat "*" cascade-shell-buffer-name "*")) 161 (param "")) 162 (save-buffer) 163 ;; Do we need parameters? 164 (if (save-excursion 165 (goto-char (point-min)) 166 (end-of-line) 167 (forward-sexp -1) 168 (looking-at "([a-zA-Z]")) 169 (setq param (read-string "Parameters: " 170 (car cascade-shell-save-and-go-history) 171 'cascade-shell-save-and-go-history))) 172 ;; No buffer? Make it! 173 (if (not (get-buffer msbn)) (cascade-shell)) 174 ;; Ok, now fun the function in the cascade shell 175 (if (get-buffer-window msbn t) 176 (select-window (get-buffer-window msbn t)) 177 (switch-to-buffer (concat "*" cascade-shell-buffer-name "*"))) 178 (comint-send-string (get-buffer-process (current-buffer)) 179 (concat fn-name " " param "\n")))) 180 181 182(provide 'cascade-mode) 183 184 185 186