@@ -167,6 +167,14 @@ to load that file."
167
167
:type 'regexp
168
168
:group 'inf-clojure )
169
169
170
+ (defcustom inf-clojure-repl-flavor 'clojure
171
+ " Symbol to define your Repl flavor.
172
+ The default flavor is 'clojure, 'lumo is the other supported
173
+ one."
174
+ :type 'symbol
175
+ :options '(clojure lumo)
176
+ :group 'inf-clojure )
177
+
170
178
(defvar inf-clojure-buffer nil
171
179
" The current inf-clojure process buffer.
172
180
@@ -208,6 +216,36 @@ whichever process buffer you want to use.")
208
216
209
217
(put 'inf-clojure-mode 'mode-class 'special )
210
218
219
+ (defun inf-clojure--flavor-lumo-setup ()
220
+ " Setup defcustoms for the Lumo flavor."
221
+ ; ; The defcustoms for the following are already ok:
222
+ ; ; * inf-clojure-set-ns-command
223
+ ; ; * inf-clojure-macroexpand-command
224
+ ; ; * inf-clojure-macroexpand-1-command
225
+ ; ;
226
+ ; ; https://github.com/anmonteiro/lumo/issues/84
227
+ ; ; (setq inf-clojure-var-source-command "(lumo.repl/source %s)")
228
+ ; ; https://github.com/anmonteiro/lumo/issues/87
229
+ ; ; (setq inf-clojure-ns-vars-command "(lumo.repl/dir %s)")
230
+ ; ; https://github.com/anmonteiro/lumo/issues/86
231
+ ; ; (setq inf-clojure-var-apropos-command "(lumo.repl/apropos %s)")
232
+
233
+ ; ; Uncomment after https://github.com/anmonteiro/lumo/pull/88
234
+ ; ; (setq inf-clojure-arglist-command "(lumo.repl/get-arglists \"%s\")")
235
+ (setq inf-clojure-var-doc-command " (lumo.repl/doc %s)" )
236
+ (setq inf-clojure-completion-command " (or (doall (map str (lumo.repl/get-completions \" %s\" )) '())" )
237
+
238
+ (let ((inf-program (inf-clojure--lumo-program)))
239
+ ; ; (message (concat "inf-clojure-program set to: \"" (prin1-to-string inf-program) "\""))
240
+ (setq inf-clojure-program inf-program)))
241
+
242
+ (defun inf-clojure--flavor-setup ()
243
+ " Setup inf-clojure defcustoms depending on the choose flavor."
244
+ (pcase inf-clojure-repl-flavor
245
+ (lumo (progn (message " [inf-clojure] will switch to the Lumo flavor " )
246
+ (inf-clojure--flavor-lumo-setup)))
247
+ (_ (message " [inf-clojure] will default to the Clojure flavor " ))))
248
+
211
249
(define-derived-mode inf-clojure-mode comint-mode " Inferior Clojure"
212
250
" Major mode for interacting with an inferior Clojure process.
213
251
Runs a Clojure interpreter as a subprocess of Emacs, with Clojure I/O through an
@@ -322,6 +360,7 @@ With argument, allows you to edit the command line (default is value
322
360
of `inf-clojure-program' ). Runs the hooks from
323
361
`inf-clojure-mode-hook' (after the `comint-mode-hook' is run).
324
362
\( Type \\ [describe-mode] in the process buffer for a list of commands.)"
363
+ (inf-clojure--flavor-setup)
325
364
(interactive (list (if current-prefix-arg
326
365
(read-string " Run Clojure: " inf-clojure-program)
327
366
inf-clojure-program)))
@@ -770,6 +809,77 @@ Return the number of nested sexp the point was over or after."
770
809
(setq-local eldoc-documentation-function #'inf-clojure-eldoc )
771
810
(apply #'eldoc-add-command inf-clojure-extra-eldoc-commands))
772
811
773
- (provide 'inf-clojure )
812
+ ; ;;; Lumo
813
+ ; ;;; ====
774
814
815
+ (defgroup lumo nil
816
+ " Run an external Lumo process (REPL) in an Emacs buffer."
817
+ :group 'inf-clojure )
818
+
819
+ ; ; AR - TODO Alternatively you can specify a command string that will be called,
820
+ ; ; which should return a string.
821
+ (defcustom inf-clojure-lumo-classpath-generator " cp"
822
+ " The file used to create the classpath string.
823
+ The classpath string has to be a \" :\" separated list of dir and
824
+ files."
825
+ :type '(choice (string ))
826
+ :group 'lumo )
827
+
828
+ (defcustom inf-clojure-lumo-command " lumo"
829
+ " The command used to launch lumo."
830
+ :type '(choice (string ))
831
+ :group 'lumo )
832
+
833
+ (defcustom inf-clojure-lumo-args " -d"
834
+ " The command arguments used to launch lumo."
835
+ :type '(choice (string ))
836
+ :group 'lumo )
837
+
838
+ (defcustom inf-clojure-lumo-hostname " localhost"
839
+ " The hostname used to launch lumo.
840
+ Note that only if port is specified this will be used."
841
+ :type '(choice (string ))
842
+ :group 'lumo )
843
+
844
+ (defcustom inf-clojure-lumo-port " "
845
+ " The port used to launch lumo.
846
+ Note that if port is specified, inf-clojure will connect to it by
847
+ HTTP socket. No process will be actually started by lumo-mode."
848
+ :type '(choice (string )
849
+ (integer))
850
+ :group 'lumo )
851
+
852
+ ; ; AR - not used but left it here because as possible sanity check
853
+ (defun inf-clojure--lumo-mode-p ()
854
+ " Return true if the lumo is the target REPL."
855
+ (comint-send-string (inf-clojure-proc) " (js/global.hasOwnProperty \" $$LUMO_GLOBALS\" )" ))
856
+
857
+ (defun inf-clojure--empty-string-p (string )
858
+ " Return true if the string is empty or nil. Expects STRING."
859
+ (or (null string)
860
+ (zerop (length string))))
861
+
862
+ (defun inf-clojure--read-classpath (classpath-option )
863
+ " Read the classpath from the input CLASSPATH-OPTION."
864
+ (let ((classpath-file-path (concat (inf-clojure-project-root) classpath-option)))
865
+ (cond
866
+ ((and (file-exists-p classpath-file-path) (file-readable-p classpath-file-path))
867
+ (f-read classpath-file-path))
868
+ ; ; TODO launch a command that returns the classpath string?
869
+ ((user-error (concat " Option \" " classpath-option " \" was not a (readable) file, the classpath will be empty." ))
870
+ " " ))))
871
+
872
+ (defun inf-clojure--lumo-program ()
873
+ " Return inf-clojure-program for lumo."
874
+ (if (inf-clojure--empty-string-p inf-clojure-lumo-port)
875
+ (concat inf-clojure-lumo-command
876
+ " "
877
+ (when (not (inf-clojure--empty-string-p inf-clojure-lumo-classpath-generator))
878
+ (concat inf-clojure-lumo-args " " ))
879
+ " -c " (inf-clojure--read-classpath inf-clojure-lumo-classpath-generator))
880
+ (cons inf-clojure-lumo-hostname (if (stringp inf-clojure-lumo-port)
881
+ (string-to-number inf-clojure-lumo-port)
882
+ inf-clojure-lumo-port))))
883
+
884
+ (provide 'inf-clojure )
775
885
; ;; inf-clojure.el ends here
0 commit comments