VimでFSharpを実行(Run)・テスト(Test)・デバッグ(Debug)する

VimでFSharpを実行(Run)・テスト(Test)・デバッグ(Debug)する

SN

5/21 18:01

=== 2018/05/21 Mon ===
はてなブログに以前書いたものを加筆・訂正したものです
======================


この記事はF# Advent Calendar2017 2日目の記事です ( see : F# Advent Calendar 2017 - Qiita )

この記事はVim2 Advent Calendar2017 2日目の記事です ( see : Vim2 Advent Calendar 2017 - Qiita )

$\textlarge{\color{red}{\rm IDEを使わなければ、コンピュータが自動でやってくれることなどほとんどなく、あとは自分の手でやるしかないのです。プログラミングとは元々そういうものだったはずです}$}$

see : Hello, Worldから始めよう | プログラマが知るべき97のこと


Greeting

こんにちは!最近ポンド円でほぼ死にかけのcallmekoheiです!みなさまいかがお過ごしでしょうか?今回はF#とVimのAdvent Calenderに同時にポストします!

思えばなんで僕、VimでF#のコード書いてるんでしょうね?Visual StudioとかVisual Studio Codeとか他にも書きやすい環境があるのに。。。なんというかですね、なんというかですね、VimにF#はウイスキーに生ハムぐらい合うんですよ。も、もちろん個人の意見ですがwww。まぁ、あれですよ。僕が複雑なこと理解できないやつなんでシンプルな環境の方が好きなんですよね。

というわけで、VimでF#のコード書くときのちょっとした環境構築について書いてみます。というか僕自身が趣味でコード書いてるのでお仕事とかで使うには辛いかもですが、まぁすごくシンプルな環境なんでお勉強とかちょっとしたテストとかにはいいと思ふのですよ。

それと環境構築はMac OSXで書いてますが、WindowsでもLinuxでもおんなじ感じですっ(だと思う・・・)

もしなにかあれば @callmekohei ( twitter )まで〜


Environment

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.4
BuildVersion: 17E202



00 - Install

まずは下地を整えませう〜


01. インストーラーをゲッツ!

Mac の場合Homebrewというインストーラーがあるのでこれをまずゲッツします。

Homebrewのホームページからコマンドをterminalで実行します。

Example of install Homebrew ( 2018/05/21 Mon )

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"



02. 各種アプリ・コマンドをゲッツ

vimはテキストエディタ、monoはF#の実行環境、そしてPaketは.NET libraryダウンローダーです。

$ brew install vim
$ brew install mono
$ brew install paket


.bash_profile or .bashrcに書く

export MONO_GAC_PREFIX="/usr/local"



03. Vimのプラグインをゲッツ

see also : Vim におけるプラグイン管理についてまとめてみた

ここでは例えばdein.vimというプラグインダウンローダー(plugin manager)を使ってみます。


01. deinフォルダーとdein.tomlファイルを作成します。たとえばこんな感じ。

$ mkdir -p $HOME/.config/nvim/dein/
$ touch $HOME/.config/nvim/dein.toml



02. .vimrcに下記を書きます。

" setting of dein

" ====== Fit your path!!! =====
let s:dein_dir = $HOME . '/.config/nvim/dein'
let s:toml = $HOME . '/.config/nvim/dein.toml'
" =============================

let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

if !isdirectory(s:dein_repo_dir)
execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
endif

execute 'set runtimepath+=' . s:dein_repo_dir

if dein#load_state(s:dein_dir)
call dein#begin(s:dein_dir)
call dein#load_toml(s:toml, {'lazy': 0})
call dein#end()
call dein#save_state()
endif

if dein#check_install()
call dein#install()
endif

" turn on plugins
set nocompatible
syntax enable
filetype plugin indent on



03. dein.toml ファイルにゲッツしたいプラグインを書いてみる

[[plugins]]
repo = 'Shougo/dein.vim'

