Mercurial > hg > xemacs-beta
comparison lisp/energize/energize-vi.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 131b0175ea99 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
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) | |
229 (message (format "%s" output))) | |
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))) |