渋々 Intellij でscalaを書いていたそこのあなた
vim で シンタックスハイライトはもちろん、 Intellij みたいにフォーマットも構文チェックもでできちゃうんです。
環境
- Mac OS Mojave
- Vim 8.1 (ターミナル機能を使うには現時点でver 8,1 が必須。)
- sbt 1.0 ~
- ENSIME
- vim-plug
- neovim
scalafmtのインストール
brew install--HEAD olafurpg/scalafmt/scalafmt
scalafmt --version // 2.0.0-RC7 以降なら成功
sbtの設定
globalに設定していきます。どちらも最低限なのでコピペで追加してどうぞ。
addSbtPlugin("org.scalameta"%"sbt-scalafmt"%"2.0.0")addSbtPlugin("org.ensime"%"sbt-ensime"%"2.5.1")addSbtPlugin("com.eed3si9n"%"sbt-assembly"%"0.14.9")
importorg.ensime.EnsimeCoursierKeys._importorg.ensime.EnsimeKeys._ensimeRepositoryUrlsinThisBuild+="https://oss.sonatype.org/content/repositories/snapshots/"ensimeServerVersioninThisBuild:="3.0.0-SNAPSHOT"ensimeProjectServerVersioninThisBuild:="3.0.0-SNAPSHOT"cancelableinGlobal:=trueensimeJavaHomeinThisBuild:=file("/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home")serverConnectionType:=ConnectionType.TcpserverPort:=4273
sbt-assemblyはなくても困りませんがプロジェクトをjar
にコンパイルしてデプロイしたり sbt環境 を持っていない人に配ったりしたいときに重宝します。
Vimプラグインたち
- neocomplete 補完
- deoplete 補完
- vim-scala シンタックスハイライト
- ensime-vim シンタックスハイライト
- nvim-yarp neovimじゃない人向け
- vim-hug-neovim-rpc なにこれ
- neovim-fuzzy aleのつきもの
- neomake aleのつきもの
- vim-autoformat' フォーマッタ
- ale 構文チェック
vimrcの設定
set nocompatible
filetype off
language C
"plugを使ってインストール
call plug#begin('~/.vim/plugged')
+ if has('nvim')
+ Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
+ else
+ Plug 'Shougo/deoplete.nvim'
+ Plug 'roxma/nvim-yarp'
+ Plug 'roxma/vim-hug-neovim-rpc'
+ endif
"----------------------------------------------------------
" インストール
"----------------------------------------------------------
+ if has('lua')
+ " コードの自動補完
+ Plug 'Shougo/neocomplete.vim'
+ " スニペットの補完機能
+ Plug 'Shougo/neosnippet'
+ " スニペット集
+ Plug 'Shougo/neosnippet-snippets'
+ endif
"----------------------------------------------------------
" neocomplete・neosnippetの設定
"----------------------------------------------------------
+ if has('neocomplete.vim')
+ " Vim起動時にneocompleteを有効にする
+ let g:neocomplete#enable_at_startup = 1
+ " smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
+ let g:neocomplete#enable_smart_case = 1
+ " 3文字以上の単語に対して補完を有効にする
+ let g:neocomplete#min_keyword_length = 3
+ " 区切り文字まで補完する
+ let g:neocomplete#enable_auto_delimiter = 1
+ " 1文字目の入力から補完のポップアップを表示
+ let g:neocomplete#auto_completion_start_length = 1
+ " バックスペースで補完のポップアップを閉じる
+ inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"
+ "targetフォルダを読み込まない
+ set wildignore+=*/target/*
+
+ " 補完ウィンドウの設定
+ set completeopt=menuone
+
+ " rsenseでの自動補完機能を有効化
+ let g:rsenseUseOmniFunc = 1
+ " let g:rsenseHome = '/usr/local/lib/rsense-0.3'
+
+ " auto-ctagsを使ってファイル保存時にtagsファイルを更新
+ let g:auto_ctags = 1
+
+ " 起動時に有効化
+ let g:neocomplcache_enable_at_startup = 1
+
+ " 大文字が入力されるまで大文字小文字の区別を無視する
+ let g:neocomplcache_enable_smart_case = 1
+
+ " _(アンダースコア)区切りの補完を有効化
+ let g:neocomplcache_enable_underbar_completion = 1
+
+ let g:neocomplcache_enable_camel_case_completion = 1
+
+ " ポップアップメニューで表示される候補の数
+ let g:neocomplcache_max_list = 20
+
+ " シンタックスをキャッシュするときの最小文字長
+ let g:neocomplcache_min_syntax_length = 3
+
+ let g:neocomplete#force_omni_input_patterns.ruby = '[^.*\t]\.\w*\|\h\w*::'
+
+ if !exists('g:neocomplete#keyword_patterns')
+ let g:neocomplete#keyword_patterns = {}
+ endif
+ let g:neocomplete#keyword_patterns['default'] = '\h\w*'
+ " エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定・・・・・・②
+ imap <expr><CR> neosnippet#expandable() ? "<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "<C-y>" : "<CR>"
+ " タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ・・・・・・③
+ imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"
+ endif
+ " Use deoplete
+ let g:deoplete#enable_at_startup = 1
+
+ "Linting with neomake
+ let g:neomake_sbt_maker = {
+ \ 'exe': 'sbt',
+ \ 'args': ['-Dsbt.log.noformat=true', 'compile'],
+ \ 'append_file': 0,
+ \ 'auto_enabled': 1,
+ \ 'output_stream': 'stdout',
+ \ 'errorformat':
+ \ '%E[%trror]\ %f:%l:\ %m,' .
+ \ '%-Z[error]\ %p^,' .
+ \ '%-C%.%#,' .
+ \ '%-G%.%#'
+ \ }
+ let g:neomake_enabled_makers = ['sbt']
+ let g:neomake_verbose=3
+ " Neomake on text change
+ autocmd InsertLeave,TextChanged * update | Neomake! sbt
" for はファイルタイプがphpならプラグインを読み込む
" do はプラグインインストール、アップデート時に実行する内容
Plug 'pangloss/vim-javascript', { 'for': ['javascript', 'javascript.jsx'] }
Plug 'othree/yajs.vim', { 'for': ['javascript', 'javascript.jsx'] }
Plug 'othree/es.next.syntax.vim', { 'for': ['javascript', 'javascript.jsx'] }
Plug 'othree/javascript-libraries-syntax.vim', { 'for': ['javascript', 'javascript.jsx'] }
Plug 'python-mode/python-mode', { 'branch': 'develop' }
Plug 'scrooloose/nerdtree'
Plug 'itchyny/lightline.vim'
Plug 'airblade/vim-gitgutter'
Plug 'tpope/vim-fugitive'
+ Plug 'derekwyatt/vim-scala'
Plug 'shime/vim-livedown'
Plug 'flowtype/vim-flow'
Plug 'Yggdroot/indentLine'
Plug 'simeji/winresizer'
Plug 'shinespark/vim-list2tree'
Plug 'fatih/vim-go'
+ Plug 'ensime/ensime-vim', { 'do': ':UpdateRemotePlugins' }
+ Plug 'roxma/nvim-yarp'
+ Plug 'roxma/vim-hug-neovim-rpc'
+ Plug 'cloudhead/neovim-fuzzy'
+ Plug 'neomake/neomake'
+ Plug 'Chiel92/vim-autoformat'
+ Plug 'w0rp/ale'
call plug#end()
+ "構文チェック
+ let g:ale_sign_column_always = 1
filetype indent on
autocmd FileType hoge setlocal sw=4 sts=4 ts=4 et
autocmd FileType hoge setlocal sw=2 sts=2 ts=2 et
autocmd FileType js setlocal sw=2 sts=2 ts=2 et
autocmd FileType zsh setlocal sw=4 sts=4 ts=4 et
autocmd FileType hoge setlocal sw=4 sts=4 ts=4 et
+ autocmd FileType scala setlocal sw=2 sts=2 ts=2 et
+ "scalafmt キーマップ
+ noremap <F5> :Autoformat<CR>
+ let g:formatdef_scalafmt = "'scalafmt --stdin'"
+ let g:formatters_scala = ['scalafmt']
そしたら:source .vimrc
してから:PlugInstall
してください。
そんで再び vimを開くと ENSIMEとかが pip install hogehoge しろ〜!とか
brew install hogehogeしろ〜!とか行ってくるのでその通りインストールしてあげてください。
(ちなみに自分はpip3
じゃないとダメだった。)
試してみる
これで完成なはず。
試しにvimでインデントグチャグチャのコード書いて:Autoformat
叩いたり コードから def
句とか抜いて保存してみてください。