ledit.el 4.68 KB
Newer Older
Joseph Arceneaux's avatar
Joseph Arceneaux committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
;; Emacs side of ledit interface
;; Copyright (C) 1985 Free Software Foundation, Inc.

;; This file is part of GNU Emacs.

;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 1, or (at your option)
;; any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.


;;; To do:
;;; o lisp -> emacs side of things (grind-definition and find-definition)

(defvar ledit-mode-map nil)

(defconst ledit-zap-file (concat "/tmp/" (user-login-name) ".l1")
  "File name for data sent to Lisp by Ledit.")
(defconst ledit-read-file (concat "/tmp/" (user-login-name) ".l2")
  "File name for data sent to Ledit by Lisp.")
(defconst ledit-compile-file 
  (concat "/tmp/" (user-login-name) ".l4")
  "File name for data sent to Lisp compiler by Ledit.")
(defconst ledit-buffer "*LEDIT*"
  "Name of buffer in which Ledit accumulates data to send to Lisp.")
Roland McGrath's avatar
Roland McGrath committed
35 36 37 38 39 40 41 42 43 44

;;;###autoload
(defconst ledit-save-files t
  "*Non-nil means Ledit should save files before transferring to Lisp.")
;;;###autoload
(defconst ledit-go-to-lisp-string "%?lisp"
  "*Shell commands to execute to resume Lisp job.")
;;;###autoload
(defconst ledit-go-to-liszt-string "%?liszt"
  "*Shell commands to execute to resume Lisp compiler job.")
Joseph Arceneaux's avatar
Joseph Arceneaux committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

(defun ledit-save-defun ()
  "Save the current defun in the ledit buffer"
  (interactive)
  (save-excursion
   (end-of-defun)
   (let ((end (point)))
     (beginning-of-defun)
     (append-to-buffer ledit-buffer (point) end))
   (message "Current defun saved for Lisp")))

(defun ledit-save-region (beg end)
  "Save the current region in the ledit buffer"
  (interactive "r")
  (append-to-buffer ledit-buffer beg end)
  (message "Region saved for Lisp"))

(defun ledit-zap-defun-to-lisp ()
Brian Preble's avatar
Brian Preble committed
63
  "Carry the current defun to Lisp."
Joseph Arceneaux's avatar
Joseph Arceneaux committed
64 65 66 67 68
  (interactive)
  (ledit-save-defun)
  (ledit-go-to-lisp))

(defun ledit-zap-defun-to-liszt ()
Brian Preble's avatar
Brian Preble committed
69
  "Carry the current defun to liszt."
Joseph Arceneaux's avatar
Joseph Arceneaux committed
70 71 72 73 74
  (interactive)
  (ledit-save-defun)
  (ledit-go-to-liszt))

(defun ledit-zap-region-to-lisp (beg end)
Brian Preble's avatar
Brian Preble committed
75
  "Carry the current region to Lisp."
Joseph Arceneaux's avatar
Joseph Arceneaux committed
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
  (interactive "r")
  (ledit-save-region beg end)
  (ledit-go-to-lisp))

(defun ledit-go-to-lisp ()
  "Suspend Emacs and restart a waiting Lisp job."
  (interactive)
  (if ledit-save-files
      (save-some-buffers))
  (if (get-buffer ledit-buffer)
      (save-excursion
       (set-buffer ledit-buffer)
       (goto-char (point-min))
       (write-region (point-min) (point-max) ledit-zap-file)
       (erase-buffer)))
  (suspend-emacs ledit-go-to-lisp-string)
  (load ledit-read-file t t))

(defun ledit-go-to-liszt ()
  "Suspend Emacs and restart a waiting Liszt job."
  (interactive)
  (if ledit-save-files
      (save-some-buffers))
  (if (get-buffer ledit-buffer)
      (save-excursion
       (set-buffer ledit-buffer)
       (goto-char (point-min))
       (insert "(declare (macros t))\n")
       (write-region (point-min) (point-max) ledit-compile-file)
       (erase-buffer)))
  (suspend-emacs ledit-go-to-liszt-string)
  (load ledit-read-file t t))

(defun ledit-setup ()
Brian Preble's avatar
Brian Preble committed
110
  "Set up key bindings for the Lisp/Emacs interface."
Joseph Arceneaux's avatar
Joseph Arceneaux committed
111 112 113 114 115 116 117 118 119 120
  (if (not ledit-mode-map)
      (progn (setq ledit-mode-map (make-sparse-keymap))
	     (lisp-mode-commands ledit-mode-map)))
  (define-key ledit-mode-map "\e\^d" 'ledit-save-defun)
  (define-key ledit-mode-map "\e\^r" 'ledit-save-region)
  (define-key ledit-mode-map "\^xz" 'ledit-go-to-lisp)
  (define-key ledit-mode-map "\e\^c" 'ledit-go-to-liszt))

(ledit-setup)

Roland McGrath's avatar
Roland McGrath committed
121
;;;###autoload
Joseph Arceneaux's avatar
Joseph Arceneaux committed
122
(defun ledit-mode ()
Brian Preble's avatar
Brian Preble committed
123
  "\\<ledit-mode-map>Major mode for editing text and stuffing it to a Lisp job.
Joseph Arceneaux's avatar
Joseph Arceneaux committed
124
Like Lisp mode, plus these special commands:
Brian Preble's avatar
Brian Preble committed
125
  \\[ledit-save-defun]	-- record defun at or after point
Joseph Arceneaux's avatar
Joseph Arceneaux committed
126
	   for later transmission to Lisp job.
Brian Preble's avatar
Brian Preble committed
127 128 129
  \\[ledit-save-region] -- record region for later transmission to Lisp job.
  \\[ledit-go-to-lisp] -- transfer to Lisp job and transmit saved text.
  \\[ledit-go-to-liszt] -- transfer to Liszt (Lisp compiler) job
Joseph Arceneaux's avatar
Joseph Arceneaux committed
130 131 132 133 134 135 136 137
	   and transmit saved text.
\\{ledit-mode-map}
To make Lisp mode automatically change to Ledit mode,
do (setq lisp-mode-hook 'ledit-from-lisp-mode)"
  (interactive)
  (lisp-mode)
  (ledit-from-lisp-mode))

Roland McGrath's avatar
Roland McGrath committed
138
;;;###autoload
Joseph Arceneaux's avatar
Joseph Arceneaux committed
139 140 141 142 143
(defun ledit-from-lisp-mode ()
  (use-local-map ledit-mode-map)
  (setq mode-name "Ledit")
  (setq major-mode 'ledit-mode)
  (run-hooks 'ledit-mode-hook))