diff options
Diffstat (limited to 'vim/bundle/slimv/ftplugin/clojure')
-rw-r--r-- | vim/bundle/slimv/ftplugin/clojure/slimv-clojure.vim | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/vim/bundle/slimv/ftplugin/clojure/slimv-clojure.vim b/vim/bundle/slimv/ftplugin/clojure/slimv-clojure.vim new file mode 100644 index 0000000..3b7b8cc --- /dev/null +++ b/vim/bundle/slimv/ftplugin/clojure/slimv-clojure.vim @@ -0,0 +1,200 @@ +" slimv-clojure.vim: +" Clojure filetype plugin for Slimv +" Version: 0.9.13 +" Last Change: 04 May 2014 +" Maintainer: Tamas Kovacs <kovisoft at gmail dot com> +" License: This file is placed in the public domain. +" No warranty, express or implied. +" *** *** Use At-Your-Own-Risk! *** *** +" +" ===================================================================== +" +" Load Once: +if exists("b:slimv_did_ftplugin") || exists("g:slimv_disable_clojure") + finish +endif + +" ---------- Begin part loaded once ---------- +if !exists( 'g:slimv_clojure_loaded' ) + +let g:slimv_clojure_loaded = 1 + +" Transform filename so that it will not contain spaces +function! s:TransformFilename( name ) + if match( a:name, ' ' ) >= 0 + return fnamemodify( a:name , ':8' ) + else + return a:name + endif +endfunction + +" Build a Clojure startup command by adding +" all clojure*.jar files found to the classpath +function! s:BuildStartCmd( lisps ) + let cp = s:TransformFilename( a:lisps[0] ) + let i = 1 + while i < len( a:lisps ) + let cp = cp . ';' . s:TransformFilename( a:lisps[i] ) + let i = i + 1 + endwhile + + " Try to find swank-clojure and add it to classpath + let swanks = split( globpath( &runtimepath, 'swank-clojure'), '\n' ) + if len( swanks ) > 0 + let cp = cp . ';' . s:TransformFilename( swanks[0] ) + endif + return ['java -cp ' . cp . ' clojure.main', 'clojure'] +endfunction + +" Try to autodetect Clojure executable +" Returns list [Clojure executable, Clojure implementation] +function! SlimvAutodetect( preferred ) + " Firts try the most basic setup: everything in the path + if executable( 'lein' ) + return ['"lein repl"', 'clojure'] + endif + if executable( 'cake' ) + return ['"cake repl"', 'clojure'] + endif + if executable( 'clojure' ) + return ['clojure', 'clojure'] + endif + let lisps = [] + if executable( 'clojure.jar' ) + let lisps = ['clojure.jar'] + endif + if executable( 'clojure-contrib.jar' ) + let lisps = lisps + 'clojure-contrib.jar' + endif + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + + " Check if Clojure is bundled with Slimv + let lisps = split( globpath( &runtimepath, 'swank-clojure/clojure*.jar'), '\n' ) + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + + " Try to find Clojure in the PATH + let path = substitute( $PATH, ';', ',', 'g' ) + let lisps = split( globpath( path, 'clojure*.jar' ), '\n' ) + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + + if g:slimv_windows + " Try to find Clojure on the standard installation places + let lisps = split( globpath( 'c:/*clojure*,c:/*clojure*/lib', 'clojure*.jar' ), '\n' ) + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + else + " Try to find Clojure in the home directory + let lisps = split( globpath( '/usr/local/bin/*clojure*', 'clojure*.jar' ), '\n' ) + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + let lisps = split( globpath( '~/*clojure*', 'clojure*.jar' ), '\n' ) + if len( lisps ) > 0 + return s:BuildStartCmd( lisps ) + endif + endif + + return ['', ''] +endfunction + +" Try to find out the Clojure implementation +function! SlimvImplementation() + if exists( 'g:slimv_impl' ) && g:slimv_impl != '' + " Return Lisp implementation if defined + return tolower( g:slimv_impl ) + endif + + return 'clojure' +endfunction + +" Try to autodetect SWANK and build the command to load the SWANK server +function! SlimvSwankLoader() + " First autodetect Leiningen and Cake + if executable( 'lein' ) + if globpath( '~/.lein/plugins', 'lein-ritz*.jar' ) != '' + return '"lein ritz ' . g:swank_port . '"' + else + return '"lein swank"' + endif + elseif executable( 'cake' ) + return '"cake swank"' + else + " Check if swank-clojure is bundled with Slimv + let swanks = split( globpath( &runtimepath, 'swank-clojure/swank/swank.clj'), '\n' ) + if len( swanks ) == 0 + return '' + endif + let sclj = substitute( swanks[0], '\', '/', "g" ) + return g:slimv_lisp . ' -i "' . sclj . '" -e "(swank.swank/start-repl)" -r' + endif +endfunction + +" Filetype specific initialization for the REPL buffer +function! SlimvInitRepl() + set filetype=clojure +endfunction + +" Lookup symbol in the list of Clojure Hyperspec symbol databases +function! SlimvHyperspecLookup( word, exact, all ) + if !exists( 'g:slimv_cljapi_loaded' ) + runtime ftplugin/**/slimv-cljapi.vim + endif + + if !exists( 'g:slimv_javadoc_loaded' ) + runtime ftplugin/**/slimv-javadoc.vim + endif + + let symbol = [] + if exists( 'g:slimv_cljapi_db' ) + let symbol = SlimvFindSymbol( a:word, a:exact, a:all, g:slimv_cljapi_db, g:slimv_cljapi_root, symbol ) + endif + if exists( 'g:slimv_javadoc_db' ) + let symbol = SlimvFindSymbol( a:word, a:exact, a:all, g:slimv_javadoc_db, g:slimv_javadoc_root, symbol ) + endif + if exists( 'g:slimv_cljapi_user_db' ) + " Give a choice for the user to extend the symbol database + if exists( 'g:slimv_cljapi_user_root' ) + let user_root = g:slimv_cljapi_user_root + else + let user_root = '' + endif + let symbol = SlimvFindSymbol( a:word, a:exact, a:all, g:slimv_cljapi_user_db, user_root, symbol ) + endif + return symbol +endfunction + +" Implementation specific REPL initialization +function! SlimvReplInit( lisp_version ) + " Import functions commonly used in REPL but not present when not running in repl mode + if a:lisp_version[0:2] >= '1.3' + call SlimvSendSilent( ["(use '[clojure.repl :only (source apropos dir pst doc find-doc)])", + \ "(use '[clojure.java.javadoc :only (javadoc)])", + \ "(use '[clojure.pprint :only (pp pprint)])"] ) + elseif a:lisp_version[0:2] >= '1.2' + call SlimvSendSilent( ["(use '[clojure.repl :only (source apropos)])", + \ "(use '[clojure.java.javadoc :only (javadoc)])", + \ "(use '[clojure.pprint :only (pp pprint)])"] ) + endif +endfunction + +" Source Slimv general part +runtime ftplugin/**/slimv.vim + +endif "!exists( 'g:slimv_clojure_loaded' ) +" ---------- End of part loaded once ---------- + +runtime ftplugin/**/lisp.vim + +" Must be called for each lisp buffer +call SlimvInitBuffer() + +" Don't initiate Slimv again for this buffer +let b:slimv_did_ftplugin = 1 + |