spacevim/autoload/SpaceVim/layers/lang/scala.vim
JIe 2bb7059579
Some checks failed
Detach Plugins / check (FlyGrep.vim) (push) Has been cancelled
Detach Plugins / check (GitHub.vim) (push) Has been cancelled
Detach Plugins / check (JavaUnit.vim) (push) Has been cancelled
Detach Plugins / check (SourceCounter.vim) (push) Has been cancelled
Detach Plugins / check (cpicker.nvim) (push) Has been cancelled
Detach Plugins / check (dein-ui.vim) (push) Has been cancelled
Detach Plugins / check (git.vim) (push) Has been cancelled
Detach Plugins / check (iedit.vim) (push) Has been cancelled
Detach Plugins / check (scrollbar.vim) (push) Has been cancelled
Detach Plugins / check (vim-chat) (push) Has been cancelled
Detach Plugins / check (vim-cheat) (push) Has been cancelled
Detach Plugins / check (vim-todo) (push) Has been cancelled
Detach Plugins / check (xmake.vim) (push) Has been cancelled
test / Linux (nvim, nightly) (push) Has been cancelled
test / Linux (nvim, v0.3.8) (push) Has been cancelled
test / Linux (nvim, v0.4.0) (push) Has been cancelled
test / Linux (nvim, v0.4.2) (push) Has been cancelled
test / Linux (nvim, v0.4.3) (push) Has been cancelled
test / Linux (nvim, v0.4.4) (push) Has been cancelled
test / Linux (nvim, v0.5.0) (push) Has been cancelled
test / Linux (nvim, v0.5.1) (push) Has been cancelled
test / Linux (nvim, v0.6.0) (push) Has been cancelled
test / Linux (nvim, v0.6.1) (push) Has been cancelled
test / Linux (nvim, v0.7.0) (push) Has been cancelled
test / Linux (nvim, v0.7.2) (push) Has been cancelled
test / Linux (nvim, v0.8.0) (push) Has been cancelled
test / Linux (nvim, v0.8.1) (push) Has been cancelled
test / Linux (nvim, v0.8.2) (push) Has been cancelled
test / Linux (nvim, v0.8.3) (push) Has been cancelled
test / Linux (nvim, v0.9.0) (push) Has been cancelled
test / Linux (nvim, v0.9.1) (push) Has been cancelled
test / Linux (true, vim, v7.4.052) (push) Has been cancelled
test / Linux (true, vim, v7.4.1689) (push) Has been cancelled
test / Linux (true, vim, v7.4.629) (push) Has been cancelled
test / Linux (true, vim, v8.0.0027) (push) Has been cancelled
test / Linux (true, vim, v8.0.0183) (push) Has been cancelled
test / Linux (vim, nightly) (push) Has been cancelled
test / Linux (vim, v8.0.0184) (push) Has been cancelled
test / Linux (vim, v8.0.1453) (push) Has been cancelled
test / Linux (vim, v8.1.2269) (push) Has been cancelled
test / Linux (vim, v8.2.2434) (push) Has been cancelled
test / Linux (vim, v8.2.3995) (push) Has been cancelled
test / Windows (nvim, nightly) (push) Has been cancelled
test / Windows (nvim, v0.3.8) (push) Has been cancelled
test / Windows (nvim, v0.4.2) (push) Has been cancelled
test / Windows (nvim, v0.4.3) (push) Has been cancelled
test / Windows (nvim, v0.4.4) (push) Has been cancelled
test / Windows (nvim, v0.5.0) (push) Has been cancelled
test / Windows (nvim, v0.5.1) (push) Has been cancelled
test / Windows (nvim, v0.6.0) (push) Has been cancelled
test / Windows (nvim, v0.6.1) (push) Has been cancelled
test / Windows (nvim, v0.7.0) (push) Has been cancelled
test / Windows (nvim, v0.7.2) (push) Has been cancelled
test / Windows (nvim, v0.8.0) (push) Has been cancelled
test / Windows (nvim, v0.8.1) (push) Has been cancelled
test / Windows (nvim, v0.8.2) (push) Has been cancelled
test / Windows (nvim, v0.8.3) (push) Has been cancelled
test / Windows (nvim, v0.9.0) (push) Has been cancelled
test / Windows (nvim, v0.9.1) (push) Has been cancelled
test / Windows (vim, nightly) (push) Has been cancelled
test / Windows (vim, v7.4.1185) (push) Has been cancelled
test / Windows (vim, v7.4.1689) (push) Has been cancelled
test / Windows (vim, v8.0.0027) (push) Has been cancelled
test / Windows (vim, v8.0.1453) (push) Has been cancelled
test / Windows (vim, v8.1.2269) (push) Has been cancelled
test / Windows (vim, v8.2.2434) (push) Has been cancelled
test / Windows (vim, v8.2.3995) (push) Has been cancelled
docker / docker (push) Has been cancelled
mirror / check (coding) (push) Has been cancelled
mirror / check (gitee) (push) Has been cancelled
mirror / check (gitlab) (push) Has been cancelled
init
2024-08-21 14:17:26 +08:00

