Skip to content

Instantly share code, notes, and snippets.

@haruyama
Last active December 18, 2015 13:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save haruyama/5791152 to your computer and use it in GitHub Desktop.
Save haruyama/5791152 to your computer and use it in GitHub Desktop.
check clojure syntaxes and execute tests. it requires syntastic, lein, lein-nrepl, vim-fireplace and clojure.tools.namespace.
if exists("g:loaded_syntastic_clojure_nrepl_checker")
finish
endif
let g:loaded_syntastic_clojure_nrepl_checker=1
function! SyntaxCheckers_clojure_nrepl_IsAvailable()
return executable('lein') && filereadable('project.clj')
endfunction
function! SyntaxCheckers_clojure_nrepl_GetLocList()
let filename = expand('%')
let prefix = matchstr(filename, "^\\(src\\|test\\)/")
if empty(prefix)
return []
endif
let template = '(require ''clojure.tools.namespace) (require ''clojure.test) (let [namespaces (clojure.tools.namespace/find-namespaces-in-dir (java.io.File. "%s"))] (doseq [ns namespaces] (prn ns) (require ns :reload) (if (re-find #"-test\z" (name ns)) (clojure.test/run-tests ns) (let [test-ns (symbol (str (name ns) "-test"))] (prn test-ns) (require test-ns :reload) (clojure.test/run-tests test-ns)))))'
let exp = printf(template, escape(filename, '"\'))
let response = fireplace#client().eval(exp, {'session': 1})
if type(response) == type(0)
echo 'error on fireplace#client().eval()'
return []
endif
if get(response, 'err', '') !=# ''
let makeprg = syntastic#makeprg#build({
\ 'exe': 'echo',
\ 'fname': shellescape(substitute(response.err, 'compiling:(', 'compiling:(' . prefix, 'g')),
\ 'filetype': 'clojure',
\ 'subchecker': 'nrepl' })
let errorformat = 'CompilerException java.lang.RuntimeException: %m\, compiling:(%f:%l:%c) '
return SyntasticMake({
\ 'makeprg': makeprg,
\ 'errorformat': errorformat,})
else
echo substitute(response.out, '\r\|\n$', '', 'g')
return []
endif
endfunction
call g:SyntasticRegistry.CreateAndRegisterChecker({
\ 'filetype': 'clojure',
\ 'name': 'nrepl'})
" vim: set et sts=4 sw=4:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment