SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
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で未実装なところ
ご清聴ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

Great Ideas in GraalVM
Great Ideas in GraalVMGreat Ideas in GraalVM
Great Ideas in GraalVMKoichi Sakata
 
LionでOpenMP
LionでOpenMPLionでOpenMP
LionでOpenMP14159265
 
php開発で使うタスクランナー gulp
php開発で使うタスクランナー gulpphp開発で使うタスクランナー gulp
php開発で使うタスクランナー gulpYuuki Takezawa
 
Djangoで業務改善したい
Djangoで業務改善したいDjangoで業務改善したい
Djangoで業務改善したいSatoshi Yamada
 
今どきのPerl開発にvimを対応させる
今どきのPerl開発にvimを対応させる今どきのPerl開発にvimを対応させる
今どきのPerl開発にvimを対応させるKenta Kase
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係Misao X
 
CSRを自動生成する!
CSRを自動生成する!CSRを自動生成する!
CSRを自動生成する!Taichi Ishitani
 
Visual Studio TypeScript npm WebPack
Visual Studio TypeScript npm WebPackVisual Studio TypeScript npm WebPack
Visual Studio TypeScript npm WebPackAkihiro Ehara
 
Phpでアプリケーションサーバー
PhpでアプリケーションサーバーPhpでアプリケーションサーバー
Phpでアプリケーションサーバーk-motoyan
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slidesharesinsoku listy
 
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Masafumi Noguchi
 
MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725Masafumi Noguchi
 
Travisでrepomanチェックしょう!
Travisでrepomanチェックしょう!Travisでrepomanチェックしょう!
Travisでrepomanチェックしょう!alice ferrazzi
 

Was ist angesagt? (20)

Great Ideas in GraalVM
Great Ideas in GraalVMGreat Ideas in GraalVM
Great Ideas in GraalVM
 
LionでOpenMP
LionでOpenMPLionでOpenMP
LionでOpenMP
 
php開発で使うタスクランナー gulp
php開発で使うタスクランナー gulpphp開発で使うタスクランナー gulp
php開発で使うタスクランナー gulp
 
Djangoで業務改善したい
Djangoで業務改善したいDjangoで業務改善したい
Djangoで業務改善したい
 
git ~start PullRequest~
git ~start PullRequest~git ~start PullRequest~
git ~start PullRequest~
 
Frank-afcproxy
Frank-afcproxyFrank-afcproxy
Frank-afcproxy
 
今どきのPerl開発にvimを対応させる
今どきのPerl開発にvimを対応させる今どきのPerl開発にvimを対応させる
今どきのPerl開発にvimを対応させる
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係
 
CSRを自動生成する!
CSRを自動生成する!CSRを自動生成する!
CSRを自動生成する!
 
Visual Studio TypeScript npm WebPack
Visual Studio TypeScript npm WebPackVisual Studio TypeScript npm WebPack
Visual Studio TypeScript npm WebPack
 
Phpでアプリケーションサーバー
PhpでアプリケーションサーバーPhpでアプリケーションサーバー
Phpでアプリケーションサーバー
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare
 
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
 
MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725
 
RgGen ご紹介
RgGen ご紹介RgGen ご紹介
RgGen ご紹介
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
Lt 001
Lt 001Lt 001
Lt 001
 
Quercus on gae公開版
Quercus on gae公開版Quercus on gae公開版
Quercus on gae公開版
 
Travisでrepomanチェックしょう!
Travisでrepomanチェックしょう!Travisでrepomanチェックしょう!
Travisでrepomanチェックしょう!
 
Git level1
Git level1Git level1
Git level1
 

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

静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 
LibPGEN 1st Step Guide
LibPGEN 1st Step GuideLibPGEN 1st Step Guide
LibPGEN 1st Step Guideslankdev
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺Shogo Kawahara
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアKouhei Sutou
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見るkishima7
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回龍一 田中
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another ApproachDaisuke Miyakawa
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう健太 田上
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回龍一 田中
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えてYuta Ogura
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggugkimukou_26 Kimukou
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-takai
 
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはChrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはYosuke HASEGAWA
 

Ähnlich wie Goで書くNeoVimプラグイン - OpenAppLab Aizu LT feat. CyberAgent (20)

静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
Gopenflow demo v1
Gopenflow demo v1Gopenflow demo v1
Gopenflow demo v1
 
OSC福岡 20111203
OSC福岡 20111203OSC福岡 20111203
OSC福岡 20111203
 
LibPGEN 1st Step Guide
LibPGEN 1st Step GuideLibPGEN 1st Step Guide
LibPGEN 1st Step Guide
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェア
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
Zabbix study
Zabbix studyZabbix study
Zabbix study
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて秋のVim祭り Rubyを添えて
秋のVim祭り Rubyを添えて
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
20131227_appium+rspec
20131227_appium+rspec20131227_appium+rspec
20131227_appium+rspec
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはChrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるには
 

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