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がdyld: Library not loadedで起動できなくなった [mac]

SN

9/12 17:56



現象

bashrcでも修正しようとターミナルからvimを起動しようとすると、以下のエラーが出て起動しない

$ vim .bashrc
dyld: Library not loaded: /usr/local/opt/python/Frameworks/Python.framework/Versions...

m文字以内を表す{,m}なんて量指定子は存在しない。…わけではない。

SN

9/10 09:06



結論

通常?多くの言語で使える正規表現では{,m}は使えず、{0,m},{1,m}を使う必要がある。

が、

(いまのところ見つけられた範囲では)

Rubyやvimなどでは{,m}の書き方が使える。

正規表現エンジンで言...

数年ぶりに Vim 環境を整理しなおしたのでまとめ

SN

9/9 23:30

ここ 2 年くらいはガッツリ Swift エンジニアだったのもあって、わりと Vim から離れてたわけなんですけども、いまアプリ開発自体は担当しなくなって最近は Ruby/PHP 触る時間が増えてきて、まあ Xcode と比べる...

#28/100DaysOfCode【gitでローカルリポジトリにコミットして、リモートリポジトリにプッシュしようとしてみた】

SN

9/9 23:20



概要

本日やりたかったこと

①リモートリポジトリとローカルリポジトリの接続

②Eclipseで先週のフィードバックのリライト

③リモートへのプッシュ

④Javaの勉強へ

本日やったこと

①リモート...

vim 命令集

SN

9/8 22:59

上移動:k

下移動:j

右移動:l

左移動:h

最初移動:gg

最後移動:G

通常状態:Esc

挿入状態:i

一文字追加&挿入状態:a

一行追加&挿入状態:o

編集状態:v

部分編集...

Vim初心者が感じた、Vimの不満点を改善してみた

SN

9/6 10:15



AtomからVimへ

今までテキストエディタはAtomを使用していたのですが、こういった記事を見てからAtomを使うのが億劫になってしまいました。

なので、最近はVimを使うようにしています。

Qiitaの記事を...

macにvim8.1とプラグインをインストール

SN

9/4 23:28

vim8.1がリリースされたので重い腰を上げて数年放置している自分のvim環境をリプレースすることを決意。

以下は軌跡である。

やってみた感想:やれば結構すぐ終わるから面倒くさがらずに早くやればよかった。...

vimでclipboardを+にしたいけどならない人向け

SN

9/3 23:25

初学者です。

vimをコンパイルしたら


$ vim --version | grep clipboard
-clipboard +jumplist +persistent_undo +vertsplit
+emacs_tags +mouse_dec -sun_workshop ...

vimで貼りつけ時に自動インデントをしないようにする

SN

9/2 17:40

ガチのVimmerではないので、よくはまる。

他の場所からコードをコピペでVimに張り付けると、元々ついているインデントに加えてさらにVim側で自動インデントが走ってひどいことに。


貼りつけモードにしてか...

プログラミング効率化

SN

8/31 18:52



vimtutor

terminalでvimtutorと打てば、vimのチュートリアルが行える。


vimium

chromeの拡張機能。コマンドだけでブラウザ操作ができる。


intellij

リモートとローカルのフォルダ構成などを自動マッピン...

vim の neocomplete プラグインをインストール

SN

8/31 16:12

vim の補完プラグイン neocomplete をインストールした時のメモ。

環境は以下。


ubuntu 16.10 (Yakkety Yak)
vim: version 7.4.1829


requriements によると、 7.3.885+ with Lua が必須だそうです。

バージ...

文字列操作 〜SedとVimと、時々、正規表現〜

SN

8/31 10:55



文字列操作〜SedとVimと、時々、正規表現〜



みなさんSedコマンド使ってますか?

手打ちで文字列編集とかしてません?

正規表現使ってますか?

Vimはエディターの好みの問題なので興味あれば使っ...

Good Bye Vim. Hello VSCode.

SN

8/31 00:34



かつてのVim人気はどこへ

5年くらいまでの技術記事といえばVimが常連。はてぶのテクノロジーカテゴリは毎日必ずなにかしらVimの記事がホットエントリに上がっていました。

Vim Advent Calendar 2013に至っ...

Vim のファイルセーブは異常だからやめたい

SN

8/30 15:33

Vim 使いの皆さんは、 Vim のファイルを保存する方法をご存知だろうか?

そうだ、 :w<CR> のことだ。

……皆さん、お気づきだろうか。

たかがファイルを保存するのに、

なんと、


三つもキーをタ...

git + peco + Vim — git grep でマッチしたファイルを選んでVim で編集する

SN

8/30 04:28



イメージ



echo という文字列があるファイルを git grep する
12行目でマッチしているファイルを選ぶ





Vimで12行目から編集開始できる





ポイント



$EDITOR の環境変数で利用するエディタを決める

...

Git — git の編集モードで Vimを最初からインサートモードで開く

SN

8/29 19:11