358 lines
15 KiB
VimL

"=============================================================================
" scala.vim --- SpaceVim lang#scala layer
" Copyright (c) 2016-2023 Wang Shidong & Contributors
" Author: Wang Shidong < wsdjeg@outlook.com >
" URL: https://spacevim.org
" License: GPLv3
"=============================================================================
scriptencoding utf-8
""
" @section lang#scala, layers-lang-scala
" @parentsection layers
" This layer is for Scala development.
"
" @subsection Mappings
" >
" Import key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal <F4> show candidates for importing of cursor symbol
" insert <F4> show candidates for importing of cursor symbol
" normal SPC l i c show candidates for importing of cursor symbol
" normal SPC l i q prompt for a qualified import
" normal SPC l i o organize imports of current file
" normal SPC l i s sort imports of current file
" insert <c-;>i prompt for a qualified import
" insert <c-;>o organize imports of current file
" insert <c-;>s sort imports of current file
"
" Debug key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal SPC l d t show debug stack trace of current frame
" normal SPC l d c continue the execution
" normal SPC l d b set a breakpoint for the current line
" normal SPC l d B clear all breakpoints
" normal SPC l d l launching debugger
" normal SPC l d i step into next statement
" normal SPC l d o step over next statement
" normal SPC l d O step out of current function
"
" Sbt key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal SPC l b c sbt clean compile
" normal SPC l b r sbt run
" normal SPC l b t sbt test
" normal SPC l b p sbt package
" normal SPC l b d sbt show project dependencies tree
" normal SPC l b l sbt reload project build definition
" normal SPC l b u sbt update external dependencies
" normal SPC l b e run sbt to generate .ensime config file
"
" Execute key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal SPC l r run main class
"
" REPL key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal SPC l s i start a scala inferior REPL process
" normal SPC l s b send buffer and keep code buffer focused
" normal SPC l s l send line and keep code buffer focused
" normal SPC l s s send selection text and keep code buffer focused
"
" Other key bindings:
"
" Mode Key Function
" -------------------------------------------------------------
" normal SPC l Q bootstrap server when first-time-use
" normal SPC l h show Documentation of cursor symbol
" normal SPC l n inline local refactoring of cursor symbol
" normal SPC l e rename cursor symbol
" normal SPC l g find Definition of cursor symbol
" normal SPC l t show Type of expression of cursor symbol
" normal SPC l p show Hierarchical view of a package
" normal SPC l u find Usages of cursor symbol
"
" <
" SpaceVim uses [`ensime-vim`](https://ensime.github.io/editors/vim/install/)
" to provide code completion, format, sort imports etc, if has python support.
" Also you can enable lsp layer to has a better experience.
"
"
" @subsection language server `metals-vim`
"
" Right now `metals-vim` works with `coc.nvim` to offer a richer user experience
" than other servers(LanguageClient-neovim or vim-lsp). Please make sure that
" `metals-vim` executable is in your `system $PATH`. Installation guide is here:
" [`metals-vim`](https://scalameta.org/metals/docs/editors/vim.html)
"
"
" @subsection Ensime-vim setup steps
"
" The following is quick install steps, if you want to see complete details,
" please see: [`ensime-vim`](https://ensime.github.io/editors/vim/install/)
"
" 1. Install vim`s plugin and its dependencies as following.
"
" `pip install websocket-client sexpdata`,
"
" `pip install pynvim` (neovim only).
"
" 2. Integration ENSIME with your build tools, here we use sbt.
" add (sbt-ensime) as global plugin for sbt:
" Put code `addSbtPlugin("org.ensime" % "sbt-ensime" % "2.6.1")` in file
" '~/.sbt/plugins/plugins.sbt' (create if not exists).
" Armed with your build tool plugin, generate the `.ensime` config file from
" your project directory in command line, e.g. for sbt use `sbt ensimeConfig`,
" or `./gradlew ensime` for Gradle. the first time will take several minutes.
"
" 3. The first time you use ensime-vim (per Scala version), it will `bootstrap` the
" ENSIME server installation when opening a Scala file you will be prompted to
" run |:EnInstall|. Do that and give it a minute or two to run.
" After this, you should see reports in Vim's message area that ENSIME is coming
" up, and the indexer and analyzer are ready.
" Going forward, ensime-vim will automatically start the ENSIME server when you
" edit Scala files in a project with an `.ensime` config present.
"
"
" @subsection Code formatting
"
" 1. To make neoformat support scala file, you should install scalariform.
" [`scalariform`](https://github.com/scala-ide/scalariform)
" and set `scalariform_jar` option to the path of the jar.
"
" 2. If lsp [`metals-vim`](https://scalameta.org/metals/docs/editors/overview.html)
" is enabled, it will automatically use
" [`scalafmt`](https://scalameta.org/scalafmt/docs/configuration.html)
" to format code.
if exists('s:scalariform_jar')
finish
endif
let s:scalariform_jar = ''
function! SpaceVim#layers#lang#scala#plugins() abort
let plugins = []
call add(plugins, [g:_spacevim_root_dir . 'bundle/vim-scala', {'merged' : 0}])
if has('python3') || has('python')
call add(plugins, ['wsdjeg/ensime-vim', {'on_ft': 'scala'}])
endif
return plugins
endfunction
function! SpaceVim#layers#lang#scala#config() abort
let g:scala_use_default_keymappings = 0
call SpaceVim#mapping#space#regesit_lang_mappings('scala', function('s:language_specified_mappings'))
call SpaceVim#plugins#repl#reg('scala', 'scala')
call SpaceVim#plugins#runner#reg_runner('scala', 'sbt run')
call SpaceVim#mapping#gd#add('scala', function('s:go_to_def'))
call add(g:spacevim_project_rooter_patterns, 'build.sbt')
augroup SpaceVim_lang_scala
au!
autocmd BufRead,BufNewFile *.sbt set filetype=scala
augroup END
try
let g:neoformat_enabled_scala = neoformat#formatters#scala#enabled()
catch
let g:neoformat_enabled_scala = []
endtry
let g:neoformat_scala_scalariform = {
\ 'exe': 'java',
\ 'args': ['-jar', s:scalariform_jar, '-'],
\ 'stdin': 1,
\ }
endfunction
function! s:language_specified_mappings() abort
" ensime-vim {{{
if exists(':EnTypeCheck')
nnoremap <silent><buffer> <F4> :EnSuggestImport<CR>
inoremap <silent><buffer> <F4> <esc>:EnSuggestImport<CR>
inoremap <silent><buffer> <c-;>i <esc>:EnAddImport<CR>
inoremap <silent><buffer> <c-;>o <esc>:EnOrganizeImports<CR>
if !SpaceVim#layers#lsp#check_filetype('scala')
nnoremap <silent><buffer> K :EnDocBrowse<CR>
endif
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','Q'],
\ 'EnInstall',
\ 'bootstrap server when first-time-use', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','h'],
\ 'EnDocBrowse',
\ 'show Documentation of cursor symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','e'],
\ 'EnRename',
\ 'Rename cursor symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','n'],
\ 'EnInline',
\ 'Inline local refactoring of cursor symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','g'],
\ 'EnDeclarationSplit v',
\ 'find Definition of cursor symbol', 1)
xnoremap <silent><buffer> <space>lt :EnType selection<CR>
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','t'],
\ 'EnType',
\ 'show Type of expression of cursor symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','p'],
\ 'EnShowPackage',
\ 'show Hierarchical view of a package', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','u'],
\ 'EnUsages',
\ 'find Usages of cursor symbol', 1)
" debug {{{
let g:_spacevim_mappings_space.l.d = {'name' : '+Debug'}
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','t'],
\ 'EnDebugBacktrace',
\ 'show debug stack trace of current frame', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','c'],
\ 'EnDebugContinue',
\ 'continue the execution', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','b'],
\ 'EnDebugSetBreak',
\ 'set a breakpoint for the current line', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','B'],
\ 'EnDebugClearBreaks',
\ 'clear all breakpoints', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','l'],
\ 'EnDebugStart',
\ 'launching debugger', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','i'],
\ 'EnDebugStep',
\ 'step into next statement', 1)
nnoremap <buffer><F7> :EnDebugStep<CR>
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','o'],
\ 'EnDebugNext',
\ 'step over next statement', 1)
nnoremap <buffer><F8> :EnDebugNext<CR>
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','d','O'],
\ 'EnDebugNext',
\ 'step out of current function', 1)
"}}}
" import {{{
let g:_spacevim_mappings_space.l.i = {'name' : '+Import'}
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','i','i'],
\ 'EnSuggestImport',
\ 'Show candidates for importing of cursor symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','i','q'],
\ 'EnAddImport',
\ 'Prompt for a qualified import', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','i','o'],
\ 'EnOrganizeImports',
\ 'Organize imports of current file', 1) " }}}
" }}}
endif
" import `vim-scala`
let g:_spacevim_mappings_space.l.i = {'name' : '+Import'}
inoremap <silent><buffer> <C-;>s <Esc>:SortScalaImports<CR>
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','i','s'],
\ 'SortScalaImports', 'sort imports', 1)
if SpaceVim#layers#lsp#check_filetype('scala') && executable('metals-vim')
nnoremap <silent><buffer> K :call SpaceVim#lsp#show_doc()<CR>
call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'd'],
\ 'call SpaceVim#lsp#show_doc()', 'show Document', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'e'],
\ 'call SpaceVim#lsp#rename()()', 'rename Symbol', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'g'],
\ 'call SpaceVim#lsp#go_to_def()', 'goto Definition', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'u'],
\ 'call SpaceVim#lsp#references()', 'find References', 1)
endif
" code runner
call SpaceVim#mapping#space#langSPC('nmap', ['l','r'],
\ 'call SpaceVim#plugins#runner#open()', 'execute current file', 1)
" Sbt
let g:_spacevim_mappings_space.l.b = {'name' : '+Sbt'}
if exists(':EnTypeCheck')
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'e'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt ensimeConfig"])',
\ 'generate-.ensime-file', 1)
endif
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'c'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt ~compile"])',
\ 'continuous-compile', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'C'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt clean compile"])',
\ 'clean-compile', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 't'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt test"])',
\ 'sbt-test', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'p'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt package"])',
\ 'sbt-package-jar', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'd'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt inspect tree compile:sources"])',
\ 'show-dependencies-tree', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'l'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt reload"])',
\ 'reload-build-definition', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'u'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt update"])',
\ 'update-external-dependencies', 1)
call SpaceVim#mapping#space#langSPC('nnoremap', ['l','b', 'r'], 'call call('
\ . string(function('s:execCMD')) . ', ["sbt run"])',
\ 'sbt-run', 1)
" REPL
let g:_spacevim_mappings_space.l.s = {'name' : '+Send'}
call SpaceVim#mapping#space#langSPC('nmap', ['l','s', 'i'],
\ 'call SpaceVim#plugins#repl#start("scala")',
\ 'start REPL process', 1)
call SpaceVim#mapping#space#langSPC('nmap', ['l','s', 'l'],
\ 'call SpaceVim#plugins#repl#send("line")',
\ 'send line and keep code buffer focused', 1)
call SpaceVim#mapping#space#langSPC('nmap', ['l','s', 'b'],
\ 'call SpaceVim#plugins#repl#send("buffer")',
\ 'send buffer and keep code buffer focused', 1)
call SpaceVim#mapping#space#langSPC('nmap', ['l','s', 's'],
\ 'call SpaceVim#plugins#repl#send("selection")',
\ 'send selection and keep code buffer focused', 1)
endfunction
function! s:go_to_def() abort
if SpaceVim#layers#lsp#check_filetype('scala') && executable('metals-vim')
call SpaceVim#lsp#go_to_def()
else
EnDeclarationSplit v
endif
endfunction
function! s:execCMD(cmd) abort
call SpaceVim#plugins#runner#open(a:cmd)
endfunction
" vim:set et sw=2 cc=80:
function! SpaceVim#layers#lang#scala#set_variable(var) abort
let s:scalariform_jar = get(a:var, 'scalariform_jar', s:scalariform_jar)
endfunction
function! SpaceVim#layers#lang#scala#health() abort
call SpaceVim#layers#lang#scala#plugins()
call SpaceVim#layers#lang#scala#config()
return 1
endfunction