@@ -22,6 +22,10 @@ def format_time_taken(time_taken):
2222 else :
2323 return f"({ '{:.2f}' .format (elapsed * 1000 )} ms)"
2424
25+ class Profile :
26+ CLOJURE = 'clojure'
27+ SHADOW_CLJS = 'shadow-cljs'
28+
2529class Eval :
2630 # class
2731 next_id : int = 10
@@ -170,6 +174,8 @@ class Connection:
170174 last_view : sublime .View
171175 session : str
172176 eval_in_session : bool
177+ profile : Profile
178+ cljs_build : str
173179
174180 def __init__ (self ):
175181 self .host = 'localhost'
@@ -180,6 +186,8 @@ def __init__(self):
180186 self .last_view = window .active_view () if (window := sublime .active_window ()) else None
181187 self .session = None
182188 self .eval_in_session = None
189+ self .profile = None
190+ self .cljs_build = None
183191
184192 def set_status (self , status ):
185193 self .status = status
@@ -365,15 +373,15 @@ def eval_msg(view, region, msg):
365373 eval .msg ["id" ] = eval .id
366374 eval .msg ["nrepl.middleware.caught/caught" ] = f"{ ns } .middleware/print-root-trace"
367375 eval .msg ["nrepl.middleware.print/print" ] = f"{ ns } .middleware/pprint"
368- eval .msg ["nrepl.middleware.print/quota" ] = 1024
376+ eval .msg ["nrepl.middleware.print/quota" ] = 4096
369377 eval .msg ["session" ] = conn .session
370378 conn .add_eval (eval )
371379 conn .send (eval .msg )
372380 eval .update ("pending" , progress_thread .phase ())
373381
374382def eval (view , region , code = None ):
375383 (line , column ) = view .rowcol_utf16 (region .begin ())
376- msg = {"op" : "eval" if conn .eval_in_session else "clone-eval-close" ,
384+ msg = {"op" : "eval" if ( conn .profile == Profile . SHADOW_CLJS or conn . eval_in_session ) else "clone-eval-close" ,
377385 "code" : view .substr (region ) if code is None else code ,
378386 "ns" : namespace (view , region .begin ()) or 'user' ,
379387 "line" : line ,
@@ -649,6 +657,23 @@ def read(self, n):
649657
650658def handle_connect (msg ):
651659
660+ if conn .profile == Profile .SHADOW_CLJS :
661+ shadow_cljs_init = {
662+ ":app" : "(shadow.cljs.devtools.api/repl :app)" ,
663+ "node-repl" : "(shadow.cljs.devtools.api/browser-repl)" ,
664+ "browser-repl" : "(shadow.cljs.devtools.api/node-repl)"
665+ }
666+ if 1 == msg .get ("id" ) and "new-session" in msg :
667+ conn .session = msg ["new-session" ]
668+ conn .send ({"op" : "eval" ,
669+ "session" : conn .session ,
670+ "code" : shadow_cljs_init [conn .cljs_build ],
671+ "id" : 2 })
672+ return True
673+ elif 2 == msg .get ("id" ) and msg .get ("status" ) == ["done" ]:
674+ conn .set_status (f"🌕 { conn .host } :{ conn .port } " )
675+ return True
676+
652677 if 1 == msg .get ("id" ) and "new-session" in msg :
653678 conn .session = msg ["new-session" ]
654679 conn .send ({"op" : "load-file" ,
@@ -705,9 +730,11 @@ def read_loop():
705730 pass
706731 conn .disconnect ()
707732
708- def connect (host , port ):
733+ def connect (host , port , profile , cljs_build ):
709734 conn .host = host
710735 conn .port = port
736+ conn .profile = profile
737+ conn .cljs_build = cljs_build
711738 try :
712739 conn .socket = socket .create_connection ((host , port ))
713740 conn .reader = threading .Thread (daemon = True , target = read_loop )
@@ -750,14 +777,32 @@ def validate(self, text):
750777 port = int (port )
751778 return 0 <= port and port <= 65536
752779
780+ class ClojureSublimedCljsBuildInputHandler (sublime_plugin .ListInputHandler ):
781+ def list_items (self ):
782+ return [':app' , 'node-repl' , 'browser-repl' ]
783+
784+ def next_input (self , args ):
785+ return ClojureSublimedHostPortInputHandler ()
786+
787+ class ClojureSublimedProfileInputHandler (sublime_plugin .ListInputHandler ):
788+ def list_items (self ):
789+ return [Profile .CLOJURE , Profile .SHADOW_CLJS ]
790+
791+ def next_input (self , args ):
792+ if args .get ('clojure_sublimed_profile' ) == Profile .SHADOW_CLJS :
793+ return ClojureSublimedCljsBuildInputHandler ()
794+ return ClojureSublimedHostPortInputHandler ()
795+
753796class ClojureSublimedConnectCommand (sublime_plugin .ApplicationCommand ):
754- def run (self , clojure_sublimed_host_port ):
797+
798+ def run (self , clojure_sublimed_profile , clojure_sublimed_cljs_build = None , clojure_sublimed_host_port = '' ):
755799 host , port = clojure_sublimed_host_port .strip ().split (':' )
756800 port = int (port )
757- connect (host , port )
801+ connect (host , port , clojure_sublimed_profile , clojure_sublimed_cljs_build )
758802
759803 def input (self , args ):
760- return ClojureSublimedHostPortInputHandler ()
804+ if 'clojure_sublimed_profile' not in args :
805+ return ClojureSublimedProfileInputHandler ()
761806
762807 def is_enabled (self ):
763808 return conn .socket == None
@@ -772,7 +817,7 @@ def is_enabled(self):
772817class ClojureSublimedReconnectCommand (sublime_plugin .ApplicationCommand ):
773818 def run (self ):
774819 conn .disconnect ()
775- connect (conn .host , conn .port )
820+ connect (conn .host , conn .port , conn . profile , conn . cljs_build )
776821
777822 def is_enabled (self ):
778823 return conn .socket != None
0 commit comments