Skip to content
This repository was archived by the owner on Feb 23, 2025. It is now read-only.

Commit

Permalink
Merge pull request #50 from liquidz/dev
Browse files Browse the repository at this point in the history
ver 0.6.2
  • Loading branch information
liquidz authored Oct 19, 2018
2 parents 03099c7 + fd168d7 commit 40a3458
Show file tree
Hide file tree
Showing 13 changed files with 157 additions and 54 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ aspell:
aspell -d en -W 3 -p ./.aspell.en.pws check doc/vim-iced.txt

repl:
clojure -Adev -m iced-repl
clojure -R:jackin:dev -m iced-repl

circleci: _circleci-lint _circleci-test
_circleci-lint:
Expand Down
5 changes: 2 additions & 3 deletions autoload/iced/format.vim
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function! iced#format#form() abort
else
let resp = iced#nrepl#op#iced#sync#format_code(code, s:ns_aliases(ns_code))
if has_key(resp, 'formatted') && !empty(resp['formatted'])
let @@ = join(split(resp['formatted'], '[\r\n]\+'), "\n")
let @@ = resp['formatted']
silent normal! gvp
elseif has_key(resp, 'error')
call iced#message#error_str(resp['error'])
Expand Down Expand Up @@ -88,8 +88,7 @@ function! iced#format#minimal() abort
let code = @@
let resp = iced#nrepl#op#iced#sync#format_code(code, s:ns_aliases(ns_code))
if has_key(resp, 'formatted') && !empty(resp['formatted'])
let formatted = join(split(resp['formatted'], '[\r\n]\+'), "\n")
let @@ = iced#util#add_indent(ncol, formatted)
let @@ = iced#util#add_indent(ncol, resp['formatted'])
silent normal! gvp
endif
finally
Expand Down
1 change: 1 addition & 0 deletions autoload/iced/nrepl.vim
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ function! iced#nrepl#disconnect() abort
if !iced#nrepl#is_connected() | return | endif

for id in iced#nrepl#sync#session_list()
call iced#nrepl#sync#send({'op': 'interrupt', 'session': id})
call iced#nrepl#sync#close(id)
endfor
call s:ch.close(s:nrepl['channel'])
Expand Down
12 changes: 6 additions & 6 deletions autoload/iced/nrepl/document.vim
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,13 @@ function! s:generate_cljdoc(resp) abort
call add(doc, '')
call add(doc, printf('## %s', a:resp['spec'][0]))
let specs = s:D.from_list(a:resp['spec'][1:])
for k in keys(specs)
for k in [':args', ':ret']
if !has_key(specs, k) | continue | endif

let v = specs[k]
if k ==# ':args' || k ==# ':ret'
let formatted = iced#nrepl#spec#format(v)
let formatted = s:add_indent(9, formatted)
call add(doc, printf('%7s %s', k, formatted))
endif
let formatted = iced#nrepl#spec#format(v)
let formatted = s:add_indent(9, formatted)
call add(doc, printf(' %-5s %s', k, formatted))
endfor
endif

Expand Down
47 changes: 32 additions & 15 deletions autoload/iced/nrepl/spec.vim
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,48 @@ let s:save_cpo = &cpo
set cpo&vim

function! s:common_replace(s) abort
let s = substitute(a:s, 'clojure.spec.alpha', 's', '')
let s = substitute(a:s, 'clojure.spec.alpha', 's', 'g')
return substitute(s, 'clojure.core/', '', 'g')
endfunction

function! s:prn(v) abort
return empty(a:v) ? 'nil' : a:v
endfunction

function! s:spec_format(spec) abort
if type(a:spec) != type([])
return empty(a:spec) ? 'nil' : s:common_replace(a:spec)
if type(a:spec) != type([]) | return s:prn(a:spec) | endif