素早くコミットしていく開発スタイルだとじわじわと便利


git config

~/.gitconfig


[core]
editor = 'vim' -c 'startinsert'



Versions


git version 2.8.1
VIM - Vi IMproved 8.1



Links


Gist

みんなにもっとCtrl-zで実行中のjobをサスペンドできること知って欲しいし、使って欲しい (bash、Zsh)

SN

8/29 01:56

皆さんこんにちは、かみけん(@kamykn)です。

(最近、アカウント名をkmszkからkamyknに変えました。)


この記事で紹介すること

bashやzshなら実はscreenやtmuxを使わなくてもVimやMySQL CLIなどを一つのウイ...

Vim — 複数行をカット&ペーストする ( 3行カットするなら 3dd → p )

SN

8/28 10:53



3行カットしたい場合


カット

3dd



ペースト

p



環境


vim 7.3



あわせて読みたい


Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK - Qiita
Vim — 複数行をコピー&...

AISO の良いVim > 知らないと損するインサートモードへの入り方色々

SN

8/27 02:19



一覧


A



a — 現在の位置 + 1文字先からインサートモードへ

A — 行末に移動してインサートモードへ



I



i — 現在のカーソル位置からインサートモードへ

I — 行頭に移動してインサートモードへ



S


...

障害者向けのShiftキー自動押下

SN

8/26 22:42

ErgoDoxEZを使っていて、面白そうではあるが、個人的には不便な設定を見つけたので、紹介する。


Shiftキー自動押下

正確には、ErgoDoxに関係なく、QMKのFirmwareに関する設定の一つ。

結論を言えば、Aキー...

Vim の jj を Mac の日本語入力中でも使えるようにする

SN

8/25 03:13



TL;DR

Vim や GUI エディタの Vim 拡張機能 (e.g. vscodevim) を普段使うとき、 jj を esc にマップして insert mode を抜けるのに使っているのですが、日本語入力中に jj (つまり っj) を入力したときも機能...

逆引きVim(随時更新)

SN

8/24 15:14


行末へ移動:$

行頭へ移動:0, ^

一文字決してインサート:s


Vim — 最初からインサートモードでファイルを開く

SN

8/23 10:20

vim some_file -c 'startinsert'



-c オプションって何?

ファイルをロードした後に実行するコマンド。

$ vim --help | grep '\-c '
-c <command> Execute <command> after loading the f...

Vim — q とコロン ( q: ) で出てくるあいつは何と呼ぶのか > 「コマンドライン・ウィンドウ」らしい

SN

8/23 05:33

Vimを終了 ( :q ) させようとすると、たまに押し間違えてでてくるあいつ。

コマンドラインウィンドウ。

カタカナで書くと山口百恵の曲っぽい。

もしくは単に「コマンドウィンドウ」と呼ぶみたいだ。



通...

漆黒の闇に近づくために(なるべく画面を黒くして目を疲れないようにしよう)

SN

8/22 22:40



内容

目が疲れるのでなるべく黒画面にするための方法


黒画面にした環境

windows7

Linux Mint LMDE2

word2016(windows版)

Vim

jupyter notebook

vivaldi


はじめに

僕は長期間、いや...

Vim — コマンド入力モードで移動するショートカット (普通のショートカットが効かない)

SN

8/22 16:58



結論から書く



CTRL-B (行頭に移動)

CTRL-E (行末に移動)


を覚えておくだけで相当便利になりそう。


ショートカット一覧


CTRL-B or <Home>
cursor to beginning of command-line
CTRL-E ...

Ubuntu16.04にVimを導入する

SN

8/22 16:40



まえがき

UbuntuにVimを導入したい人のメモ。


Vimのインストール

Ubuntuにはデフォルトで"Vim-tiny"というエディタが入っていますが、最小限の機能しかなく使いづらいので、Vimをインストールします。

sud...

Mac — Vimでクリップボードのテキストを直接編集する

SN

8/22 16:31

pbpaste と pbcopy をうまく組み合わせれば出来るはずと思って試した結果。


結論から先に書く

function pbvim (){
readonly pbvim_tmp_file=./.pbvim.tmp

pbpaste | vim - +"w $pbvim_tmp_file"
cat "$...

Vim — カット&ペーストではなく単に削除する ( "_d ) ( クリップボードにコピーしない削除 )

SN

8/20 18:25

"_d で可能。

何にこれ? と思うが、そのとおりにキーを入力すれば良い。

ダブルクォート・アンダースコア・ディー。

(「詠唱」、「祈り」、「念じろ」)

削除したテキストは p でもペーストされないのが分...

Vim patchダイジェスト [2018/08] (仮)

SN

8/20 17:25

Vim patchダイジェスト [2018/08] (仮)

(8.1.0230 ~ 8.1.0301)



8.1.0301: GTK: マルチモニター環境でモニター間を跨る位置のGVimにてIM未確定文字の表示位置がおかしい件を修正しました。(※patchの説明は...

PR:bitflyer

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