Initial Commit
[packages] / xemacs-packages / os-utils / ledit.el
1 ;;; ledit.el --- Emacs side of ledit interface
2
3 ;; Copyright (C) 1985 Free Software Foundation, Inc.
4
5 ;; Maintainer: FSF
6 ;; Keyword: languages
7
8 ;; This file is part of XEmacs.
9
10 ;; XEmacs is free software; you can redistribute it and/or modify it
11 ;; under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; XEmacs is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with XEmacs; see the file COPYING.  If not, write to the Free
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 ;; 02111-1307, USA.
24
25 ;;; Synched up with: FSF 19.34.
26
27 ;;; Commentary:
28
29 ;; This is a major mode for editing Liszt.  See etc/LEDIT for details.
30
31 ;;; Code:
32
33 ;;; To do:
34 ;;; o lisp -> emacs side of things (grind-definition and find-definition)
35
36 (defvar ledit-mode-map nil)
37
38 (defconst ledit-zap-file (concat "/tmp/" (user-login-name) ".l1")
39   "File name for data sent to Lisp by Ledit.")
40 (defconst ledit-read-file (concat "/tmp/" (user-login-name) ".l2")
41   "File name for data sent to Ledit by Lisp.")
42 (defconst ledit-compile-file 
43   (concat "/tmp/" (user-login-name) ".l4")
44   "File name for data sent to Lisp compiler by Ledit.")
45 (defconst ledit-buffer "*LEDIT*"
46   "Name of buffer in which Ledit accumulates data to send to Lisp.")
47
48 ;;;###autoload
49 (defconst ledit-save-files t "\
50 *Non-nil means Ledit should save files before transferring to Lisp.")
51 ;;;###autoload
52 (defconst ledit-go-to-lisp-string "%?lisp" "\
53 *Shell commands to execute to resume Lisp job.")
54 ;;;###autoload
55 (defconst ledit-go-to-liszt-string "%?liszt" "\
56 *Shell commands to execute to resume Lisp compiler job.")
57
58 (defun ledit-save-defun ()
59   "Save the current defun in the ledit buffer"
60   (interactive)
61   (save-excursion
62    (end-of-defun)
63    (let ((end (point)))
64      (beginning-of-defun)
65      (append-to-buffer ledit-buffer (point) end))
66    (message "Current defun saved for Lisp")))
67
68 (defun ledit-save-region (beg end)
69   "Save the current region in the ledit buffer"
70   (interactive "r")
71   (append-to-buffer ledit-buffer beg end)
72   (message "Region saved for Lisp"))
73
74 (defun ledit-zap-defun-to-lisp ()
75   "Carry the current defun to Lisp."
76   (interactive)
77   (ledit-save-defun)
78   (ledit-go-to-lisp))
79
80 (defun ledit-zap-defun-to-liszt ()
81   "Carry the current defun to liszt."
82   (interactive)
83   (ledit-save-defun)
84   (ledit-go-to-liszt))
85
86 (defun ledit-zap-region-to-lisp (beg end)
87   "Carry the current region to Lisp."
88   (interactive "r")
89   (ledit-save-region beg end)
90   (ledit-go-to-lisp))
91
92 (defun ledit-go-to-lisp ()
93   "Suspend Emacs and restart a waiting Lisp job."
94   (interactive)
95   (if ledit-save-files
96       (save-some-buffers))
97   (if (get-buffer ledit-buffer)
98       (save-excursion
99        (set-buffer ledit-buffer)
100        (goto-char (point-min))
101        (write-region (point-min) (point-max) ledit-zap-file)
102        (erase-buffer)))
103   (suspend-emacs ledit-go-to-lisp-string)
104   (load ledit-read-file t t))
105
106 (defun ledit-go-to-liszt ()
107   "Suspend Emacs and restart a waiting Liszt job."
108   (interactive)
109   (if ledit-save-files
110       (save-some-buffers))
111   (if (get-buffer ledit-buffer)
112       (save-excursion
113        (set-buffer ledit-buffer)
114        (goto-char (point-min))
115        (insert "(declare (macros t))\n")
116        (write-region (point-min) (point-max) ledit-compile-file)
117        (erase-buffer)))
118   (suspend-emacs ledit-go-to-liszt-string)
119   (load ledit-read-file t t))
120
121 (defun ledit-setup ()
122   "Set up key bindings for the Lisp/Emacs interface."
123   (if (not ledit-mode-map)
124       (progn (setq ledit-mode-map (nconc (make-sparse-keymap) 
125                                          shared-lisp-mode-map))))
126   (define-key ledit-mode-map "\e\^d" 'ledit-save-defun)
127   (define-key ledit-mode-map "\e\^r" 'ledit-save-region)
128   (define-key ledit-mode-map "\^xz" 'ledit-go-to-lisp)
129   (define-key ledit-mode-map "\e\^c" 'ledit-go-to-liszt))
130
131 (ledit-setup)
132
133 ;;;###autoload
134 (defun ledit-mode ()
135   "\\<ledit-mode-map>Major mode for editing text and stuffing it to a Lisp job.
136 Like Lisp mode, plus these special commands:
137   \\[ledit-save-defun]  -- record defun at or after point
138            for later transmission to Lisp job.
139   \\[ledit-save-region] -- record region for later transmission to Lisp job.
140   \\[ledit-go-to-lisp] -- transfer to Lisp job and transmit saved text.
141   \\[ledit-go-to-liszt] -- transfer to Liszt (Lisp compiler) job
142            and transmit saved text.
143 \\{ledit-mode-map}
144 To make Lisp mode automatically change to Ledit mode,
145 do (setq lisp-mode-hook 'ledit-from-lisp-mode)"
146   (interactive)
147   (lisp-mode)
148   (ledit-from-lisp-mode))
149
150 ;;;###autoload
151 (defun ledit-from-lisp-mode ()
152   (use-local-map ledit-mode-map)
153   (setq mode-name "Ledit")
154   (setq major-mode 'ledit-mode)
155   (run-hooks 'ledit-mode-hook))
156
157 ;;; ledit.el ends here