0
|
1 ;;; -*- Mode:Emacs-Lisp -*-
|
|
2 ;;; Copyright © 1992-1993 by Lucid, Inc. All Rights Reserved.
|
|
3 ;;; Energize support for the Editor of the Beast, and others.
|
|
4
|
|
5 (evi-define-key '(vi motion ex) "\C-x" 'evi-emacs-command)
|
|
6 (evi-define-key '(vi motion) "\177" 'evi-backward-char)
|
|
7 (evi-define-key '(vi) "\C-z" 'evi-quit-evi)
|
|
8
|
|
9 (evi-define-key '(vi motion top-level) 'button3 'energize-popup-menu)
|
|
10
|
|
11 (setq evi-meta-prefix-char ?\C-a)
|
|
12
|
|
13 (defvar energize-external-editor nil) ; nil, vi, or a string
|
|
14 (defvar energize-internal-editor nil) ; nil or vi
|
|
15 (defvar energize-internal-viewer nil) ; nil, vi, or less
|
|
16 (defvar energize-vi-terminal-emulator nil) ; xterm, shelltool, or cmdtool
|
|
17
|
|
18 (defun ex-quit (discard)
|
|
19 ;; originally defined in evi.el
|
|
20 ;; The old version would exit emacs; this version just kills the current
|
|
21 ;; buffer and deletes the current window (and frame if appropriate.)
|
|
22 (and (not discard) (buffer-file-name) (buffer-modified-p)
|
|
23 (evi-error
|
|
24 "No write since last change (use :quit! to override)"))
|
|
25 ;; #### Since we're unmodifying this buffer with the intent of killing it,
|
|
26 ;; we need to avoid telling Energize that we have unmodified it, or for some
|
|
27 ;; reason it recreates the buffer later. I don't understand...
|
|
28 (let ((energize-buffer-modified-hook nil))
|
|
29 (set-buffer-modified-p nil))
|
|
30 (delete-auto-save-file-if-necessary)
|
|
31 (kill-buffer (current-buffer))
|
|
32 (setq ex-user-buffer (current-buffer))
|
|
33 (condition-case nil
|
|
34 (delete-window (selected-window))
|
|
35 ;; ignore error about trying to delete only window on only frame
|
|
36 (error nil))
|
|
37 )
|
|
38
|
|
39 (defun ex-write-all-and-quit (quietly)
|
|
40 ;; originally defined in evi.el
|
|
41 ;; The old version would exit emacs; this version just kills the current
|
|
42 ;; buffer and deletes the current window (and frame if appropriate.)
|
|
43 (save-some-buffers quietly)
|
|
44 (ex-quit t))
|
|
45
|
|
46 (defun energize-external-editor-set-menubar ()
|
|
47 "Set the menubar to be used for the external editor"
|
|
48 (delete-menu-item '("File" "Open..."))
|
|
49 (add-menu-item '("File") "View..." 'find-file-other-window t
|
|
50 "Save")
|
|
51 (add-menu-item '("File") '("Edit" . "")
|
|
52 'energize-edit-buffer-externally t "Save")
|
|
53 (delete-menu-item '("File" "Exit XEmacs")))
|
|
54
|
|
55 (defun energize-internal-editor-set-menubar ()
|
|
56 "Set the menubar to be used for the internal editor"
|
|
57 (add-menu-item '("File") "Open..." 'find-file t "Save")
|
|
58 (delete-menu-item '("File" "View..."))
|
|
59 (delete-menu-item '("File" "Edit"))
|
|
60 (add-menu-item '("File") "Exit XEmacs" 'save-buffers-kill-emacs t))
|
|
61
|
|
62
|
|
63 (defun sensitize-external-editor-menus-hook ()
|
|
64 ;; make the "Edit File" menu item be inactive if this buffer doesn't have a
|
|
65 ;; file, and make it contain the name of the file that will be edited.
|
|
66 (let* ((menu (cdr (car (find-menu-item current-menubar '("File")))))
|
|
67 (ef (car (find-menu-item menu '("Edit File")))))
|
|
68 (if (null ef)
|
|
69 t ; no change
|
|
70 (let ((name buffer-file-name))
|
|
71 (if (eq (energize-buffer-type (current-buffer))
|
|
72 'energize-top-level-buffer)
|
|
73 (setq name nil))
|
|
74 (aset ef 2 (if name t nil))
|
|
75 (aset ef 3 (if name (file-name-nondirectory buffer-file-name) nil))
|
|
76 nil))))
|
|
77
|
|
78 (add-hook 'activate-menubar-hook 'sensitize-external-editor-menus-hook)
|
|
79
|
|
80 (defun energize-edit-buffer-externally-p (buffer)
|
|
81 (and energize-external-editor
|
|
82 (eq 'energize-source-buffer (energize-buffer-type buffer))))
|
|
83
|
|
84 (defun energize-edit-buffer-externally-1 (buffer extent)
|
|
85 (save-excursion
|
|
86 (set-buffer buffer)
|
|
87 (cond ((numberp extent)
|
|
88 (goto-char extent))
|
|
89 ((null extent)
|
|
90 (goto-char 1))
|
|
91 (t
|
|
92 (goto-char (extent-start-position extent))))
|
|
93 (energize-begin-external-edit (buffer-file-name)
|
|
94 (save-excursion
|
|
95 (beginning-of-line)
|
|
96 (1+ (count-lines 1 (point)))))))
|
|
97
|
|
98 (defun energize-edit-buffer-externally ()
|
|
99 "Edit the currently-displayed buffer in $ENERGIZE_EDIT_MODE."
|
|
100 (interactive)
|
|
101 (if (not buffer-file-name)
|
|
102 (error "Buffer not associated with a file"))
|
|
103 (energize-edit-buffer-externally-1 (current-buffer) (point)))
|
|
104
|
|
105
|
|
106 ;;; keeping track of inferior vi processes
|
|
107 ;;; the energize_vi command can locate and reuse a running vi, but that's
|
|
108 ;;; an expensive operation on X terminals, since the query-tree takes a
|
|
109 ;;; *lot* of server traffic. So if we know that there's no vi editing the
|
|
110 ;;; file (at least not one that *we* started) we can tell it to go ahead
|
|
111 ;;; and start a new one without checking for an old one. If we used a
|
|
112 ;;; smarter wrapper (one that told us the window id, or talked to the kernel
|
|
113 ;;; directly) instead of xterm, we wouldn't need the query-tree at all.
|
|
114
|
|
115 (defvar energize-vi-procs nil) ; vi is a special case (we're more clever)
|
|
116 (defvar energize-other-external-editor-procs nil) ; random others
|
|
117
|
|
118 (defun energize-vi-buffer-being-edited-p (file)
|
|
119 (let ((rest energize-vi-procs)
|
|
120 result)
|
|
121 (while rest
|
|
122 (if (string-equal file (cdr (car rest)))
|
|
123 (setq result t
|
|
124 rest nil)
|
|
125 (setq rest (cdr rest))))
|
|
126 result))
|
|
127
|
|
128 (defvar energize-vi-wrapper "energize_vi")
|
|
129
|
|
130 (defun energize-begin-external-edit (file line)
|
|
131 (let* ((ez-path (getenv "ENERGIZE_PATH"))
|
|
132 (exec-path (if ez-path
|
|
133 (append exec-path (list ez-path))
|
|
134 exec-path))
|
|
135 (dir (file-name-directory file))
|
|
136 (name (file-name-nondirectory file))
|
|
137 (vi-p (eq energize-external-editor 'vi))
|
|
138 (program (if vi-p energize-vi-wrapper energize-external-editor))
|
|
139 (pretty (cond (vi-p "vi")
|
|
140 ((string-match "[ \t]" program) program)
|
|
141 (t (file-name-nondirectory program))))
|
|
142 (procname (format "*%s %s*" (if vi-p "energize_vi" pretty) name))
|
|
143 (edited-p (and vi-p (energize-vi-buffer-being-edited-p file)))
|
|
144 proc msg)
|
|
145 (setq line (if vi-p (format "+%d" line) "")
|
|
146 msg (format "%s %s %s %s..." (if edited-p "Reselecting" "Launching")
|
|
147 pretty name line))
|
|
148 (message "%s" msg)
|
|
149 (let ((default-directory dir)
|
|
150 (inhibit-quit t))
|
|
151 (cond (vi-p
|
|
152 (setq proc
|
|
153 (apply 'start-process procname nil program
|
|
154 dir name line
|
|
155 (cond ((eq energize-vi-terminal-emulator 'xterm)
|
|
156 "-xterm")
|
|
157 ((eq energize-vi-terminal-emulator 'cmdtool)
|
|
158 "-cmdtool")
|
|
159 ((eq energize-vi-terminal-emulator 'shelltool)
|
|
160 "-shelltool")
|
|
161 (t
|
|
162 (signal 'error
|
|
163 (list
|
|
164 "energize-vi-terminal-emulator unknown"
|
|
165 energize-vi-terminal-emulator))))
|
|
166 (if edited-p '("-search") '())))
|
|
167 (setq energize-vi-procs (cons (cons proc file) energize-vi-procs))
|
|
168 (set-process-sentinel proc 'energize-vi-sentinel)
|
|
169 (set-process-filter proc 'energize-vi-filter))
|
|
170 (t
|
|
171 ;; ### hack a %-spec for line number info
|
|
172 ;; (setq proc (start-process procname nil program name))
|
|
173 (setq proc (start-process procname nil "/bin/sh" "-c"
|
|
174 (concat program " " name)))
|
|
175 (setq energize-other-external-editor-procs
|
|
176 (cons (cons proc file)
|
|
177 energize-other-external-editor-procs))
|
|
178 (set-process-sentinel proc 'energize-external-editor-sentinel)
|
|
179 (set-process-filter proc 'energize-external-editor-filter))))
|
|
180 (if edited-p
|
|
181 (while (progn (accept-process-output)
|
|
182 (eq 'run (process-status proc)))
|
|
183 (sleep-for 1))
|
|
184 (accept-process-output)
|
|
185 (sit-for 1))
|
|
186 (if (eq 0 (process-exit-status proc)) ; don't blow away error message
|
|
187 (message "%s Done." msg))
|
|
188 nil))
|
|
189
|
|
190 (defun energize-external-editor-sentinel-1 (process state name list-var)
|
|
191 (let ((rest (symbol-value list-var))
|
|
192 (got-it nil))
|
|
193 (let ((inhibit-quit t))
|
|
194 (while rest
|
|
195 (if (eq process (car (car rest)))
|
|
196 (progn
|
|
197 (set list-var (delq (car rest) (symbol-value list-var)))
|
|
198 (setq got-it (car rest)
|
|
199 rest nil)))
|
|
200 (setq rest (cdr rest))))
|
|
201 (if got-it
|
|
202 (progn
|
|
203 (energize-notice-external-editor-termination (cdr got-it))
|
|
204
|
|
205 (if (and state (string-match "\n+\\'" state))
|
|
206 (setq state (substring state 0 (match-beginning 0))))
|
|
207 (if (and (not (eq 0 (process-exit-status (car got-it))))
|
|
208 state
|
|
209 (not (equal state "")))
|
|
210 (error "%s: %s" (process-name process) state))
|
|
211
|
|
212 ; (if (not (eq 0 (process-exit-status (car got-it))))
|
|
213 ; (error "vi process exited with code %s"
|
|
214 ; (process-exit-status (car got-it))))
|
|
215
|
|
216 )
|
|
217 (beep)
|
|
218 (message "unknown %s process died with %S" name state))))
|
|
219
|
|
220 (defun energize-vi-sentinel (process state)
|
|
221 (energize-external-editor-sentinel-1 process state "vi" 'energize-vi-procs))
|
|
222
|
|
223 (defun energize-external-editor-sentinel (process state)
|
|
224 (energize-external-editor-sentinel-1
|
|
225 process state "external editor" 'energize-other-external-editor-procs))
|
|
226
|
|
227 (defun energize-external-editor-filter (process output)
|
|
228 (beep)
|
70
|
229 (message "%s" output))
|
0
|
230
|
|
231 (defun energize-vi-filter (process output)
|
|
232 ;; this will only get called if energize_vi (or the xterm) print error msgs
|
|
233 (energize-external-editor-filter process output))
|
|
234
|
|
235 (defun energize-notice-external-editor-termination (filename)
|
|
236 ;;
|
|
237 ;; when an external vi process edits, automatically revert any buffers
|
|
238 ;; associated with the file that was being edited, unless those buffers
|
|
239 ;; are modified (which shouldn't really happen in the vi model or doing
|
|
240 ;; things.)
|
|
241 ;;
|
|
242 ;; ## Since one vi process may have edited several files, possibly we
|
|
243 ;; ## should map over all energize files and revert as appropriate instead
|
|
244 ;; ## of only checking the file that the vi in question was started to edit.
|
|
245 ;;
|
|
246 (let ((buffer (get-file-buffer filename)))
|
|
247 (cond ((null buffer)
|
|
248 nil)
|
|
249 ((verify-visited-file-modtime buffer)
|
|
250 nil)
|
|
251 ((buffer-modified-p buffer) ; Hey, how'd that happen?
|
|
252 (if (not (file-exists-p filename))
|
|
253 (error "File %s no longer exists! Buffer modified!"
|
|
254 (file-name-nondirectory filename))
|
|
255 (beep)
|
|
256 (if (yes-or-no-p
|
|
257 (format "File %s changed on disk. Discard your edits? "
|
|
258 (file-name-nondirectory filename)))
|
|
259 (save-excursion
|
|
260 (set-buffer buffer)
|
|
261 (revert-buffer t t)))))
|
|
262 ; ((not (file-exists-p filename)) ; File gone; kill buffer.
|
|
263 ; (kill-buffer buffer))
|
|
264 (t ; not modified; just revert
|
|
265 (let* ((w (get-buffer-window buffer)) ; let's not thrash so much
|
|
266 (p (and w (window-point w)))
|
|
267 (s (and w (window-start w))))
|
|
268 (save-excursion
|
|
269 (set-buffer buffer)
|
|
270 (revert-buffer t t))
|
|
271 (if p (set-window-point w p))
|
|
272 (if s (set-window-start w s)))))))
|
|
273
|
|
274
|
|
275 ;; evi mode
|
|
276
|
|
277 (defun energize-evi-mode ()
|
|
278 (evi)
|
|
279 ;; vi users like to be able to edit read-only files, but we shouldn't
|
|
280 ;; let them edit the Energize non-file buffers.
|
|
281 (if (and (energize-buffer-p (current-buffer))
|
|
282 (or (null buffer-file-name)
|
|
283 (memq (energize-buffer-type (current-buffer))
|
|
284 '(energize-top-level-buffer energize-browser-buffer
|
|
285 energize-error-log-buffer energize-includers-buffer))))
|
|
286 (setq buffer-read-only t))
|
|
287 )
|
|
288
|
|
289
|
|
290 (defun energize-external-editor-set-mode (buffer)
|
|
291 ;; If an external editor is in use, then source buffers should be
|
|
292 ;; read-only in one manner or another.
|
|
293 (save-excursion
|
|
294 (set-buffer buffer)
|
|
295 (let* ((type (energize-buffer-type buffer))
|
|
296 (debugger-p (eq type 'energize-debugger-buffer))
|
|
297 (always-editable-p (memq type '(energize-project-buffer
|
|
298 energize-debugger-buffer
|
|
299 energize-breakpoint-buffer
|
|
300 )))
|
|
301 (editable-p (or always-editable-p
|
|
302 (and (null energize-external-editor)
|
|
303 (not buffer-read-only)))))
|
|
304
|
|
305 (or editable-p (setq buffer-read-only t))
|
|
306 (cond (editable-p
|
|
307 (cond ((eq energize-internal-editor nil)
|
|
308 nil)
|
|
309 ((eq energize-internal-editor 'vi)
|
|
310 (if (not debugger-p)
|
|
311 (energize-evi-mode)))
|
|
312 (t
|
|
313 (signal 'error
|
|
314 (list "unknown value for energize-internal-editor"
|
|
315 energize-internal-editor)))))
|
|
316 ((eq energize-internal-viewer 'vi)
|
|
317 (energize-evi-mode))
|
|
318 ((eq energize-internal-viewer 'less)
|
|
319 ;; put it in view-mode, but don't change the major-mode symbol
|
|
320 ;; so that the buffers go in the appropriate frames.
|
|
321 (let ((major-mode major-mode))
|
|
322 (view-mode)))
|
|
323 ((eq energize-internal-viewer 'nil)
|
|
324 nil)
|
|
325 (t
|
|
326 (signal 'error
|
|
327 (list "unknown value for energize-internal-viewer"
|
|
328 energize-internal-viewer)))))))
|
|
329
|
|
330 (defun external-editor-hack-popup (choices)
|
|
331 (if energize-external-editor
|
|
332 (let ((rest choices)
|
|
333 file)
|
|
334 (while rest
|
|
335 (if (and (vectorp (car rest))
|
|
336 (equal "editfile" (aref (car rest) 0))
|
|
337 (>= (length (car rest)) 4)
|
|
338 (stringp (setq file (aref (car rest) 3))))
|
|
339 (progn
|
|
340 (setcdr rest
|
|
341 (cons (vector "View File"
|
|
342 (list 'pop-to-buffer
|
|
343 (list 'find-file-noselect file))
|
|
344 t file)
|
|
345 (cdr rest)))
|
|
346 (setq rest nil)))
|
|
347 (setq rest (cdr rest)))))
|
|
348 choices)
|
|
349
|
|
350
|
|
351
|
|
352 (defvar energize-search-match-data nil)
|
|
353
|
|
354 (defun energize-search-internal (args)
|
|
355 ;; called from editorside.c
|
|
356 (let* ((case-fold-search (not (nth 0 args)))
|
|
357 (match-word-p (nth 1 args))
|
|
358 (regexp-string-p (nth 2 args)) ; string for which to search is regex
|
|
359 (regexp-p (or match-word-p regexp-string-p)) ; use regex function?
|
|
360 (back-p (not (nth 3 args)))
|
|
361 (search-string (nth 4 args))
|
|
362 (search (if match-word-p
|
|
363 (concat "\\b"
|
|
364 (if regexp-string-p ; coerce to regexp
|
|
365 search-string
|
|
366 (regexp-quote search-string))
|
|
367 "\\b")
|
|
368 search-string))
|
|
369 (replace (nth 5 args))
|
|
370 (fn (if back-p
|
|
371 (if regexp-p 're-search-backward 'search-backward)
|
|
372 (if regexp-p 're-search-forward 'search-forward))))
|
|
373 (setq this-command 'energize-search)
|
|
374 (cond ((equal search "")
|
|
375 (setq energize-search-match-data nil)
|
|
376 (error "No search string specified")))
|
|
377 (cond ((consp replace)
|
|
378 ;; the "replace all" button was selected
|
|
379 (setq replace (car replace))
|
|
380 ;; replace the one just searched for, if any
|
|
381 (cond ((and (eq last-command 'energize-search)
|
|
382 energize-search-match-data)
|
|
383 (store-match-data energize-search-match-data)
|
|
384 (if back-p
|
|
385 (save-excursion
|
|
386 (replace-match replace nil (not regexp-p)))
|
|
387 (replace-match replace nil (not regexp-p)))))
|
|
388 ;; now replace all the rest
|
|
389 (let ((count 0))
|
|
390 (while (funcall fn search nil t)
|
|
391 (if back-p
|
|
392 (save-excursion
|
|
393 (replace-match replace nil (not regexp-p)))
|
|
394 (replace-match replace nil (not regexp-p)))
|
|
395 (setq count (1+ count)))
|
|
396 (message "%d replacement%s done." count (if (= count 1) "" "s")))
|
|
397 ;; (setq this-command nil)
|
|
398 (setq energize-search-match-data nil))
|
|
399 (t
|
|
400 ;; otherwise, one of the search buttons was selected
|
|
401 (cond (replace
|
|
402 (or (eq last-command 'energize-search) ; fuck!!
|
|
403 (error "Last command was not a successful search."))
|
|
404 (or energize-search-match-data (error "Last search failed"))
|
|
405 (store-match-data energize-search-match-data)
|
|
406 (if back-p
|
|
407 (save-excursion
|
|
408 (replace-match replace nil (not regexp-p)))
|
|
409 (replace-match replace nil (not regexp-p)))))
|
|
410 (setq energize-search-match-data nil)
|
|
411 (or (funcall fn search nil t)
|
|
412 (signal 'error
|
|
413 (list (cond ((and back-p regexp-p)
|
|
414 "Reverse regexp search failed")
|
|
415 (back-p "Reverse search failed")
|
|
416 (regexp-p "Regexp search failed")
|
|
417 (t "Search failed"))
|
|
418 search)))
|
|
419 (cond (zmacs-regions
|
|
420 (push-mark (if (= (point) (match-beginning 0))
|
|
421 (match-end 0)
|
|
422 (match-beginning 0))
|
|
423 t)
|
|
424 (zmacs-activate-region)))
|
|
425 (setq energize-search-match-data (match-data))
|
|
426 ))))
|
|
427
|
|
428
|
|
429 (defvar energize-edit-modes-specified nil)
|
|
430
|
|
431 (defun energize-set-edit-modes-minibuf-prompt ()
|
|
432 (let* ((ee (completing-read "External editor (RET for none): "
|
|
433 nil nil nil nil t))
|
|
434 (te (if (equal ee "vi")
|
|
435 (completing-read
|
|
436 "Terminal emulator in which to run vi (xterm, shelltool, or cmdtool): "
|
|
437 '(("xterm") ("shelltool") ("cmdtool")) nil t nil t)
|
|
438 ""))
|
|
439 (iv (completing-read
|
|
440 "View buffers using which keybindings (emacs, vi, or less): "
|
|
441 '(("emacs") ("vi") ("less")) nil t nil t))
|
|
442 (ie (completing-read
|
|
443 "Edit other buffers using which keybindings (emacs or vi): "
|
|
444 '(("emacs") ("vi")) nil t nil t))
|
|
445 (ms (y-or-n-p "Use multiple windows? "))
|
|
446 (sp (y-or-n-p "Split screens? "))
|
|
447 )
|
|
448 (if (equal ee "") (setq ee nil))
|
|
449 (if (equal te "") (setq te "xterm"))
|
|
450 (if (equal iv "") (setq iv "emacs"))
|
|
451 (if (equal ie "") (setq ie "emacs"))
|
|
452 (list ee (intern te) (intern iv) (intern ie) ms sp)))
|
|
453
|
|
454 (defun energize-set-edit-modes-dbox-prompt ()
|
|
455 (let* ((ee (cond ((member energize-external-editor '("" "emacs" nil)) 0)
|
|
456 ((member energize-external-editor '("vi" vi))
|
|
457 (cond ((eq energize-vi-terminal-emulator 'xterm) 1)
|
|
458 ((eq energize-vi-terminal-emulator 'cmdtool) 2)
|
|
459 (t (error "unrecognised terminal emulator"))))
|
|
460 (t 3)))
|
|
461 (o (if (and (stringp energize-external-editor)
|
|
462 (not (equal energize-external-editor "vi")))
|
|
463 energize-external-editor
|
|
464 ""))
|
|
465 (iv (cond ((memq energize-internal-viewer '(nil emacs)) 0)
|
|
466 ((eq energize-internal-viewer 'vi) 1)
|
|
467 ((eq energize-internal-viewer 'less) 2)
|
|
468 (t (error "unrecognised internal-viewer"))))
|
|
469 (ie (cond ((memq energize-internal-editor '(nil emacs)) 0)
|
|
470 ((eq energize-internal-editor 'vi) 1)
|
|
471 (t (error "unrecognised internal-editor"))))
|
|
472 (ms (cond ((memq energize-screen-mode '(nil single)) 0)
|
|
473 ((eq energize-screen-mode 'several) 1)
|
|
474 ((eq energize-screen-mode 'multi) 2)
|
|
475 (t (error "unrecognised screen-mode"))))
|
|
476 (sp (if energize-split-screens-p 1 0))
|
|
477
|
|
478 (result (energize-edit-mode-prompt ee ie iv o ms sp))
|
|
479 )
|
|
480 (setq ee (nth 0 result)
|
|
481 iv (nth 1 result)
|
|
482 ie (nth 2 result)
|
|
483 o (nth 3 result)
|
|
484 ms (nth 4 result)
|
|
485 sp (nth 5 result))
|
|
486 (list (cond ((= ee 0) nil)
|
|
487 ((= ee 1) "vi")
|
|
488 ((= ee 2) "vi")
|
|
489 ((= ee 3) o)
|
|
490 (t (error "ee losing")))
|
|
491 (cond ((= ee 1) 'xterm)
|
|
492 ((= ee 2) 'cmdtool)
|
|
493 (t nil))
|
|
494 (cond ((= iv 0) 'emacs)
|
|
495 ((= iv 1) 'vi)
|
|
496 ((= iv 2) 'less)
|
|
497 (t (error "iv losing")))
|
|
498 (cond ((= ie 0) 'emacs)
|
|
499 ((= ie 1) 'vi)
|
|
500 (t (error "ie losing")))
|
|
501 (cond ((= ms 0) 'single)
|
|
502 ((= ms 1) 'several)
|
|
503 ((= ms 2) 'multi)
|
|
504 (t (error "ms losing")))
|
|
505 (cond ((= sp 0) 'nil)
|
|
506 ((= sp 1) 't)
|
|
507 (t (error "sp losing")))
|
|
508 )))
|
|
509
|
|
510 (defun energize-set-edit-modes (external-editor
|
|
511 terminal-emulator
|
|
512 internal-viewer
|
|
513 internal-editor
|
|
514 multi-screen-p
|
|
515 split-screens-p)
|
|
516 "Prompts for the various edit and view modes of Energize.
|
|
517
|
|
518 The \"external editor\" is the editor which Energize should use when
|
|
519 you ask it to edit a file. If you simply hit return, the files will
|
|
520 be edited in Lucid Emacs. The default for this is taken from the
|
|
521 environment variable $ENERGIZE_EXTERNAL_EDITOR.
|
|
522
|
|
523 If you specify \"vi\" as your external editor, then you will be asked
|
|
524 which terminal emulator window should be launched to run the vi (either
|
|
525 xterm, shelltool, or cmdtool.) The default for this is taken from the
|
|
526 environment variable $ENERGIZE_VI_WRAPPER.
|
|
527
|
|
528 Many of the Energize buffers (such as the Browsers) are not editable.
|
|
529 You have three choices for which keybindings you would like to use for
|
|
530 moving and searching around in those buffers: \"emacs\", \"vi\", or
|
|
531 \"less\" (which is a popular variant of \"more\"). The default for
|
|
532 this is taken from the environment variable $ENERGIZE_VIEW_MODE.
|
|
533
|
|
534 Some Energize buffers (such as the Project buffers) are editable, and
|
|
535 an external editor cannot be used on them. For these buffers, you have
|
|
536 a choice of either \"emacs\" or \"vi\" keybindings. The default for
|
|
537 this is taken from the environment variable $ENERGIZE_EDIT_MODE.
|
|
538
|
|
539 If you are not using an external editor, then specifying \"vi\" here
|
|
540 means that evi, the emacs vi emulator, will be used to edit your source
|
|
541 files as well.
|
|
542
|
|
543 You will also be asked whether Energize should automatically pop up multiple
|
|
544 windows (\"frames\" in emacs terminology) or should use and reuse one only
|
|
545 \(which is the traditional emacs model.) The default for this is taken from
|
|
546 the environment variable $ENERGIZE_MULTI_SCREEN_MODE.
|
|
547
|
|
548 Sometimes Energize wants to display two buffers at once, for example, the
|
|
549 Debugger buffer and the source file corresponding to the current stack frame.
|
|
550 You have two choices for how this should happen: one is to display the source
|
|
551 in the debugger frame, `splitting' the frame vertically, and the other is to
|
|
552 use two frames, one for the debugger and one for the source. The default for
|
|
553 this is taken from the envvironment variable $ENERGIZE_SPLIT_SCREENS_P."
|
|
554 ;; (interactive (energize-set-edit-modes-minibuf-prompt))
|
|
555 (interactive (energize-set-edit-modes-dbox-prompt))
|
|
556 (if (null terminal-emulator) (setq terminal-emulator 'xterm))
|
|
557 (if (equal energize-external-editor "emacs")
|
|
558 (setq energize-external-editor nil))
|
|
559
|
|
560 (or (null external-editor)
|
|
561 (stringp external-editor)
|
|
562 (signal 'wrong-type-argument (list 'stringp external-editor)))
|
|
563 (or (symbolp terminal-emulator)
|
|
564 (signal 'wrong-type-argument (list 'symbolp terminal-emulator)))
|
|
565 (or (symbolp internal-viewer)
|
|
566 (signal 'wrong-type-argument (list 'symbolp internal-viewer)))
|
|
567 (or (symbolp internal-editor)
|
|
568 (signal 'wrong-type-argument (list 'symbolp internal-editor)))
|
|
569 (or (memq split-screens-p '(t nil))
|
|
570 (error "split-screens-p must be t or nil"))
|
|
571
|
|
572 (cond ((equal external-editor "") (setq energize-external-editor nil))
|
|
573 ((equal external-editor "vi") (setq energize-external-editor 'vi))
|
|
574 (t (setq energize-external-editor external-editor)))
|
|
575
|
|
576 (if (eq internal-viewer 'emacs) (setq internal-viewer nil))
|
|
577 (if (eq internal-editor 'emacs) (setq internal-editor nil))
|
|
578 (setq energize-vi-terminal-emulator terminal-emulator)
|
|
579 (setq energize-internal-editor internal-editor)
|
|
580 (setq energize-internal-viewer internal-viewer)
|
|
581
|
|
582 (cond ((and (null energize-internal-viewer)
|
|
583 (null energize-internal-editor))
|
|
584 ;; Emacs all the way. They must be clueful.
|
|
585 ;; (remove-hook 'energize-disconnect-hook 'save-buffers-kill-emacs)
|
|
586 (setq pop-up-windows energize-split-screens-p))
|
|
587 (t
|
|
588 ;; (add-hook 'energize-disconnect-hook 'save-buffers-kill-emacs)
|
|
589 (setq pop-up-windows nil)))
|
|
590
|
|
591 (cond (energize-external-editor
|
|
592 (add-hook 'energize-disconnect-hook 'save-buffers-kill-emacs)
|
|
593 (energize-external-editor-set-menubar))
|
|
594 (t
|
|
595 (remove-hook 'energize-disconnect-hook 'save-buffers-kill-emacs)
|
|
596 (energize-internal-editor-set-menubar)))
|
|
597
|
|
598 (cond ;((eq multi-screen-p energize-screen-mode)
|
|
599 ; nil)
|
|
600 ((memq multi-screen-p '(t multi))
|
|
601 (energize-multi-screen-mode))
|
|
602 ((memq multi-screen-p '(nil single))
|
|
603 (energize-single-screen-mode))
|
|
604 ((memq multi-screen-p '(several))
|
|
605 (energize-several-screens-mode))
|
|
606 (t (error "multi-screen-p %S unrecognised" multi-screen-p)))
|
|
607
|
|
608 (setq energize-split-screens-p split-screens-p)
|
|
609
|
|
610 (let ((buffers (buffer-list)))
|
|
611 (save-excursion
|
|
612 (while buffers
|
|
613 (if (energize-buffer-p (car buffers))
|
|
614 (progn
|
|
615 (set-buffer (car buffers))
|
|
616 (normal-mode)
|
|
617 (energize-buffer-creation-hook-function (car buffers))))
|
|
618 (setq buffers (cdr buffers)))))
|
|
619 (setq energize-edit-modes-specified t)
|
|
620 nil)
|
|
621
|
|
622 (defun energize-hack-external-editor-mode ()
|
|
623 (if energize-edit-modes-specified
|
|
624 nil
|
|
625 (condition-case c
|
|
626 (let ((ee (getenv "ENERGIZE_EXTERNAL_EDITOR"))
|
|
627 (te (getenv "ENERGIZE_VI_WRAPPER"))
|
|
628 (iv (getenv "ENERGIZE_VIEW_MODE"))
|
|
629 (ie (getenv "ENERGIZE_EDIT_MODE"))
|
|
630 (ms (getenv "ENERGIZE_MULTI_SCREEN_MODE"))
|
|
631 (sp (getenv "ENERGIZE_SPLIT_SCREENS_P"))
|
|
632 )
|
|
633 (if (member ee '("" nil)) (setq ee nil))
|
|
634 (if (member te '("" nil)) (setq te "xterm"))
|
|
635 (if (member iv '("" nil)) (setq iv "emacs"))
|
|
636 (if (member ie '("" nil)) (setq ie "emacs"))
|
|
637 (if (member sp '("" nil)) (setq sp "yes"))
|
|
638 (if ms (setq ms (downcase ms)))
|
|
639 (setq sp (downcase sp))
|
|
640 (let ((standard-output (function external-debugging-output)))
|
|
641 (if (member te '("xterm" "shelltool" "cmdtool"))
|
|
642 nil
|
|
643 (princ (format
|
|
644 "$ENERGIZE_VI_WRAPPER is %S, not xterm, shelltool, or cmdtool.\n" te))
|
|
645 (setq te nil))
|
|
646 (if (member iv '("emacs" "vi" "less"))
|
|
647 nil
|
|
648 (princ (format
|
|
649 "$ENERGIZE_VIEW_MODE is %S, not emacs, vi, or less.\n"
|
|
650 iv))
|
|
651 (setq iv nil))
|
|
652 (if (member ie '("emacs" "vi" "less"))
|
|
653 nil
|
|
654 (princ (format
|
|
655 "$ENERGIZE_EDIT_MODE is %S, not emacs or vi.\n" ie))
|
|
656 (setq ie nil))
|
|
657 (cond ((member ms '("yes" "y" "true" "on" "1" "" "multi" "many"
|
|
658 "often"))
|
|
659 (setq ms 'multi))
|
|
660 ((member ms '("no" "n" "false" "off" "0" "single"
|
|
661 "never"))
|
|
662 (setq ms 'single))
|
|
663 ((member ms '("several" "some" "few" "sometimes"))
|
|
664 (setq ms 'several))
|
|
665 (t
|
|
666 (if ms
|
|
667 (princ
|
|
668 (format
|
|
669 "$ENERGIZE_MULTI_SCREEN_MODE was %S, not often, sometimes, or never\n"
|
|
670 ms)))
|
|
671 (setq ms (or energize-screen-mode
|
|
672 (if (and (null ee)
|
|
673 (equal iv "emacs")
|
|
674 (equal ie "emacs"))
|
|
675 'single
|
|
676 'multi)))))
|
|
677 (cond ((member sp '("yes" "y" "true" "on" "1" ""))
|
|
678 (setq sp t))
|
|
679 ((member sp '("no" "n" "false" "off" "0"))
|
|
680 (setq sp nil))
|
|
681 (t
|
|
682 (princ
|
|
683 (format "$ENERGIZE_SPLIT_SCREENS_P was %S, not a boolean.\n"
|
|
684 sp))))
|
|
685 )
|
|
686 (energize-set-edit-modes ee (intern te) (intern iv) (intern ie) ms sp)
|
|
687 )
|
|
688 ;; condition-case
|
|
689 (error
|
|
690 (let ((standard-output (function external-debugging-output)))
|
|
691 (princ "Internal error: %S\n" c))))))
|
|
692
|
|
693
|
|
694 ;;; Make the buffers menu say "view file" if in external-editor mode
|
|
695 ;;; Originally defined in menubar.el
|
|
696
|
|
697 (defun format-buffers-menu-line (buffer)
|
|
698 "Returns a string to represent the given buffer in the Buffer menu.
|
|
699 nil means the buffer shouldn't be listed. You can redefine this."
|
|
700 (if (string-match "\\` " (setq buffer (buffer-name buffer)))
|
|
701 nil
|
|
702 (if energize-external-editor
|
|
703 (concat
|
|
704 ; (if (buffer-file-name (get-buffer buffer))
|
|
705 ; "View File "
|
|
706 ; "View Buffer ")
|
|
707 "View "
|
|
708 buffer)
|
|
709 buffer)))
|