ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

neovimにLanguageClientをインストールしようと思ったらハマった

Rustを書く際にIntellij IDEA使ってるけど、Jetbrainsは自前で補完とか作ってるので rlsを試してみたくてneovimにLSPのクライアントをインストールしようと思ったらハマったのでメモ

インストールまではできてる!って人は原因と解決法まで読み飛ばして欲しい

使ったもの

github.com

github.com

github.com

インストール手順

neovim, dein.vimについては他にいっぱいあるので省略するとして、LanguageClient-neovimのインストールから
(neovim, dein.vimは動作することを前提に書いていきます)

インストールについても基本的には書いてあるインストールをdein.tomlに書くだけ

github.com

# Rustで使う前提なので記事とは関係ないけど
[[plugins]]
repo = 'rust-lang/rust.vim'
on_ft = 'rust'

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'bash install.sh'

これでdein.vimを使ってプラグインをインストールする

番外: RustのLSPインストール

nightly使ってる記事が多いけど、どっかのタイミングからstableで使えるようになったらしい
必要なものをrustupを使ってインストールしておく

rustup component add rls-preview rust-analysis rust-src

起動の設定とか

LanguageClient-neovimのReadmeを参考に設定した
イマイチ設定周りわかってないので、とりあえずrlsの起動引数だけ変更して*1ほとんどそのままinit.vimに書いた

ちゃんとやるならdein.vimhook_sourceに書いたりするほうがいいのかも

" Required for operations modifying multiple buffers like rename.
set hidden

let g:LanguageClient_serverCommands = {
    \ 'rust': ['rustup', 'run', 'stable', 'rls'],
    \ 'javascript': ['javascript-typescript-stdio'],
    \ }

nnoremap <silent> K :call LanguageClient_textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>

LanguageClient-neovim/INSTALL.md at next · autozimu/LanguageClient-neovim · GitHub

以上の設定で動くはずだった

動くはずだったんですよ書いてること見てる限りだと

いざ適当にcargo new --bin hogeみたいなのしてnvim src/main.rsするとなんかエラー出てる

LanguageClient: Not executable!
続けるにはENTERを押すかコマンドを入力してください

起動に失敗してるので:LanguageClientStartとかできない

原因と解決法

dein.vimでインストールしたLanguageClient-neovimのディレクトリに行ってbinディレクトリの中を見てみると
bash install.shでビルドしたlanguageclientという実行ファイルに 実行権限がついてない

.rw-rw-r-- 8.0M yuzu 17  1月 20:16 languageclient

試しに実行権限与えてみたらちゃんと動作した

chown u+x languageclient

まとめ

なんかみんな動いてるっぽいし自分だけなのかと思ったけど
buildしてるのcargoだし普通に実行権限ついてないのがおかしい気がしてきた
(適当にプロジェクト作ってビルドしたら実行権限ついてるし)

とりあえず2日くらい消費してしまったけど動いてよかった

*1:nightlyだった部分をstableに