let fn = a:spec[0]
if fn ==# 'clojure.spec.alpha/fspec' || fn ==# 'clojure.spec.alpha/cat'
let res = []
for kv in iced#util#partition(a:spec[1:], 2, v:false)
let [k, v] = kv
let v = (type(v) == type([])) ? s:spec_format(v) : s:prn(v)
let indent = len(k) + 3
call add(res, printf(' %s %s', k, iced#util#add_indent(indent, v)))
endfor
return printf("(%s\n%s)", fn, join(res, "\n"))
elseif fn ==# 'clojure.spec.alpha/keys' || fn ==# 'clojure.spec.alpha/or'
let res = []
for kv in iced#util#partition(a:spec[1:], 2, v:false)
let [k, v] = kv
let v = (type(v) == type([])) ? s:spec_format(v) : s:prn(v)
call add(res, printf('%s %s', k, v))
endfor
" 15 = len('clojure.spec.alpha/') + len('(s/') + len(' ')
let indent = len(fn) - 15
return printf('(%s %s)', fn, iced#util#add_indent(indent, join(res, "\n")))
elseif fn[0] ==# ':'
return '[' . join(a:spec, ' ') . ']'
endif

let fn = s:common_replace(a:spec[0])
let args = join(map(a:spec[1:], {_, v -> s:spec_format(v)}), ' ')
return printf('(%s %s)', fn, args)
return '(' . join(a:spec, ' ') . ')'
endfunction

function! iced#nrepl#spec#format(spec) abort
let code = s:spec_format(a:spec)
if !empty(code)
let resp = iced#nrepl#sync#pprint(code)
if has_key(resp, 'value')
let code = substitute(resp['value'], '\(^"\|"$\)', '', 'g')
" NOTE: ignore '\\n'
let code = substitute(code, '\%(\\\)\@<!\\n', "\n", 'g')
endif
endif
return iced#compat#trim(code)
let code = s:common_replace(code)
return code
endfunction

function! s:spec_form(resp) abort
Expand Down
22 changes: 22 additions & 0 deletions autoload/iced/util.vim
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,27 @@ function! iced#util#char() abort
return getline('.')[max([col('.')-1, 0])]
endfunction

function! iced#util#partition(arr, n, is_all) abort
let result = []
let tmp = []
let i = 0
for x in a:arr
if i < a:n
call add(tmp, x)
else
call add(result, copy(tmp))
let tmp = [x]
let i = 0
endif
let i = i + 1
endfor

if a:is_all || len(tmp) == a:n
call add(result, copy(tmp))
endif

return result
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo
2 changes: 1 addition & 1 deletion bin/iced
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ case "$1" in
lein update-in :dependencies conj '[nrepl "0.4.5"]' -- update-in :dependencies conj '[refactor-nrepl "2.4.0"]' -- update-in :dependencies conj '[cider/cider-nrepl "0.18.0"]' -- update-in :dependencies conj '[iced-nrepl "0.2.1"]' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-complete' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-debug' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-format' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-info' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-macroexpand' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-ns' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-out' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-pprint' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-pprint-fn' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-spec' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-test' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-trace' -- update-in :repl-options:nrepl-middleware conj 'cider.nrepl/wrap-undef' -- update-in :repl-options:nrepl-middleware conj 'refactor-nrepl.middleware/wrap-refactor' -- update-in :repl-options:nrepl-middleware conj 'iced.nrepl/wrap-iced' -- $OPTIONS repl
elif [ $IS_BOOT -eq 1 ]; then
echo "Boot project is detected."
boot -i "(require 'cider.tasks)" -d nrepl:0.4.5 -d refactor-nrepl:2.4.0 -d cider/cider-nrepl:0.18.0 -d iced-nrepl:0.2.1 -- cider.tasks/add-middleware -m cider.nrepl/wrap-complete -m cider.nrepl/wrap-debug -m cider.nrepl/wrap-format -m cider.nrepl/wrap-info -m cider.nrepl/wrap-macroexpand -m cider.nrepl/wrap-ns -m cider.nrepl/wrap-out -m cider.nrepl/wrap-pprint -m cider.nrepl/wrap-pprint-fn -m cider.nrepl/wrap-spec -m cider.nrepl/wrap-test -m cider.nrepl/wrap-trace -m cider.nrepl/wrap-undef -m refactor-nrepl.middleware/wrap-refactor -m iced.nrepl/wrap-iced -- repl
boot -i "(require 'cider.tasks)" -d nrepl:0.4.5 -d refactor-nrepl:2.4.0 -d cider/cider-nrepl:0.18.0 -d iced-nrepl:0.2.1 -- cider.tasks/add-middleware -m cider.nrepl/wrap-complete -m cider.nrepl/wrap-debug -m cider.nrepl/wrap-format -m cider.nrepl/wrap-info -m cider.nrepl/wrap-macroexpand -m cider.nrepl/wrap-ns -m cider.nrepl/wrap-out -m cider.nrepl/wrap-pprint -m cider.nrepl/wrap-pprint-fn -m cider.nrepl/wrap-spec -m cider.nrepl/wrap-test -m cider.nrepl/wrap-trace -m cider.nrepl/wrap-undef -m refactor-nrepl.middleware/wrap-refactor -m iced.nrepl/wrap-iced -- $OPTIONS repl
elif [ $IS_CLOJURE_CLI -eq 1 ]; then
echo "Clojure CLI project is detected."
clojure $OPTIONS -Sdeps "{:deps {iced-repl {:local/root \"${PROJECT_DIR}\"}}}" -m iced-repl
Expand Down
44 changes: 20 additions & 24 deletions clj/iced_jackin.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,31 @@
[org.panchromatic.mokuhan :as mokuhan]))

(def ^:private dependencies
(-> "deps.edn" slurp read-string :deps))
(let [deps (-> "deps.edn" slurp read-string :deps)]
(reduce (fn [res [name {:mvn/keys [version]}]]
(assoc res name version))
{} deps)))

