]> gitweb.factorcode.org Git - factor.git/blob - misc/fuel/fuel-mode.el
Use lexical scoping in all fuel sources
[factor.git] / misc / fuel / fuel-mode.el
1 ;;; fuel-mode.el --- Major mode for editing Factor programs. -*- lexical-binding: t -*-
2
3 ;; Copyright (C) 2008, 2009, 2010 Jose Antonio Ortega Ruiz
4 ;; See http://factorcode.org/license.txt for BSD license.
5
6 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
7 ;; Keywords: languages, fuel, factor
8 ;; Start date: Sat Dec 06, 2008 00:52
9
10 ;;; Commentary:
11
12 ;; A major mode (factor-mode) for editing Factor programs and a minor mode
13 ;; (fuel-mode) for interacting with a running Factor image.
14
15 ;;; Code:
16
17 (require 'fuel-base)
18 (require 'fuel-listener)
19 (require 'fuel-completion)
20 (require 'fuel-debug)
21 (require 'fuel-debug-uses)
22 (require 'fuel-eval)
23 (require 'fuel-help)
24 (require 'fuel-xref)
25 (require 'fuel-refactor)
26 (require 'fuel-stack)
27 (require 'fuel-autodoc)
28 (require 'fuel-autohelp)
29 (require 'fuel-edit)
30 (require 'fuel-menu)
31
32 \f
33 ;;; Customization:
34
35 ;;;###autoload
36 (defgroup fuel-mode nil
37   "Mode enabling FUEL's ultimate abilities."
38   :group 'fuel)
39
40 (defcustom fuel-mode-autodoc-p t
41   "Whether `fuel-autodoc-mode' gets enabled by default in factor buffers."
42   :group 'fuel-mode
43   :group 'fuel-autodoc
44   :type 'boolean)
45
46 (defcustom fuel-mode-autohelp-p nil
47   "Whether `fuel-autohelp-mode' gets enabled by default in factor buffers."
48   :group 'fuel-mode
49   :group 'fuel-autohelp
50   :type 'boolean)
51
52 (defcustom fuel-mode-stack-p nil
53   "Whether `fuel-stack-mode' gets enabled by default in factor buffers."
54   :group 'fuel-mode
55   :group 'fuel-stack
56   :type 'boolean)
57
58 \f
59 ;;; User commands
60
61 (defun fuel-run-file (&optional arg)
62   "Sends the current file to Factor for compilation.
63 With prefix argument, ask for the file to run."
64   (interactive "P")
65   (let* ((f/b (fuel-mode--read-file arg))
66          (file (car f/b))
67          (buffer (cdr f/b)))
68     (when buffer
69       (with-current-buffer buffer
70         (let ((msg (format "Compiling %s ..." file)))
71           (fuel-debug--prepare-compilation file msg)
72           (message msg)
73           (fuel-eval--send `(:fuel (,file fuel-run-file))
74                            `(lambda (r) (fuel--run-file-cont r ,file))))))))
75
76 (defun fuel--run-file-cont (ret file)
77   (if (fuel-debug--display-retort ret (format "%s successfully compiled" file))
78       (message "Compiling %s ... OK!" file)
79     (message "")))
80
81 (defun fuel-eval-region (begin end &optional arg)
82   "Sends region to Fuel's listener for evaluation.
83 Unless called with a prefix, switches to the compilation results
84 buffer in case of errors."
85   (interactive "r\nP")
86   (let* ((rstr (buffer-substring begin end))
87          (lines (split-string (substring-no-properties rstr)
88                               "[\f\n\r\v]+"
89                               t))
90          (cmd `(:fuel (,(mapcar (lambda (l) `(:factor ,l)) lines))))
91          (cv (factor-current-vocab)))
92     (fuel-debug--prepare-compilation (buffer-file-name)
93                                      (format "Evaluating:\n\n%s" rstr))
94     (fuel-debug--display-retort
95      (fuel-eval--send/wait cmd 10000)
96      (format "%s%s"
97              (if cv (format "IN: %s " cv) "")
98              (fuel-shorten-region begin end 70))
99      arg)))
100
101 (defun fuel-eval-extended-region (begin end &optional arg)
102   "Sends region, extended outwards to nearest definition,
103 to Fuel's listener for evaluation.
104 Unless called with a prefix, switches to the compilation results
105 buffer in case of errors."
106   (interactive "r\nP")
107   (fuel-eval-region (save-excursion (goto-char begin) (mark-defun) (point))
108                     (save-excursion (goto-char end) (mark-defun) (mark))
109                     arg))
110
111 (defun fuel-eval-definition (&optional arg)
112   "Sends definition around point to Fuel's listener for evaluation.
113 Unless called with a prefix, switches to the compilation results
114 buffer in case of errors."
115   (interactive "P")
116   (save-excursion
117     (mark-defun)
118     (let* ((begin (point))
119            (end (mark)))
120       (unless (< begin end) (error "No evaluable definition around point"))
121       (fuel-eval-region begin end arg))))
122
123 (defun fuel-load-usings ()
124   "Loads all vocabularies in the current buffer's USING: from.
125 Useful to activate autodoc help messages in a vocabulary not yet
126 loaded."
127   (interactive)
128   (message "Loading all vocabularies in USING: form ...")
129   (let ((err (fuel-eval--retort-error
130               (fuel-eval--send/wait '(:fuel* (t .) t :usings) 120000))))
131     (message (if err "Warning: some vocabularies failed to load"
132                "All vocabularies loaded"))))
133
134 \f
135 ;;; Minor mode definition:
136
137 (defvar-local fuel-mode-string " F"
138   "Modeline indicator for fuel-mode")
139
140 (defvar fuel-mode-map (make-sparse-keymap)
141   "Key map for fuel-mode")
142
143 ;;;###autoload
144 (define-minor-mode fuel-mode
145   "Toggle Fuel's mode.
146 With no argument, this command toggles the mode.
147 Non-null prefix argument turns on the mode.
148 Null prefix argument turns off the mode.
149
150 When Fuel mode is enabled, a host of nice utilities for
151 interacting with a factor listener is at your disposal.
152 \\{fuel-mode-map}"
153   :init-value nil
154   :lighter fuel-mode-string
155   :group 'fuel
156   :keymap fuel-mode-map
157
158   (setq fuel-autodoc-mode-string "/A")
159   (when fuel-mode-autodoc-p (fuel-autodoc-mode fuel-mode))
160
161   (setq fuel-autohelp-mode-string "/H")
162   (when fuel-mode-autohelp-p (fuel-autohelp-mode fuel-mode))
163
164   (setq fuel-stack-mode-string "/S")
165   (when fuel-mode-stack-p (fuel-stack-mode fuel-mode))
166
167   (let ((file-name (buffer-file-name)))
168     (when (and fuel-mode
169                file-name
170                (not (file-exists-p file-name)))
171       (fuel-scaffold--maybe-insert))))
172
173 \f
174 ;;; Keys and menu:
175
176 (fuel-menu--defmenu fuel fuel-mode-map
177   ("Complete symbol" ((kbd "M-TAB"))
178    fuel-completion--complete-symbol :enable (symbol-at-point))
179   ("Update USING:" ("\C-c\C-e\C-u" "\C-c\C-eu") fuel-update-usings)
180   --
181   ("Eval definition" ("\C-\M-x" "\C-c\C-e\C-x" "\C-c\C-ex")
182    fuel-eval-definition)
183   ("Eval extended region" ("\C-\M-r" "\C-c\C-e\C-e" "\C-c\C-ee")
184    fuel-eval-extended-region :enable mark-active)
185   ("Eval region" ("\C-c\C-e\C-r" "\C-c\C-er")
186    fuel-eval-region :enable mark-active)
187   --
188   ("Edit word or vocab at point..." ("\M-." "\C-c\C-e\C-d" "\C-c\C-ed")
189    fuel-edit-word-at-point)
190   ("Edit vocab..." ("\C-c\C-e\C-v" "\C-c\C-ev") fuel-edit-vocabulary)
191   ("Jump back" "\M-," fuel-edit-pop-edit-word-stack)
192   --
193   ("Help on word" ("\C-c\C-d\C-d" "\C-c\C-dd") fuel-help)
194   ("Apropos..." ("\C-c\C-d\C-p" "\C-c\C-dp") fuel-apropos)
195   ("Show stack effect" ("\C-c\C-d\C-e" "\C-c\C-de") fuel-stack-effect-sexp)
196   --
197   (menu "Crossref"
198         ("Show all words" ("\C-c\C-d\C-v" "\C-c\C-dv") fuel-show-file-words)
199         ("Word callers" "\C-c\M-<" fuel-show-callers :enable (symbol-at-point))
200         ("Word callees" "\C-c\M->" fuel-show-callees :enable (symbol-at-point))
201         (mode "Autodoc mode" ("\C-c\C-d\C-a" "\C-c\C-da") fuel-autodoc-mode))
202   (menu "Refactor"
203         ("Rename word" ("\C-c\C-x\C-w" "\C-c\C-xw") fuel-refactor-rename-word)
204         ("Inline word" ("\C-c\C-x\C-i" "\C-c\C-xi") fuel-refactor-inline-word)
205         ("Extract region" ("\C-c\C-x\C-r" "\C-c\C-xr")
206          fuel-refactor-extract-region :enable mark-active)
207         ("Extract subregion" ("\C-c\C-x\C-s" "\C-c\C-xs")
208          fuel-refactor-extract-sexp)
209         ("Extract vocab" ("\C-c\C-x\C-v" "\C-c\C-xv")
210          fuel-refactor-extract-vocab)
211         ("Make generic" ("\C-c\C-x\C-g" "\C-c\C-xg")
212          fuel-refactor-make-generic)
213         --
214         ("Extract article" ("\C-c\C-x\C-a" "\C-c\C-xa")
215          fuel-refactor-extract-article))
216   (menu "Scaffold"
217         ("New vocab" ("\C-c\C-c\C-v") fuel-scaffold-vocab)
218         ("Tests for vocab" ("\C-c\C-c\C-t") fuel-scaffold-tests)
219         ("Help for vocab" ("\C-c\C-c\C-h") fuel-scaffold-help)
220         ("Tags for vocab" ("\C-c\C-c\C-g") fuel-scaffold-tags)
221         ("Summary for vocab" ("\C-c\C-c\C-s") fuel-scaffold-summary)
222         ("Authors for vocab" ("\C-c\C-c\C-a") fuel-scaffold-authors)
223         ("Platforms for vocab" ("\C-c\C-c\C-p") fuel-scaffold-platforms))
224   --
225   ("Load used vocabs" ("\C-c\C-e\C-l" "\C-c\C-el") fuel-load-usings)
226   ("Run file" ("\C-c\C-k" "\C-c\C-l" "\C-c\C-e\C-k") fuel-run-file)
227   ("Run unit tests" "\C-c\C-t" fuel-test-vocab)
228   ("Refresh vocabs" "\C-c\C-r" fuel-refresh-all)
229   --
230   (menu "Switch to"
231         ("Listener" "\C-c\C-z" run-factor)
232         ("Related Factor file" "\C-c\C-o" factor-visit-other-file)
233         ("Other Factor buffer" "\C-c\C-s" fuel-switch-to-buffer)
234         ("Other Factor buffer other window" "\C-x4s"
235          fuel-switch-to-buffer-other-window)
236         ("Other Factor buffer other frame" "\C-x5s"
237          fuel-switch-to-buffer-other-frame)))
238
239 \f
240 (provide 'fuel-mode)
241
242 ;;; fuel-mode.el ends here