Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2701 views
1
;; spreadsheet in S, S-mode or stand-alone
2
;; Richard M. Heiberger
3
;; 1996
4
5
;; S-mode
6
;; Load this file from a running *S* window after starting S/Splus with M-x S
7
;; or
8
;; stand-alone
9
;; Load this file from the dired window in which .Data exists.
10
11
12
;(set-variable 'buffers-menu-max-size nil)
13
14
15
(defvar spread-directory (concat "/tmp/" (make-temp-name "spr"))
16
"Directory in which to store ascii spreadsheet displays.")
17
18
(defvar spread-command-file (concat spread-directory "/*command*")
19
"File through which S will communicate with emacs.")
20
21
(defvar spread-directory-p nil
22
"predicate value non-nil when directory has been defined.")
23
24
(defun print-find-emacs nil "display spread.frame from minibuffer" (interactive)
25
(spread-print-find (read-string "spread.frame: ") t))
26
27
28
(defun emacs-rc nil "" (interactive)
29
(emacs-cell "1")
30
)
31
32
(defun emacs-macro nil "" (interactive)
33
(emacs-cell "2")
34
)
35
36
(defun emacs-macro-control-text nil "" (interactive)
37
(emacs-cell "4")
38
)
39
40
(defun emacs-macro-print-text nil "" (interactive)
41
(emacs-cell "5")
42
)
43
44
(defun emacs-cell (result-type) "" (interactive)
45
(setq spread-name (buffer-name))
46
(setq r (count-lines 1 (point)))
47
(setq c (current-column))
48
(set-buffer S-buffer)
49
(spread-insert
50
(format "emacs.cell('%s', %s, %s, %s)"
51
spread-name r c result-type
52
)
53
)
54
(save-excursion
55
(set-buffer "*command*")
56
(revert-t-t)
57
(goto-char (point-min))
58
(setq beg (point)) (end-of-line)
59
(if (equal result-type "4")
60
(progn
61
(setq command (buffer-substring beg (point)))
62
(set-buffer S-buffer)
63
(spread-insert command)
64
)
65
(setq command (read-string "> " (buffer-substring beg (point))))
66
(set-buffer S-buffer)
67
(spread-insert command)
68
(spread-insert "invisible(assign(.Active, x))")
69
(spread-print-find spread-name nil)
70
(goto-line r)(forward-char c)
71
))
72
)
73
74
(defun spread-insert (spread-command) "" (interactive)
75
(goto-char (point-max))
76
(insert spread-command)
77
(comint-send-input)
78
(accept-process-output spread-process)
79
)
80
81
(defun revert-t-t nil "revert-buffer with no questions asked"
82
(interactive)
83
(revert-buffer t t)
84
)
85
86
(defun revert-t-t-read-only nil "revert-buffer, no questions, read-only"
87
(interactive)
88
(revert-buffer t t)
89
(setq buffer-read-only t)
90
)
91
92
93
(defvar spread-mode-map nil "Keymap for Spread mode.")
94
(if spread-mode-map
95
nil
96
(setq spread-mode-map (make-sparse-keymap))
97
(define-key spread-mode-map "\C-cv" 'revert-t-t-read-only)
98
(define-key spread-mode-map "\C-m" 'emacs-rc)
99
(define-key spread-mode-map "\C-cc" 'emacs-macro)
100
(define-key spread-mode-map "\C-cs" 'emacs-macro-control-text)
101
(define-key spread-mode-map "\C-cp" 'emacs-macro-print-text)
102
(define-key spread-mode-map "f" 'emacs-print-find-emacs)
103
104
(define-key spread-mode-map [mouse-2] 'spread-mouse-print-find-emacs)
105
(define-key spread-mode-map [mouse-3] 'spread-mouse-rc)
106
)
107
108
(defun spread-mouse-rc (event) "move point then enter"
109
(interactive "e")
110
(mouse-set-point event)
111
(emacs-rc)
112
)
113
114
(defun spread-mouse-print-find-emacs (event) "move point then find file"
115
(interactive "e")
116
(mouse-set-point event)
117
(emacs-print-find-emacs)
118
)
119
120
(defun spread-mode () "Major mode for spreadsheets.\\{spread-mode-map}"
121
(interactive)
122
(kill-all-local-variables)
123
(make-local-variable 'beg)
124
(make-local-variable 'command)
125
(use-local-map spread-mode-map)
126
(setq mode-name "Spread")
127
(setq major-mode 'spread-mode)
128
(if (equal (buffer-name) ".Registry") (spread-highlight-macro))
129
(setq buffer-read-only t)
130
)
131
132
133
;; from dired.el L547
134
; (put-text-property (point)
135
; (save-excursion
136
; (dired-move-to-end-of-filename)
137
; (point))
138
; 'mouse-face 'highlight)
139
;
140
;; (put-text-property (point) (mark) 'mouse-face 'highlight)
141
142
143
(defun spread-highlight-macro nil
144
"highlight spread.frame names for mouse access"
145
(interactive)
146
(save-excursion
147
(goto-char (point-min))
148
(search-forward "**macro**")(forward-char)
149
150
(toggle-read-only -1)
151
(while (progn
152
(setq beg (point))(end-of-line)
153
(not (= beg (point)))
154
)
155
(put-text-property beg (1-(point)) 'mouse-face 'highlight)
156
(forward-char)
157
)
158
(toggle-read-only 1)
159
)
160
(save-buffer)
161
)
162
163
(defun emacs-print-find-emacs nil "" (interactive)
164
(beginning-of-line)
165
(setq beg (point)) (end-of-line) (backward-char)
166
(setq spread-name (buffer-substring beg (point)))
167
(spread-print-find spread-name nil)
168
)
169
170
171
172
173
(defun find-spread-frame-directory nil
174
"Locate directory in which spread.frame functions are stored."
175
(list-command-history)
176
(set-buffer "*Command History*")
177
(goto-char (point-min))
178
(search-forward "(load-file ")
179
(goto-char (1+ (match-end 0)))(setq beg (point))
180
(end-of-line)(search-backward "/")
181
(goto-char (match-end 0))
182
(setq spread-frame-directory
183
(expand-file-name (buffer-substring beg (point))))
184
(kill-buffer "*Command History*")
185
)
186
187
(defvar inferior-spread-mode nil
188
"Non-nil if using inferior-spread-mode as a minor mode of some other mode.")
189
(make-variable-buffer-local 'inferior-spread-mode)
190
(put 'inferior-spread-mode 'permanent-local t)
191
(or (assq 'inferior-spread-mode minor-mode-alist)
192
(setq minor-mode-alist (append minor-mode-alist
193
(list '(inferior-spread-mode " spread")))))
194
195
(defvar inferior-spread-mode-map nil)
196
(if inferior-spread-mode-map
197
nil
198
(setq inferior-spread-mode-map (make-sparse-keymap))
199
(define-key inferior-spread-mode-map "\C-cv" 'revert-t-t)
200
(define-key inferior-spread-mode-map "\C-cr" 'print-find-emacs))
201
202
203
(or (assq 'inferior-spread-mode minor-mode-map-alist)
204
(setq minor-mode-map-alist
205
(cons (cons 'inferior-spread-mode inferior-spread-mode-map)
206
minor-mode-map-alist)))
207
208
(defun inferior-spread-mode (&optional arg)
209
"Toggle Inferior Spread mode.
210
With arg, turn Inferior Spread mode on if arg is positive, off otherwise."
211
(interactive "P")
212
(setq inferior-spread-mode
213
(if (null arg) (not inferior-spread-mode)
214
(> (prefix-numeric-value arg) 0)))
215
(if inferior-spread-mode
216
(progn
217
(set-process-filter spread-process 'comint-output-filter)
218
(set-variable 'comint-output-filter-functions
219
'(spread-output-filter
220
comint-postoutput-scroll-to-bottom))
221
(set-variable 'comint-scroll-to-bottom-on-output "this")
222
(set-variable 'comint-scroll-show-maximum-output t)
223
(force-mode-line-update))
224
(message "Don't know how to turn off Inferior Spread mode")))
225
226
227
(defun spread-process ()
228
"Start stand-alone S process to run spread."
229
(comint-run S-program)
230
(setq spread-process (get-buffer-process (current-buffer)))
231
(setq comint-prompt-regexp shell-prompt-pattern)
232
(if (not(file-writable-p ".Data/.Audit"))
233
(accept-process-output spread-process))
234
(accept-process-output spread-process)
235
spread-process
236
)
237
238
(defun spread-output-filter (str)
239
"detect errors in S output"
240
(if (or
241
(string-match "Dumped" str)
242
(string-match "Error" str)
243
)
244
(progn
245
(switch-to-buffer-other-window S-buffer)
246
(comint-show-maximum-output)
247
(set-variable 'quit-flag t); beeps and writes "quit" in the message area
248
)
249
)
250
)
251
252
253
254
255
256
(defun spread-print-find (spread-name update-Registry)
257
"Place SPREAD-NAME in foreground of S-buffer (*S* or *Splus*),
258
update .Registry and revert buffer when UPDATE-REGISTRY is t,
259
print all views of spread.frame associated with SPREAD-NAME in .Registry
260
to /tmp/spr***** directory, and find or revert all views into emacs buffers."
261
(interactive)
262
(set-buffer S-buffer)
263
(spread-insert
264
(format "print.find.emacs('%s', update.Registry=%s)"
265
spread-name (if update-Registry "T" "F")))
266
(if update-Registry
267
(save-excursion (spread-find-file ".Registry")))
268
(spread-print-sprds)
269
(switch-to-buffer spread-name)
270
)
271
272
(defun spread-print-sprds () "Display in buffers all views of spread.frame"
273
(interactive)
274
(save-excursion
275
(set-buffer "*command*")
276
(revert-t-t)
277
(goto-char (point-min))
278
279
(while (< (point) (point-max))
280
(set-buffer "*command*")
281
(setq beg (point)) (end-of-line)
282
(setq spread-name-i (buffer-substring beg (point)))
283
(save-excursion (spread-find-file spread-name-i))
284
(forward-line)))
285
)
286
287
(defun spread-find-file (spread-name) "Display one view of spread.frame"
288
(interactive)
289
(switch-to-buffer spread-name)
290
(if (buffer-file-name)
291
(revert-t-t-read-only)
292
(kill-buffer spread-name)
293
(find-file (concat spread-directory "/" spread-name))
294
)
295
(spread-mode)
296
)
297
298
299
(defun spread-start () "load emacs spread.frame handler"
300
301
(if (equal major-mode 'inferior-S-mode)
302
(progn
303
(setq spread-mode "S-mode")
304
(setq S-buffer (current-buffer)))
305
(if (equal major-mode 'dired-mode)
306
(progn
307
(setq spread-mode "stand-alone")
308
(setq S-program (read-string "Splus or S? " "Splus"))
309
(setq S-buffer (concat "*" (file-name-nondirectory S-program) "*"))
310
(if (not (get-buffer S-buffer))
311
(get-buffer-create S-buffer))
312
(if (get-buffer-process S-buffer) (set-variable 'quit-flag t)))
313
(set-variable 'quit-flag t)))
314
315
(setq spread-home-directory default-directory)
316
(find-spread-frame-directory)
317
(if (not spread-directory-p)
318
(progn (make-directory spread-directory)
319
(setq spread-directory-p t)))
320
(set-buffer S-buffer)
321
(cd spread-home-directory)
322
(setq spread-process
323
(if (equal spread-mode "stand-alone")
324
(spread-process)
325
(get-buffer-process (current-buffer))))
326
(inferior-spread-mode 1)
327
(spread-insert
328
(format "assign('.spread.Data',attach('%s.Data'),frame=0)"
329
spread-frame-directory))
330
(spread-insert
331
(format "emacs.start('%s')" spread-directory))
332
(find-file spread-command-file)
333
(spread-find-file ".Registry")
334
)
335
336
;; start it up
337
(spread-start)
338
339