(defn- leiningen []
(->>
(concat
(for [[name {:mvn/keys [version]}] dependencies]
(format "update-in :dependencies conj '[%s \"%s\"]'" name version))
(for [middleware iced-repl/middlewares]
(format "update-in :repl-options:nrepl-middleware conj '%s'" middleware))
["$OPTIONS repl"])
(str/join " -- ")
(str "lein ")))
(defn- leiningen-params []
(let [dep-fmt (fn [[name version]] (format "update-in :dependencies conj '[%s \"%s\"]'" name version))
mdw-fmt #(format "update-in :repl-options:nrepl-middleware conj '%s'" %)]
(->> (concat (map dep-fmt dependencies)
(map mdw-fmt iced-repl/middlewares))
(str/join " -- "))))

(defn- boot []
(->>
(concat
["-i \"(require 'cider.tasks)\""]
(for [[name {:mvn/keys [version]}] dependencies]
(format "-d %s:%s" name version))
["-- cider.tasks/add-middleware"]
(for [middleware iced-repl/middlewares]
(format "-m %s" middleware))
["-- repl"])
(str/join " ")
(str "boot ")))
(defn- boot-params []
(let [dep-fmt (fn [[name version]] (format "-d %s:%s" name version))
mdw-fmt #(format "-m %s" %)]
(->> (concat ["-i \"(require 'cider.tasks)\""]
(map dep-fmt dependencies)
["-- cider.tasks/add-middleware"]
(map mdw-fmt iced-repl/middlewares))
(str/join " "))))

(defn -main []
(let [file (io/file "bin/iced")]
(->> {:leiningen (leiningen) :boot (boot)}
(->> {:leiningen-params (leiningen-params)
:boot-params (boot-params)}
(mokuhan/render (slurp "clj/template/iced.bash"))
(spit file))
(.setExecutable file true)
Expand Down
4 changes: 2 additions & 2 deletions clj/template/iced.bash
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ case "$1" in
"repl")
if [ $IS_LEININGEN -eq 1 ];then
echo "Leiningen project is detected."
{{{leiningen}}}
lein {{{leiningen-params}}} -- $OPTIONS repl
elif [ $IS_BOOT -eq 1 ]; then
echo "Boot project is detected."
{{{boot}}}
boot {{{boot-params}}} -- $OPTIONS repl
elif [ $IS_CLOJURE_CLI -eq 1 ]; then
echo "Clojure CLI project is detected."
clojure $OPTIONS -Sdeps "{:deps {iced-repl {:local/root \"${PROJECT_DIR}\"}}}" -m iced-repl
Expand Down
2 changes: 1 addition & 1 deletion doc/vim-iced.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
*vim-iced.txt* Clojure interactive development environment for Vim8/Neovim

Version: 0.6.1
Version: 0.6.2
Author : Masashi Iizuka <[email protected]>
License: MIT LICENSE

Expand Down
2 changes: 1 addition & 1 deletion test/nrepl.vim
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function! s:suite.disconnect_test() abort
call add(self.closed_sessions, a:msg['session'])
return {'status': ['done']}
endif
return {}
return {'status': ['done']}
endfunction

call s:ch.inject_dummy({
Expand Down
53 changes: 53 additions & 0 deletions test/nrepl_spec.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
let s:suite = themis#suite('iced.nrepl.spec')
let s:assert = themis#helper('assert')
let s:scope = themis#helper('scope')
let s:funcs = s:scope.funcs('autoload/iced/nrepl/spec.vim')

let s:cat_sample = [
\ 'clojure.spec.alpha/cat',
\ ':bindings',
\ ':clojure.core.specs.alpha/bindings',
\ ':body',
\ ['clojure.spec.alpha/*', 'clojure.core/any?'],
\ ]

let s:or_sample = [
\ 'clojure.spec.alpha/cat',
\ ':foo',
\ ['clojure.spec.alpha/or',
\ ':string', 'clojure.core/string?',
\ ':none', 'clojure.core/nil?',
\ ],
\ ]

let s:keys_sample = [
\ 'clojure.spec.alpha/keys',
\ ':req-un', ['::foo.core/bar', '::bar.core/baz'],
\ ':opt-un', ['::baz.core/foo'],
\ ]

function! s:suite.format_cat_test() abort
call s:assert.equals(iced#nrepl#spec#format(s:cat_sample),
\ join([
\ '(s/cat',
\ ' :bindings :clojure.core.specs.alpha/bindings',
\ ' :body (s/* any?))',
\ ], "\n"))
endfunction

function! s:suite.format_or_test() abort
call s:assert.equals(iced#nrepl#spec#format(s:or_sample),
\ join([
\ '(s/cat',
\ ' :foo (s/or :string string?',
\ ' :none nil?))',
\ ], "\n"))
endfunction

function! s:suite.format_keys_test() abort
call s:assert.equals(iced#nrepl#spec#format(s:keys_sample),
\ join([
\ '(s/keys :req-un [::foo.core/bar ::bar.core/baz]',
\ ' :opt-un [::baz.core/foo])',
\ ], "\n"))
endfunction
15 changes: 15 additions & 0 deletions test/util.vim
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,18 @@ function! s:suite.del_indent_test() abort
\ "foo\nbar\n baz")
call s:assert.equals(iced#util#del_indent(10, 'foo'), 'foo')
endfunction

function! s:suite.partition_test() abort
call s:assert.equals(iced#util#partition([1, 2, 3, 4], 2, v:false),
\ [[1, 2], [3, 4]])
call s:assert.equals(iced#util#partition([1, 2, 3, 4, 5], 2, v:false),
\ [[1, 2], [3, 4]])
call s:assert.equals(iced#util#partition([1, 2, 3, 4, 5], 2, v:true),
\ [[1, 2], [3, 4], [5]])
call s:assert.equals(iced#util#partition([], 2, v:false),
\ [])
call s:assert.equals(iced#util#partition([1, 2], 1, v:false),
\ [[1], [2]])
call s:assert.equals(iced#util#partition([1, 2], 1, v:true),
\ [[1], [2]])
endfunction

0 comments on commit 40a3458

Please sign in to comment.