ledit.el 4.9 KB

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