1 | ;;
|
---|
2 | ;; SC.el: stuff for formatting files in the SC libraries
|
---|
3 | ;;
|
---|
4 | ;; Copyright (C) 1996 Limit Point Systems, Inc.
|
---|
5 | ;;
|
---|
6 | ;; Author: Curtis Janssen <cljanss@ca.sandia.gov>
|
---|
7 | ;; Maintainer: SNL
|
---|
8 | ;;
|
---|
9 | ;; This file is part of MPQC.
|
---|
10 | ;;
|
---|
11 | ;; MPQC is free software; you can redistribute it and/or modify
|
---|
12 | ;; it under the terms of the GNU General Public License as published by
|
---|
13 | ;; the Free Software Foundation; either version 2, or (at your option)
|
---|
14 | ;; any later version.
|
---|
15 | ;;
|
---|
16 | ;; MPQC is distributed in the hope that it will be useful,
|
---|
17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
19 | ;; GNU General Public License for more details.
|
---|
20 | ;;
|
---|
21 | ;; You should have received a copy of the GNU General Public License
|
---|
22 | ;; along with the MPQC; see the file COPYING. If not, write to
|
---|
23 | ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
24 | ;;
|
---|
25 | ;; The U.S. Government is granted a limited license as per AL 91-7.
|
---|
26 | ;;
|
---|
27 |
|
---|
28 | (require 'cc-mode)
|
---|
29 | (cond ((> emacs-major-version 19) (c-initialize-cc-mode)))
|
---|
30 |
|
---|
31 | (setq clj-c-basic-half-offset 2)
|
---|
32 |
|
---|
33 | (defun clj-adaptive-block-open (langelem)
|
---|
34 | ;; when substatement is on semantics list, return
|
---|
35 | ;; -(c-basic-offset - clj-c-basic-half-offset) to give a
|
---|
36 | ;; total offset of clj-c-basic-half-offset,
|
---|
37 | ;; otherwise return clj-c-basic-half-offset
|
---|
38 | (if (assq 'substatement c-semantics)
|
---|
39 | (+ clj-c-basic-half-offset (- c-basic-offset))
|
---|
40 | clj-c-basic-half-offset))
|
---|
41 |
|
---|
42 | (defun clj-lineup-math (langelem)
|
---|
43 | ;; line up math statement-cont so that stuff after the "+", "-", etc
|
---|
44 | ;; lines up with the stuff after the equals
|
---|
45 | (save-excursion
|
---|
46 | (let ((adjustment (progn
|
---|
47 | (beginning-of-line)
|
---|
48 | (skip-chars-forward " \t" (c-point 'eol))
|
---|
49 | (- (current-column)
|
---|
50 | (progn (skip-chars-forward " \t+-/*" (c-point 'eol))
|
---|
51 | (current-column)))))
|
---|
52 | (curcol (progn
|
---|
53 | (goto-char (cdr langelem))
|
---|
54 | (current-column))))
|
---|
55 | (skip-chars-forward "^=" (c-point 'eol))
|
---|
56 | (if (/= (following-char) ?=)
|
---|
57 | ;; there's no equal sign on the line
|
---|
58 | c-basic-offset
|
---|
59 | ;; calculate indentation column after equals and ws and sign
|
---|
60 | (forward-char 1)
|
---|
61 | (skip-chars-forward " \t-")
|
---|
62 | (+ (- (current-column) curcol) adjustment))
|
---|
63 | )))
|
---|
64 |
|
---|
65 | (defun clj-adaptive-block-close (langelem)
|
---|
66 | ;; these closes blocks in a way that is consistent with the way
|
---|
67 | ;; clj-adaptive-statement-block-intro indents the first statement
|
---|
68 | (- (clj-adaptive-statement-block-intro langelem)
|
---|
69 | (- c-basic-offset clj-c-basic-half-offset))
|
---|
70 | )
|
---|
71 |
|
---|
72 | (defun clj-adaptive-statement-block-intro (langelem)
|
---|
73 | ;; this lines up the first statement in a block by a full basic
|
---|
74 | ;; offset, unless we are lining up to a "{" which is already
|
---|
75 | ;; half indented
|
---|
76 | (save-excursion
|
---|
77 | (progn
|
---|
78 | (goto-char (cdr langelem))
|
---|
79 | (if (/= (following-char) ?{)
|
---|
80 | ;; next char is not a "{"
|
---|
81 | c-basic-offset
|
---|
82 | ;; use remainder of half offset
|
---|
83 | (- c-basic-offset clj-c-basic-half-offset))
|
---|
84 | )))
|
---|
85 |
|
---|
86 | (defun clj-condensed-adaptive-statement-block-intro (langelem)
|
---|
87 | ;; this lines up the first statement in a block by a full basic
|
---|
88 | ;; offset, unless we are lining up to a "{" which is already
|
---|
89 | ;; indented
|
---|
90 | (save-excursion
|
---|
91 | (progn
|
---|
92 | (goto-char (cdr langelem))
|
---|
93 | (if (/= (following-char) ?{)
|
---|
94 | ;; next char is not a "{"
|
---|
95 | c-basic-offset
|
---|
96 | ;; we're already indendted
|
---|
97 | 0)
|
---|
98 | )))
|
---|
99 |
|
---|
100 | (defun clj-condensed-adaptive-block-close (langelem)
|
---|
101 | ;; these closes blocks in a way that is consistent with the way
|
---|
102 | ;; clj-condensed-adaptive-statement-block-intro indents the first statement
|
---|
103 | (clj-condensed-adaptive-statement-block-intro langelem)
|
---|
104 | )
|
---|
105 |
|
---|
106 | ;;
|
---|
107 | ;; this is the style to use when editting Ed's files
|
---|
108 | ;;
|
---|
109 | (c-add-style "ETS" '((c-basic-offset . 2)
|
---|
110 | (c-offsets-alist . ((access-label . -)
|
---|
111 | (inclass . ++)
|
---|
112 | (label . 0)
|
---|
113 | ))
|
---|
114 | )
|
---|
115 | )
|
---|
116 |
|
---|
117 | ;;
|
---|
118 | ;; this is the style to use when editing Curt's files
|
---|
119 | ;;
|
---|
120 | (c-add-style "CLJ" '(
|
---|
121 | (c-offsets-alist . (
|
---|
122 | (block-open . clj-adaptive-block-open)
|
---|
123 | (statement . c-lineup-runin-statements)
|
---|
124 | (statement-cont . clj-lineup-math)
|
---|
125 | (statement-block-intro . clj-adaptive-statement-block-intro)
|
---|
126 | (defun-block-intro . 2)
|
---|
127 | (inher-intro . 2)
|
---|
128 | (access-label . -2)
|
---|
129 | (block-close . clj-adaptive-block-close)
|
---|
130 | (member-init-intro . 2)
|
---|
131 | )
|
---|
132 | ))
|
---|
133 | )
|
---|
134 |
|
---|
135 | ;;
|
---|
136 | ;; Curt's other style
|
---|
137 | ;;
|
---|
138 | (c-add-style "CLJ-CONDENSED" '(
|
---|
139 | ;(c-echo-syntactic-information-p . t)
|
---|
140 | (c-basic-offset . 2)
|
---|
141 | (c-offsets-alist . (
|
---|
142 | (statement-block-intro . clj-condensed-adaptive-statement-block-intro)
|
---|
143 | (statement-cont . c-lineup-math)
|
---|
144 | (inclass . ++)
|
---|
145 | (access-label . -)
|
---|
146 | (block-close . clj-condensed-adaptive-statement-block-intro)
|
---|
147 | (substatement-open . +)
|
---|
148 | (block-open . +)
|
---|
149 | )
|
---|
150 | ))
|
---|
151 | )
|
---|
152 |
|
---|
153 | (defun clj-condensed-style ()
|
---|
154 | "Change to condensed C indentation"
|
---|
155 | (interactive)
|
---|
156 | (c-set-style "CLJ-CONDENSED")
|
---|
157 | )
|
---|
158 | (defun clj-style ()
|
---|
159 | "Change to insane C indentation"
|
---|
160 | (interactive)
|
---|
161 | (c-set-style "CLJ")
|
---|
162 | )
|
---|
163 | (defun ets-style ()
|
---|
164 | "Change to sensible C indentation"
|
---|
165 | (interactive)
|
---|
166 | (c-set-style "ETS")
|
---|
167 | )
|
---|
168 |
|
---|
169 | (define-key c-mode-map "\C-ce" 'ets-style)
|
---|
170 | (define-key c-mode-map "\C-cj" 'clj-style)
|
---|
171 | (define-key c-mode-map "\C-cc" 'clj-condensed-style)
|
---|
172 | (define-key c-mode-map "\C-j" 'reindent-then-newline-and-indent)
|
---|
173 | (define-key c-mode-map "\C-m" 'newline-and-indent)
|
---|
174 |
|
---|
175 | (define-key c++-mode-map "\C-ce" 'ets-style)
|
---|
176 | (define-key c++-mode-map "\C-cj" 'clj-style)
|
---|
177 | (define-key c++-mode-map "\C-cc" 'clj-condensed-style)
|
---|
178 | (define-key c++-mode-map "\C-j" 'reindent-then-newline-and-indent)
|
---|
179 | (define-key c++-mode-map "\C-m" 'newline-and-indent)
|
---|
180 |
|
---|
181 | (define-key java-mode-map "\C-ce" 'ets-style)
|
---|
182 | (define-key java-mode-map "\C-cj" 'clj-style)
|
---|
183 | (define-key java-mode-map "\C-cc" 'clj-condensed-style)
|
---|
184 | (define-key java-mode-map "\C-j" 'reindent-then-newline-and-indent)
|
---|
185 | (define-key java-mode-map "\C-m" 'newline-and-indent)
|
---|
186 |
|
---|
187 | ;;
|
---|
188 | ;; stuff for CLJ's compile hacks
|
---|
189 | ;;
|
---|
190 |
|
---|
191 | (defun compile-modify-path (thisdir)
|
---|
192 | (let ((tmpdir (expand-file-name thisdir)))
|
---|
193 | (setq thisdir "")
|
---|
194 | (while (>= (length tmpdir) (length sc-src-dir))
|
---|
195 | (if (string= (substring tmpdir 0 (length sc-src-dir)) sc-src-dir)
|
---|
196 | (let ()
|
---|
197 | (setq thisdir (concat thisdir sc-arch-dir))
|
---|
198 | (setq tmpdir (substring tmpdir (length sc-src-dir) nil))
|
---|
199 | )
|
---|
200 | (let ()
|
---|
201 | (setq thisdir (concat thisdir (substring tmpdir 0 1)))
|
---|
202 | (setq tmpdir (substring tmpdir 1 nil))
|
---|
203 | )
|
---|
204 | )
|
---|
205 | )
|
---|
206 | (setq thisdir (concat thisdir tmpdir))
|
---|
207 | )
|
---|
208 | thisdir
|
---|
209 | )
|
---|
210 |
|
---|
211 | ;;
|
---|
212 | ;; stuff for inserting copyleft notices
|
---|
213 | ;;
|
---|
214 |
|
---|
215 | (defvar copyleft-owner "Limit Point Systems, Inc."
|
---|
216 | "This is the owner of the copyleft. Defaults to LPS.")
|
---|
217 |
|
---|
218 | (defun set-copyleft-owner (owner)
|
---|
219 | "Set the copyleft-owner variable."
|
---|
220 | (interactive (list (read-from-minibuffer "Copyleft Owner: "
|
---|
221 | copyleft-owner nil nil nil)))
|
---|
222 | (setq copyleft-owner owner))
|
---|
223 |
|
---|
224 | (defvar copyleft-author user-full-name
|
---|
225 | "This is the author of the file. Defaults to the user editing the file.")
|
---|
226 |
|
---|
227 | (defun set-copyleft-author (author)
|
---|
228 | "Set the copyleft-author variable."
|
---|
229 | (interactive (list (read-from-minibuffer "Author: "
|
---|
230 | copyleft-author nil nil nil)))
|
---|
231 | (setq copyleft-author author))
|
---|
232 |
|
---|
233 | (defvar copyleft-address user-mail-address
|
---|
234 | "This is the email address of the author of the file. Defaults to the
|
---|
235 | address of the user editing the file.")
|
---|
236 |
|
---|
237 | (defun set-copyleft-address (address)
|
---|
238 | "Set the copyleft-address variable."
|
---|
239 | (interactive (list (read-from-minibuffer "E-mail address: "
|
---|
240 | copyleft-address nil nil nil)))
|
---|
241 | (setq copyleft-address address))
|
---|
242 |
|
---|
243 | (defvar copyleft-maintainer "LPS"
|
---|
244 | "This is the official maintaner of the file. Defaults to LPS")
|
---|
245 |
|
---|
246 | (defun set-copyleft-maintainer (maintainer)
|
---|
247 | "Set the copyleft-maintainer variable."
|
---|
248 | (interactive (list (read-from-minibuffer "Maintainer: "
|
---|
249 | copyleft-maintainer nil nil nil)))
|
---|
250 | (setq copyleft-maintainer maintainer))
|
---|
251 |
|
---|
252 | (defvar copyleft-default-comment-start "#"
|
---|
253 | "The default symbol to use to begin a comment. Defaults to \"#\".")
|
---|
254 |
|
---|
255 | (defvar copyleft-default-comment-cont "#"
|
---|
256 | "The default symbol to use to continue a comment. Defaults to \"#\".")
|
---|
257 |
|
---|
258 | (defvar copyleft-default-comment-end "#"
|
---|
259 | "The default symbol to use to end a comment. Defaults to \"#\".")
|
---|
260 |
|
---|
261 | (defun copyleft-set-comments (start cont end)
|
---|
262 | "Set the comment symbols.
|
---|
263 |
|
---|
264 | (copyleft-set-comments START CONT END)"
|
---|
265 | (interactive (list (read-from-minibuffer "Comment start: "
|
---|
266 | copyleft-default-comment-start nil nil nil)
|
---|
267 | (read-from-minibuffer "Comment continue: "
|
---|
268 | copyleft-default-comment-cont nil nil nil)
|
---|
269 | (read-from-minibuffer "Comment end: "
|
---|
270 | copyleft-default-comment-end nil nil nil)
|
---|
271 | ))
|
---|
272 |
|
---|
273 | (setq copyleft-default-comment-start start)
|
---|
274 | (setq copyleft-default-comment-cont cont)
|
---|
275 | (setq copyleft-default-comment-end end)
|
---|
276 | )
|
---|
277 |
|
---|
278 | (defun insert-copyleft ()
|
---|
279 | "Insert the notice."
|
---|
280 | (interactive)
|
---|
281 | (set-window-point (display-buffer (current-buffer)) (point-min))
|
---|
282 | (cond ((eq major-mode 'c++-mode)
|
---|
283 | (setq comment-start "//")
|
---|
284 | (setq comment-cont "//")
|
---|
285 | (setq comment-end "//")
|
---|
286 | )
|
---|
287 | ((eq major-mode 'c-mode)
|
---|
288 | (setq comment-start "/*")
|
---|
289 | (setq comment-cont " *")
|
---|
290 | (setq comment-end " */")
|
---|
291 | )
|
---|
292 | ((eq major-mode 'emacs-lisp-mode)
|
---|
293 | (setq comment-start ";;")
|
---|
294 | (setq comment-cont ";;")
|
---|
295 | (setq comment-end ";;")
|
---|
296 | )
|
---|
297 | ((eq major-mode 'makefile-mode)
|
---|
298 | (setq comment-start "#")
|
---|
299 | (setq comment-cont "#")
|
---|
300 | (setq comment-end "#")
|
---|
301 | )
|
---|
302 | ('t
|
---|
303 | (setq comment-start copyleft-default-comment-start)
|
---|
304 | (setq comment-cont copyleft-default-comment-cont)
|
---|
305 | (setq comment-end copyleft-default-comment-end)
|
---|
306 | )
|
---|
307 | )
|
---|
308 |
|
---|
309 | (setq description (read-from-minibuffer "Description: "))
|
---|
310 |
|
---|
311 | (insert comment-start "\n")
|
---|
312 | (insert comment-cont " " (file-name-nondirectory buffer-file-name)
|
---|
313 | (cond ((not (string= description "")) (concat " --- " description "\n"))
|
---|
314 | ('t "\n")))
|
---|
315 | (insert comment-cont "\n")
|
---|
316 | (insert comment-cont " Copyright (C) "
|
---|
317 | (substring (current-time-string) 20) " "
|
---|
318 | copyleft-owner "\n")
|
---|
319 | (insert comment-cont "\n")
|
---|
320 | (insert comment-cont " Author: " copyleft-author " <" copyleft-address ">\n")
|
---|
321 | (insert comment-cont " Maintainer: " copyleft-maintainer "\n")
|
---|
322 | (insert comment-cont "\n")
|
---|
323 | (insert comment-cont " This file is part of the SC Toolkit.\n")
|
---|
324 | (insert comment-cont "\n")
|
---|
325 |
|
---|
326 | (insert comment-cont " The SC Toolkit is free software; you can redistribute it and/or modify\n")
|
---|
327 | (insert comment-cont " it under the terms of the GNU Library General Public License as published by\n")
|
---|
328 | (insert comment-cont " the Free Software Foundation; either version 2, or (at your option)\n")
|
---|
329 | (insert comment-cont " any later version.\n")
|
---|
330 | (insert comment-cont "\n")
|
---|
331 |
|
---|
332 | (insert comment-cont " The SC Toolkit is distributed in the hope that it will be useful,\n")
|
---|
333 | (insert comment-cont " but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
|
---|
334 | (insert comment-cont " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n")
|
---|
335 | (insert comment-cont " GNU Library General Public License for more details.\n")
|
---|
336 | (insert comment-cont "\n")
|
---|
337 |
|
---|
338 | (insert comment-cont " You should have received a copy of the GNU Library General Public License\n")
|
---|
339 | (insert comment-cont " along with the SC Toolkit; see the file COPYING.LIB. If not, write to\n")
|
---|
340 | (insert comment-cont " the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.\n")
|
---|
341 | (insert comment-cont "\n")
|
---|
342 |
|
---|
343 | (insert comment-cont " The U.S. Government is granted a limited license as per AL 91-7.\n")
|
---|
344 | (insert comment-end "\n")
|
---|
345 | )
|
---|
346 |
|
---|
347 | (define-key c-mode-map "\C-ci" 'insert-copyleft)
|
---|
348 | (define-key c++-mode-map "\C-ci" 'insert-copyleft)
|
---|
349 | (define-key java-mode-map "\C-ci" 'insert-copyleft)
|
---|