From 2cbad7209abcb142a8bc015a1fb95551d349ea1a Mon Sep 17 00:00:00 2001
From: Jeff Rose <rosejn@gmail.com>
Date: Thu, 1 Jul 2021 15:03:15 -0600
Subject: [PATCH 1/3] Updating repl cmdline to current recommended form and
 making it interactive by default.

---
 autoload/jack_in.vim | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/autoload/jack_in.vim b/autoload/jack_in.vim
index c122c48..abb813b 100644
--- a/autoload/jack_in.vim
+++ b/autoload/jack_in.vim
@@ -66,18 +66,23 @@ endfunction
 
 function! jack_in#clj_cmd(...)
   let l:clj_string = 'clj'
-  let l:deps_map = '{:deps {nrepl/nrepl {:mvn/version "0.7.0"} '
-  let l:cider_opts = '-e "(require ''nrepl.cmdline) (nrepl.cmdline/-main \"--middleware\" \"['
+  let l:main_fn = '-m nrepl.cmdline'
+  let l:interactive = '--interactive'
+
+  let l:deps = '-Sdeps ''{:deps {nrepl/nrepl {:mvn/version "0.7.0"} '
+  let l:cider_opts = '--middleware ''['
 
   for [dep, inj] in items(g:jack_in_injections)
-    let l:deps_map .= dep . ' {:mvn/version "' . inj['version'] . '"} '
-    let l:cider_opts .= ' '.inj['middleware']
+    let l:deps .= dep . ' {:mvn/version "' . inj['version'] . '"} '
+    let l:cider_opts .= ' "'.inj['middleware'] . '"'
   endfor
 
-  let l:deps_map .= '}}'
-  let l:cider_opts .= ']\")"'
+  let l:deps .= '}}'''
+  let l:cider_opts .= ']'''
+
+  let l:cmd = l:clj_string . ' ' . l:deps . ' ' . l:main_fn . ' ' . l:cider_opts . ' ' . l:interactive
 
