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