vim, F# and lsp ( vimでF#を書いてみる)



![IMG_2165.jpeg](https://qiita-image-store.s3.amazonaws.com/0/149269/639d5677-a2cd-ba85-b940-63ea0e2485ee.jpeg)


<br>

```
ネコと和解せよ
```
<br>



# Summary

`vim`で`fsharp`をかいてみる

## Motivation

`FCS`を使った自作の補完エンジンを使ってたのですが、`lsp`を使用した分を試しに使ったらいい感じだったので切り替えようと思いました

## The Time required

１５分ぐらい

## Merit for lsp

サーバーを入れ替えるだけで他の言語（`python`とか`typescript`とか） も同様の機能を使える（と思う・・・

-> まだ`F#`しか試してません・・・（すいません・・・

## Environment

```bash
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.14.4
BuildVersion:	18E226

$ uname -a
Darwin callmekoheis-MacBook-Air.local 18.5.0 Darwin Kernel Version 18.5.0: Mon Mar 11 20:40:32 PDT 2019; root:xnu-4903.251.3~3/RELEASE_X86_64 x86_64
```

## Prepare

dotnet

もともと入れてる場合は `brew cask upgrade dotnet-sdk` もしくは `brew cask uninstall dotnet-sdk`

```bash
$ brew cask install dotnet-sdk
$ dotnet --version
2.2.105
```

macvim（ Neovim, Vim お好みで ）

```bash
$ brew install macvim
$ vim --version | head -n 1
VIM - Vi IMproved 8.1 (2018 May 18, compiled Feb 19 2019 12:07:03)
```

vim plugins（ここは自分のやりやすいように）

必要なのは３つ（vimだと５つ）

1. fsharp-language-server　（サーバー）
2. LanguageClient-neovim (クライアント）
3. deoplete.nvim　（補完便利ツール）

```bash
$ cd .vim/
$ vim foo.bash
```

```bash
if [ ! -d pack/pack1/start/ ]; then
  mkdir -p pack/pack1/start
fi

cd pack/pack1/start

# FSharp
git clone --depth 1 https://github.com/fsprojects/fsharp-language-server
$(cd fsharp-language-server
  wget 'https://raw.githubusercontent.com/fsharp/vim-fsharp/master/syntax/fsharp.vim' -P './syntax/'
  npm install
  dotnet build -c Release)
git clone --depth 1 https://github.com/autozimu/LanguageClient-neovim
$(cd LanguageClient-neovim ; git checkout next ; bash install.sh )
git clone --depth 1 https://github.com/Shougo/deoplete.nvim
git clone --depth 1 https://github.com/roxma/nvim-yarp
git clone --depth 1 https://github.com/roxma/vim-hug-neovim-rpc
```

```bash
$ bash foo.bash
```

vimrc（ keymap はお好みで ）

```vim
autocmd BufNewFile,BufRead *.fs,*.fsi,*.fsx 

setlocal filetype=fsharp

let g:mapleader = "\<Space>"

" fsharp-language-server
" ( change your path )
let s:pathFslangServer = '/Users/callmekohei/dotfiles/vim/pack/pack1/start/fsharp-language-server/src/FSharpLanguageServer/bin/Release/netcoreapp2.0/FSharpLanguageServer.dll'

" LanguageClient-neovim
let g:LanguageClient_autoStart = 1
let g:LanguageClient_serverCommands = {'fsharp': ['dotnet', s:pathFslangServer ] }

nmap <silent> <nowait><Leader>d :call LanguageClient#textDocument_definition()<CR>
nmap <silent> <nowait> K :call LanguageClient#textDocument_hover()<CR>

" deoplete( with yarp )
let g:deoplete#enable_at_startup = 1
```

## Check

```bash
# foo フォルダを作成
$ mkdir foo/

# foo.fsx ファイルを作成
$ touch foo.fsx

# List.と入力する
$ vim foo.fsx
    List.
```

５秒ほど待って下記の画面になったらオーケー

![Screen Shot 2019-04-09 at 10.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/149269/8ac70f72-f207-dde5-2471-cceaa81df2b4.png)


## Usage

### Autocomplete

```
文字を入力するだけ
```

![Screen Shot 2019-04-09 at 10.26.15.png](https://qiita-image-store.s3.amazonaws.com/0/149269/346a13b0-3261-1910-4d21-77e462373e6f.png)

### Go-to-definition

```
Space + d で定義元にジャンプ
Ctrl  + o で元のとこに戻る
```

`foo` の上で `Space + d`

![Screen Shot 2019-04-09 at 10.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/149269/002a4407-8584-7a4b-f151-b21028244e1d.png)

foo関数にジャンプ！

![Screen Shot 2019-04-09 at 10.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/149269/05c477b1-26c2-54da-d0f0-15971a3d61a3.png)


### definition (Hover)

```
調べたい文字の上で K（大文字のk）
```

`RegularExpressions` の上で `K`

![Screen Shot 2019-04-09 at 10.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/149269/ae53a138-6a25-c420-be59-234c0f746da5.png)

上窓ででるやつも・・・

`bar` の上で `K`

![Screen Shot 2019-04-09 at 10.38.19.png](https://qiita-image-store.s3.amazonaws.com/0/149269/61adecd4-c894-6836-eda6-6b77bdcefd59.png)

## 留意点

フォルダを作って、かつファイルを作ってからでないと、うまく動かない
-> ファイル単体では動作しない
-> プロジェクトフォルダ管理を前提とした作りとなっている

`Hover`をいい感じに動作させるにはあとひとひねり必要な感じ
-> どなたかよかったら教えてください！

他にもいろいろ機能ありそう