-  return l:clj_string . ' -Sdeps ''' . l:deps_map . ''' ' . join(a:000, ' ') . ' ' . l:cider_opts . ' '
+  return l:cmd
 endfunction
 
 function! jack_in#clj(is_bg, ...)

From 4ed869911205b8e5e185e9456a80fa4990b2de09 Mon Sep 17 00:00:00 2001
From: Jeff Rose <rosejn@gmail.com>
Date: Fri, 2 Jul 2021 09:53:58 -0600
Subject: [PATCH 2/3] Adding a Cljs command that starts up shadow cljs with the
 standard command.

---
 autoload/jack_in.vim | 13 +++++++++++++
 plugin/jack_in.vim   |  1 +
 2 files changed, 14 insertions(+)

diff --git a/autoload/jack_in.vim b/autoload/jack_in.vim
index abb813b..40d34a8 100644
--- a/autoload/jack_in.vim
+++ b/autoload/jack_in.vim
@@ -88,3 +88,16 @@ endfunction
 function! jack_in#clj(is_bg, ...)
   call s:RunRepl(call(function('jack_in#clj_cmd'), a:000), a:is_bg)
 endfunction
+
+
+function! jack_in#cljs_cmd(...)
+  let l:cljs_string = 'npx shadow-cljs watch app'
+
+  return l:cljs_string
+endfunction
+
+function! jack_in#cljs(is_bg, ...)
+  call s:RunRepl(call(function('jack_in#cljs_cmd'), a:000), a:is_bg)
+endfunction
+
+
diff --git a/plugin/jack_in.vim b/plugin/jack_in.vim
index 4b1d892..e9719c9 100644
--- a/plugin/jack_in.vim
+++ b/plugin/jack_in.vim
@@ -18,3 +18,4 @@ let g:jack_in_injections =
 command! -bang -nargs=* Boot call jack_in#boot(<bang>0,<q-args>)
 command! -bang -nargs=* Lein call jack_in#lein(<bang>0,<q-args>)
 command! -bang -nargs=* Clj call jack_in#clj(<bang>0,<q-args>)
+command! -bang -nargs=* Cljs call jack_in#cljs(<bang>0,<q-args>)

From e4f37ea4d8073e1d00ed54c53a1caf1a7f140a01 Mon Sep 17 00:00:00 2001
From: Jeff Rose <rosejn@gmail.com>
Date: Thu, 16 Dec 2021 16:27:47 -0500
Subject: [PATCH 3/3] using dev alias

---
 autoload/jack_in.vim | 123 ++++++++++++++++++++++---------------------
 plugin/jack_in.vim   |  11 ++--
 2 files changed, 71 insertions(+), 63 deletions(-)

diff --git a/autoload/jack_in.vim b/autoload/jack_in.vim
index 40d34a8..d7c274c 100644
--- a/autoload/jack_in.vim
+++ b/autoload/jack_in.vim
@@ -1,3 +1,17 @@
+" Append a window to the right if there is only one window currently,
+" and add it to the bottom right if there are 2 or more.
+function! s:AppendWin()
+  let l:window_count winnr('$')
+  if l:window_count == 1
+    vsplit
+    wincmd l
+  else
+    wincmd l
+    split
+  endif
+  enew
+endfunction
+
 function! s:warn(str) abort
   echohl WarningMsg
   echomsg a:str
@@ -5,71 +19,67 @@ function! s:warn(str) abort
   let v:warningmsg = a:str
 endfunction
 
-function! s:RunRepl(cmd, is_bg) abort
-  if exists(':Start') == 2
-    execute 'Start' . (a:is_bg ? '!' : '') a:cmd
+function! s:FindBufName(name, num)
+  let l:buf_name = a:name . '_' . a:num
+  if bufexists(l:buf_name)
+    let l:num = a:num + 1
+    return s:FindBufName(a:name, l:num)
   else
-    call s:warn('dispatch.vim not installed, please install it.')
-    if has('nvim')
-      call s:warn('neovim detected, falling back on termopen()')
-      tabnew
-      call termopen(a:cmd)
-      tabprevious
-    endif
+    return l:buf_name
   endif
 endfunction
 
-function! jack_in#boot_cmd(...)
-  let l:boot_string = 'boot -x -i "(require ''cider.tasks)"'
+function! s:RunRepl(name, cmd, is_bg) abort
+  call AppendWin()
+  Rooter
+  call termopen(a:cmd)
+  let l:buf_name = s:FindBufName(a:name, 0)
+  execute "file" l:buf_name
+endfunction
+
+function! jack_in#clj_cmd(...)
+  let l:clj_string = 'clojure -X:dev'
+  let l:main_fn = ''
+  let l:interactive = ''
+
+  let l:deps = '-Sdeps '' {:deps {nrepl/nrepl {:mvn/version "0.8.3"} '
+  let l:cider_opts = '--middleware ''['
+
   for [dep, inj] in items(g:jack_in_injections)
-    let l:boot_string .= printf(' -d %s:%s', dep, inj['version'])
-  endfor
-  let l:boot_string .= ' cider.tasks/add-middleware'
-  for inj in values(g:jack_in_injections)
-    let l:boot_string .= ' -m '.inj['middleware']
+    let l:deps .= dep . ' {:mvn/version "' . inj['version'] . '"} '
+    let l:cider_opts .= ' "'.inj['middleware'] . '"'
   endfor
-  if a:0 > 0 && a:1 != ''
-    let l:boot_task = join(a:000, ' ')
-  else
-    let l:boot_task = g:default_boot_task
-  endif
-  return l:boot_string.' '.l:boot_task
+
+  let l:deps .= '}}'''
+  let l:cider_opts .= ']'''
+
+  "let l:cmd = l:clj_string . ' ' . l:deps . ' ' . l:main_fn . ' ' . l:cider_opts . ' ' . l:interactive
+  let l:cmd = l:clj_string
+  return l:cmd
 endfunction
 
-function! jack_in#boot(is_bg,...)
-  call s:RunRepl(call(function('jack_in#boot_cmd'), a:000), a:is_bg)
+function! jack_in#clj(is_bg, ...)
+  call s:RunRepl("clj", call(function('jack_in#clj_cmd'), a:000), a:is_bg)
 endfunction
 
-function! jack_in#lein_cmd(...)
-  let l:lein_string = 'lein'
-  for [dep, inj] in items(g:jack_in_injections)
-    let l:dep_vector = printf('''[%s "%s"]''', dep, inj['version'])
-    if !get(inj, 'lein_plugin')
-      let l:lein_string .= ' update-in :dependencies conj '.l:dep_vector.' --'
-      let l:lein_string .= ' update-in :repl-options:nrepl-middleware conj '.inj['middleware'].' --'
-    else
-      let l:lein_string .= ' update-in :plugins conj '.l:dep_vector.' --'
-    endif
-  endfor
-  if a:0 > 0 && a:1 != ''
-    let l:lein_task = join(a:000, ' ')
-  else
-    let l:lein_task = g:default_lein_task
-  endif
 