#----------------------------------------------------------
# Aquires for running Neovim-plugins on Vim8
#----------------------------------------------------------
[[plugins]]
repo = 'roxma/nvim-yarp'

[[plugins]]
repo = 'roxma/vim-hug-neovim-rpc'

#----------------------------------------------------------
# Auto-complete for F# script
#----------------------------------------------------------
[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_add = '''
let g:deoplete#enable_at_startup = 1
'''

[[plugins]]
repo = 'callmekohei/deoplete-fsharp'
build = 'bash install.bash'
hook_add = '''
call deoplete#custom#option({
\ 'auto_complete_delay': 0,
\ 'ignore_case': v:true,
\ })

" remove duplicate candidates
call deoplete#custom#source('_',
\ 'converters', ['remove_overlap'])

" Disable the candidates in Comment/String syntaxes.
call deoplete#custom#source('_',
\ 'disabled_syntaxes', ['Comment', 'String'])
'''

#----------------------------------------------------------
# Debug for F# script
#----------------------------------------------------------
[[plugins]]
repo = 'callmekohei/tigaDebugger'

#----------------------------------------------------------
# Run fsharp command
#----------------------------------------------------------
[[plugins]]
repo = 'Shougo/vimproc.vim'
build = 'make'

[[plugins]]
repo = 'thinca/vim-quickrun'
hook_add = '''
set splitright
let g:quickrun_config = {}

let g:quickrun_config._ = {
\ 'runner' : 'vimproc'
\ ,'runner/vimproc/updatetime' : 60
\ ,'hook/time/enable' : 1
\ ,'hook/time/format' : "\n*** time : %g s ***"
\ ,'hook/time/dest' : ''
\ ,"outputter/buffer/split" : 'vertical'
\ ,'outputter/buffer/close_on_empty' : 1
\}

let g:quickrun_config.fsharp = {
\ 'command' : 'fsharpi --readline-'
\ ,'tempfile' : '%{tempname()}.fsx'
\ ,'runner' : 'concurrent_process'
\ ,'runner/concurrent_process/load' : '#load "%S";;'
\ ,'runner/concurrent_process/prompt': '> '
\}
'''

#----------------------------------------------------------
# Show indent guid lines
#----------------------------------------------------------
[[plugins]]
repo = 'nathanaelkane/vim-indent-guides'
hook_add = '''
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_start_level = 2
let g:indent_guides_guide_size = 1
let g:indent_guides_auto_colors = 0
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd guibg=black ctermbg=0
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven guibg=black ctermbg=0
'''



01 - 実行Runしてみよう!

sample.gif


01.コードを書いてみる

$ vim foo.fsx


foo.fsx

"hello" |> stdout.WriteLine



02.vim commandを実行

:w
:QuickRun


result

[Loading /Users/callmekohei/tmp/foo.fsx]
hello
namespace FSI_0003


*** time : 0.134435 s ***



02 - テストTestしてみよう!

image.png

===== caution =====
2018/05/21 Mon
Persimmon本体がNuget互換性対応中のためPersimmon.Scriptが上手く動作しません


see also : Persimmon 対応中のお知らせ


01.fooフォルダを作成し移動

$ mkdir foo/
$ cd foo/



02.persimmon.scriptをダウンロード

$ paket init
$ vim paket.dependencies

generate_load_scripts: true
source https://www.nuget.org/api/v2
nuget persimmon.script

$ paket install



03.コードを書いてみる

$ vim foo.fsx


foo.fsx

#load "./.paket/load/net471/main.group.fsx"

open Persimmon
open UseTestNameByReflection
open System.Reflection

/// write your test code here.
let ``a unit test`` = test {
do! assertEquals 1 2
}

/// print out test report.
new Persimmon.ScriptContext()
|> FSI.collectAndRun( fun _ -> Assembly.GetExecutingAssembly() )



04.vim commandを実行

:w
:QuickRun


result

[Loading /Users/callmekohei/tmp/deopletefs/.paket/load/net471/main.group.fsx
Loading /Users/callmekohei/tmp/foo/foo.fsx]
x
begin FSI_0003.Foo
Assertion Violated: a unit test
1. Line Number: 9
Expect: 1
Actual: 2
end FSI_0003.Foo
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.0008641
namespace FSI_0003.Main

namespace FSI_0003
val ( a unit test ) : Persimmon.TestCase<unit>


*** time : 0.491798 s ***



03 - デバッグDebugしてみよう!

tigadebugger.gif


01. install

sdbとsdbplgが必要です。

sdb

// download
$ git clone --depth 1 https://github.com/mono/sdb

// clone the submodules
$ cd ./sdb/
$ git submodule update --init --recursive

// build
$ make
$ make install


sdbplg

// download
$ git clone --depth 1 https://github.com/callmekohei/sdbplg

// build
$ cd ./sdbplg/
$ bash build.bash

// put `.sdb.rc` file on `$HOME`
$ cp .sdb.rc $HOME/

// set path
$ vim $HOME/.bash_profile
export SDB_PATH=/PATH/TO/sdbplg/bin/



2. デバッグしてみる!


01.コードを書いてみる

$ mkdir foo/
$ cd foo/
$ vim foo.fsx


foo.fsx

let foo() =
let mutable x = 1
x <- 2
x <- 3
x

foo ()
|> stdout.WriteLine



02.vim commandを実行( デバッグシンボル.mdbを作成し、debugger(tigaDebugger)を起動 )

:! sharpc -g --optimize- %
:TigaSetDebugger sdb
:Tiga foo.exe



03.デバッガーコマンドを入力

" set break point
: TigaCommand bp add at foo.fsx 3

" run
: TigaCommand r

" next
: TigaCommand n

" quit debug mode
: TigaQuit



ショートカットでらくらく操作〜




Press
To




ctrl b
Add or delete Breakpoint


ctrl d

Delete all breakpoints


ctrl r

Run


ctrl k

Kill (Break)


ctrl p
Replace watch variable


ctrl y
Add watch variable


ctrl t
Delete watch variable


ctrl n
Step over ( Next )


ctrl i
Step In


ctrl u
Step out ( Up )


ctrl c

Continue



Qiita - Vimタグが付けられた新着投稿

Vim Ale で Docker 内のコマンド実行

SN

7/20 14:10

Lint 用のコマンド (ここでは flake8) の実行パスが設定できるので、そこに登録してあげれば良い


~/.vimrc
let g:ale_python_flake8_executable = 'bin/flake8'




bin/flake8
#!/bin/bash

docker-compose ...

[Vim] Vim に Language Server Protocol クライアント機能を導入して Rubyの補完機能を復活させた

SN

7/17 10:27

YouCompleteMe をしばらく前から使っていました。最近、MacOSXな環境で、Rubyの補完がうまく動かなくて、 . を入力した瞬間、 vim が死亡するようになってしまいました。原因は良くわかりません。とりあえず、死...

[Vim] neosnippetで使うsnippet自作

SN

7/16 16:07



NeoSnippetをインストール


vimrc
NeoBundle 'Shougo/neosnippet.vim', {
\ 'depends' : ['Shougo/neosnippet-snippets'],
\ 'insert' : 1,
\ 'filetypes' : 'snippet',
\ 'unite_sou...

.vueファイルを編集するときのVimの設定

SN

7/16 13:07



シンタックスハイライト用のプラグインを入れる

vim-vueというプラグインを入れる


NeoBundleの場合


vimrc
NeoBundle 'posva/vim-vue'



これで大体はOKなのですが、いくつか問題が出ることがあります。

...

矩形ヴィジュアルでのカット/ヤンクした内容を,挿入/追加

SN

7/16 09:30

矩形ビジュアルの挿入や追加については,色々な箇所で紹介されておりますが,

こちらは,あまり目にすることがなかったので.

つか,まぁそれだけ普通に,特に必要とされることがないものだから...,なの...

viを初心者でも使いやすくしてみる

SN

7/16 06:02



はじめに


vimでは上下左右をhjklで動くのが正道です
しかし、vim初心者としては、カーソルがある環境ならばカーソルで動きたいものです
また、INSERTモードになったときに、バックスペースも使いたいです
さ...

Vim を WebAssembly に移植した

SN

7/14 14:50

https://rhysd.hatenablog.com/entry/2018/07/09/090115

NeovimでC/C++のIDE(っぽい)環境を構築する

SN

7/13 16:42



はじめに

私はC/C++開発にNeoVimを使用しています。

PythonなどはこのようなVimをIDEチックにみたいな記事がたくさんありますが、C/C++に関しては少ない気がしたので、今回私の使用している環境に関して記...

WSL上でWindows用のVimをクロスビルド

SN

7/12 20:28



概要

俺用Vimのビルド環境をWSL上に移行したのでメモ


主なfeature

+terminal +directx +lua/dyn +python/dyn +python3/dyn


環境

WSL + Ubuntu-18.04


ビルドスクリプト


build
sudo apt-get install -...

Vimmer が Spacemacs に完全に乗り換えるまで (Vimmer 向け設定)

SN

7/12 18:32



こんな方へ


Vim ではなく、Vim のキーバインドが好き。
設定ファイルをすべて自分でメンテナンスするのが面倒。勝手にアップグレードされて欲しい。しかし自分でカスタマイズする余地も欲しい。


この記事は...

viの使い方メモ

SN

7/12 12:03



概要

自分がviエディタを使う時に毎回毎回コマンドを調べているのでまとめておこうと思って

注:私がよく使うものしか載せてないです


基本的操作


起動

vi ファイル名.py (pythonの場合)


モード

vi...

vimrcのなんとか

SN

7/11 12:02



Summary

vimrc を書くのに必要最小限な知識のまとめ


Thanks

Vim-JP の掲示板のみなさま


Index

下記をのんびり書くよ〜



minimal.vimrc
syntax ( vimrc で色付け )
syntax ( syntax file を自作する )...

linuxでJavaの動作確認をすることで、コンパイルや階層理解がグッと理解できた

SN

7/9 19:50

先日、自社勉強会で、Javaのコンパイル、パッケージ管理について学習した。eclipseで環境が出来たものを編集することしかなかったので、コンパイルオプションを設定し、パッケージを作成することで、コンパイルに...

vim-gitgutterが使える話

SN

7/9 13:58

Vimを使っててGitのプラグインが欲しいなーと思ったらたいていの人が使ってる(と思う)gitgutterですが、他の記事とか読んでても横にDiffをつけるくらいしかやっていない。。

これでは能力の無駄遣いすぎる気がす...

まだexuberant-ctags使ってるやつちょっと来い(自戒) universal-ctagsのインストール方法

SN

7/9 00:00

前回の記事vimに, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにした話で, exuberant-ctagsをインストールしていました.

しかし, これがいけない!

もうずっと前に更新が途絶え, メンテナンス...

vimに, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにした話

SN

7/8 15:25

vimでも, タグジャンプを使えるようになりたい!

ということで, vim初心者が, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにするための設定を紹介しようと思います.


環境


OS

OS: Windows...

dein.vim SSL connect error dein vim

SN

7/7 16:11



dein.vim SSL Error


Overview

dein.vimでSSL connect error は発生しました。

[dein] /home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim
[dein] Maybe wrong username or repository.
[dein...

Vimiumの基本的な使い方

SN

7/6 23:30

自分用のメモを兼ねたVimiumの使い方をまとめました.


Vimiumとは

VimiumはGoogle Chromeの拡張機能です.

Vimiumをインストール


Vimiumを使う利点


Chromeをマウスをなるべく使わずに操作することができ...

はじめてvim改造 patheogenの導入とnerdTreeの導入と, 時々autocmdの使い方

SN

7/6 20:08

プログラミング歴1年ちょっと.

ずっと裸のvimでやってきました.

補完もctrl+p,

毎回,ctrl+zで, shellに戻って, コンパイラして, エラーチェックする.

化石のようなプログラマでした.

vimの能力を全然使いこ...

historyから特定のコマンド履歴を消す [Vim]

SN

7/5 11:40



消したい行だけ編集で消す

#bash
vim ~/.bash_history

#zsh & peco
vim ~/.zsh_history


任意の行でddして:wq

これでhistoryコマンド以外の履歴は消せるので、あとは

再ログインすればhistoryコマ...

vim で編集中のファイルをブラウザで開いたり、格納ディレクトリを Finder を開いたりするエイリアス(Mac)

SN

7/5 10:13

mac はopenというコマンドでダブルクリックのようなことをできる。

参考: 知ってるとちょっと便利なMacの固有コマンド

また、vim のコマンドラインモードでは%で今編集中のファイルのパスを手に入れることが...

エクスプローラからWSLのVIMでファイルを開く方法

SN

7/5 02:10



お断り

以下の方法は本質的に下記サイトの内容をWindows10 1803アップデートに合わせて更新しつつ,パスに空白が含まれる場合に対応し,SendTo版を加えたものです.



https://situsali.com/membuat-shortcut...

vimで保存時に自動コンパイル

SN

7/4 15:36



対象


vimが好き
コンパイルが面倒
シェルで作業してる人



概要

latexやsassなど主にコンパイルが面倒なものは自動コンパイルがそもそも実装されています。

latexであれば

$ latexmk -pvc sample.t...

vimコマンドの操作まとめ

SN

7/1 11:55



vimとは

vimは、CUIベースのテキストエディタです。

状況に応じてモードを切り替えながら、高速にテキストを編集することができます。

vimコマンドのモードと操作方法を説明します。


モードの種類

...

Vim初心者に送るカテゴリ別Vim Pluginまとめ

SN

7/1 07:47



動機

最近会社に入った後輩がVimを使っていました。

彼の.vimrcはプラグインが何も入っていない非常にシンプルなものでした。

これはしめたものだぞと、良さそうなプラグインを怒涛のように勧めまくろ...

Vimで覚えたこと

SN

7/1 00:41

Vimでコピペしたいときは、

iで入力モードにする前に、:でコマンドモードにして、

:set pasteと入力してから、iで入力モードにしてcommand + vでコピペすれば良い。

参考)http://sugamasao.hatenablog....

vimが使える!ローカルでgas編集・更新するための環境設定

SN

6/30 15:12



動機

普段はvimでweb屋さんをしていますが、この仕事をしていると、

- 「googleスプレッドシートでこんな感じに作って」

- 「googleフォームをこんな風にしたい」

なんていう社内からのリクエスト...

vimにtaglist導入

SN

6/30 09:53



ctagsインストール

https://qiita.com/maeharin/items/9f98c0d63ab764ee21a8

$ brew install ctags


Macにデフォルトで入っているctagsより優先して今回入れるctagsを使うようにしたいから、

$ ls /usr/loc...

iTermで「⌘ + /」

SN

6/28 19:58



わざわざ投稿するないようではない

すごくどうでもいい話ですが、iTermを使っている人、iTermでvimを使っている人、「⌘ + /」押してみて、知ってた?

どうでもいいこと投稿してすいません。

WSLにneovimを入れる

SN

6/27 16:58



はじめに

WSLに入っているVimはVersionが古い7.4です。

makeしていれてるのはちょっとめんどうなのでaptで入れられるneovimを

入れてみました。




インストール

https://github.com/neovim/neovim/...

PR:bitflyer

bitFlyer ビットコインを始めるなら安心・安全な取引所で