Goで書くNeoVimプラグイン
1/25: OpenAppLab Aizu LT feat. CyberAgent
@noah_orberg
About Me
name: Reo Yamada (aka. Noah)
NeoVim教徒
(できれば宗教戦争は嫌なので)
Spacemacsも使うよ☆
Twitter: @NoahOrberg
Github: NoahOrberg
主にサーバーサイド
よく書く: Golang, Haskell
gRPC, REST API,
nvimプラグイン
・Aizu Advent Calendarネタの焼き直し
・最近作ったプラグインの話
(`diesirae.nvim`)
話すこと:
Vim好きな(又はよく使う)人 
NeoVim使ってる人
NeoVimとは
ざっくりいうと、Vimをモダンに、
リファクタリングしちゃうプロジェクト
Remote Plugin
非同期にも
Goでどう書くの?
neovim/go-client を利用します
neovim/go-clientとは?
msgpack-RPCでの通信部分を
いい感じにラップしてくれてる
書く時の手順
1. Goで書く&& go install
2. 実行ファイルからマニフェストを得る
3. RemotePluginをRegisterするvimscriptを書く
1. Goで書く&& go install
2. 実行ファイルからマニフェストを得る
3. RemotePluginをRegisterするvimscriptを書く
Go側でExコマンドと関数を定義できる
→主にそれを使う
Exコマンド `:HelloCmd world`
関数呼び出し `:call Hello(‘world’)`
1. Goで書く&& go install
2. 実行ファイルからマニフェストを得る
3. RemotePluginをRegisterするvimscriptを書く
1. Goで書く&& go install
2. 実行ファイルからマニフェストを得る
3. RemotePluginをRegisterするvimscriptを書く
manifestの自動更新
開発でつらいところ
非同期(別プロセス)でGoの実行ファイルが走っている
→ panicしても、nvim側では原因不明でchが落ちた扱い
→ 原因究明が困難 > <
愚直な解決策
ここまで来て本題
競技プログラミング、好きですか?
1. Webブラウザで問題見る
→解く(これはエディタでやる)
2. 出来た
→サンプル入力を標準入力で流しこむ
3. 出力を確認する
4. 完成したらエディタからコードをコピー
5. ブラウザ上の入力フォームに貼り付けsubmit
基本的には 1. - 3. の繰り返し
4., 5.でコケることもある
問題を解く時の流れ (AOJ)
しんどくない?
エディタだけで完結させたくない?
1. 問題をnvim上でsubmit
2. nvim上で1.のstatusチェック
3. 公開済サンプル入力のRun
(現状、Go, C++14(手元にコンパイル環境がある前提)のみ限
定的)
4. 結果との比較 (AC, WA, CEなど)
5. AOJのAPIサーバーとのSessionあたりの操作
diesirae.nvimでやれることを大雑把に
実は昨年末にはほぼ完成していたが、
問題点をしばらく時間がたってから
洗い出してみた(少し修正しつつある)
1. TestRunの言語の少なさ&&特定環境
GoとC++14しか対応していない。
2. TLEを考慮していない
例) breakなしの無限ループなどをTestで走らせるときなど
3. sync.RWMutex等で排他制御
非同期の特性上、同時に処理することが起こりうる
diesirae.nvimで未実装なところ
1. TestRunの言語の少なさ&&特定環境
GoとC++14しか対応していない。
2. TLEを考慮していない
例) breakなしの無限ループなどをTestで走らせるときなど
3. sync.RWMutex等で排他制御
非同期の特性上、同時に処理することが起こりうる
diesirae.nvimで未実装なところ
詳細: 現状は現在のバッファの言語を判定してswitch-caseでコマンド
列を選別し、外部のシェルを叩いている
α: C++の場合、g++, clang++を使うか否かなど
TestRun対応言語の少なさ&&特定環境
解決策: init.vimからユーザが設定を注入できるようにする
例: github.com/thinca/vim-quickrun
TestRun対応言語の少なさ&&特定環境
1. TestRunの言語の少なさ
GoとC++14しか対応していない。
2. TLEを考慮していない
例) breakなしの無限ループなどをTestで走らせるときなど
3. sync.RWMutex等で排他制御
非同期の特性上、同時に処理することが起こりうる
diesirae.nvimで未実装なところ
1. TestRunの言語の少なさ
GoとC++14しか対応していない。
2. TLEを考慮していない
例) breakなしの無限ループなどをTestで走らせるときなど
3. sync.RWMutex等で排他制御
非同期の特性上、同時に処理することが起こりうる
diesirae.nvimで未実装なところ
ご清聴ありがとうございました

Goで書くNeoVimプラグイン - OpenAppLab Aizu LT feat. CyberAgent