-  return l:lein_string.' '.l:lein_task
+function! jack_in#shadow_cmd(...)
+  let l:shadow_string = 'npx shadow-cljs watch app'
+
+  return l:shadow_string
 endfunction
 
-function! jack_in#lein(is_bg, ...)
-  call s:RunRepl(call(function('jack_in#lein_cmd'), a:000), a:is_bg)
+function! jack_in#shadow(is_bg, ...)
+  call s:RunRepl("shadow", call(function('jack_in#shadow_cmd'), a:000), a:is_bg)
 endfunction
 
-function! jack_in#clj_cmd(...)
-  let l:clj_string = 'clj'
-  let l:main_fn = '-m nrepl.cmdline'
-  let l:interactive = '--interactive'
 
-  let l:deps = '-Sdeps ''{:deps {nrepl/nrepl {:mvn/version "0.7.0"} '
+function! jack_in#cljs_cmd(...)
+  let l:clj_string = "clojure -M:cljs:dev "
+  let l:main_fn = ''
+  let l:interactive = ''
+
+  let l:deps = '-Sdeps '' {:deps {nrepl/nrepl {:mvn/version "0.8.3"} '
   let l:cider_opts = '--middleware ''['
 
   for [dep, inj] in items(g:jack_in_injections)
@@ -80,24 +90,17 @@ function! jack_in#clj_cmd(...)
   let l:deps .= '}}'''
   let l:cider_opts .= ']'''
 
-  let l:cmd = l:clj_string . ' ' . l:deps . ' ' . l:main_fn . ' ' . l:cider_opts . ' ' . l:interactive
+  let l:eval = "--eval \"(require \'shadow-repl)(shadow-repl/start\!)\""
+
+  let l:cmd = l:clj_string . ' ' . l:eval
 
   return l:cmd
-endfunction
 
-function! jack_in#clj(is_bg, ...)
-  call s:RunRepl(call(function('jack_in#clj_cmd'), a:000), a:is_bg)
 endfunction
 
 
-function! jack_in#cljs_cmd(...)
-  let l:cljs_string = 'npx shadow-cljs watch app'
-
-  return l:cljs_string
-endfunction
-
 function! jack_in#cljs(is_bg, ...)
-  call s:RunRepl(call(function('jack_in#cljs_cmd'), a:000), a:is_bg)
+  call s:RunRepl("cljs", call(function('jack_in#cljs_cmd'), a:000), a:is_bg)
 endfunction
 
 
diff --git a/plugin/jack_in.vim b/plugin/jack_in.vim
index e9719c9..5654460 100644
--- a/plugin/jack_in.vim
+++ b/plugin/jack_in.vim
@@ -6,16 +6,21 @@ let g:loaded_jack_in = 1
 let g:default_lein_task = 'repl'
 let g:default_boot_task = 'repl'
 
-let g:jack_in_injections =
-      \ {'cider/cider-nrepl':
+let g:jack_in_injections = {'cider/cider-nrepl':
       \   {'version': '0.25.2',
       \    'middleware': 'cider.nrepl/cider-middleware',
       \    'lein_plugin': 1},
+      \  'thheller/shadow-cljs':
+      \   {'version': '2.15.1',
+      \    'middleware': 'shadow.cljs.devtools.server.nrepl/middleware'},
       \  'refactor-nrepl/refactor-nrepl':
       \   {'version': '2.5.0',
-      \    'middleware': 'refactor-nrepl.middleware/wrap-refactor'}}
+      \    'middleware': 'refactor-nrepl.middleware/wrap-refactor'}
+      \}
 
 command! -bang -nargs=* Boot call jack_in#boot(<bang>0,<q-args>)
 command! -bang -nargs=* Lein call jack_in#lein(<bang>0,<q-args>)
 command! -bang -nargs=* Clj call jack_in#clj(<bang>0,<q-args>)
+command! -bang -nargs=* Shadow call jack_in#shadow(<bang>0,<q-args>)
 command! -bang -nargs=* Cljs call jack_in#cljs(<bang>0,<q-args>)
+