Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
好きな言語でNeoVimのプラグイン書きたい!書きたくない?
Search
Reo YAMADA
May 14, 2023
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
好きな言語でNeoVimのプラグイン書きたい!書きたくない?
大LT 2023 春 in Aizuの登壇資料です
https://zli.connpass.com/event/280495/
Reo YAMADA
May 14, 2023
Other Decks in Programming
See All in Programming
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.5k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
16k
JRuby: Past, Present, and Future
headius
0
230
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
390
パスワード再設定メールのURLについて知っておこう
uyuki234
0
150
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
速習iPhone Duo対応
yuukiw00w
2
980
AWSに止められる覚悟してますか?
morizo_1984
2
530
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.3k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
310
気持ちぃ〜角丸 Squircle
ryu1013
0
290
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
Speed Design
sergeychernyshev
33
2.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
Code Review Best Practice
trishagee
74
20k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
550
Building AI with AI
inesmontani
PRO
1
1.3k
Exploring anti-patterns in Rails
aemeredith
4
540
Transcript
好きな言語でNeoVimのプラグインを書き たい!書きたくない? 株式会社サイバーエージェント @n04ln
自己紹介 @n04ln • のあって呼んでください • noahのleet文字列です 所属 • 株式会社サイバーエージェント •
新卒4年目 • 大学はここ、ヅ大(24期生) • 部署はAmebaブログ ◦ GCP, AWS, Go, Java etc… はじめて触ったエディタはVim @n04ln @n04ln
NeoVimのプラグインの話をします
NeoVimプラグインって? 標準の機能を組み合わせ、機能をセットにしたもの NeoVimのプラグインはruntimepathに配置したスクリプトが走る vimscriptで作る場合、Vimプラグインとほぼ同じ • autoload/ … 必要時に評価される •
plugin/ … 最初に読み込まれる • doc/ … :h コマンドで表示されるヘルプ • lua/ … luaプラグインのスクリプト置き場 …etc
ベーシックなvimプラグイン 言語はvimscript
vimscriptのクセあるとこ(1) • 変数のprefixが癖あるなと(個人的意見) ◦ a: 関数の引数 ◦ l, g: ローカルorグローバル変数
◦ b, t, w: バッファ, タブ, ウィンドウでのスコープ変数 ◦ v: vimの定義済み変数。真偽値はv:trueなど • モダンな言語にあるような機能がなかったり、追加されたのが最近 だったり。
vimscriptのクセあるとこ(2) • 遅い ◦ めっちゃ遅い。 ◦ Fib(40)をだしてみる ◦ ←Go vimscript→
書きやすい言語で書きたいですよね
NeoVim • Luaが標準で組み込み • vimscriptの代わりに、Luaでプラグインがかける ◦ もちろんvimscriptも使える
と、いいつつも
好きな言語で書きたいですよね
NeoVim - Remote Plugin • NeoVimに付属するRemote Plugin機能 • 好きな言語で書くプラグインで処理 ◦
I/Oは標準入出力を使ってmsgpack rpcを利用 ◦ NeoVimから扱う関数、コマンドを定義でき、APIを介して操作が できる ◦ NeoVim本体とつなぐ部分でチョットだけvimscript • 仕組み自体はLSPに似ている ▪ クライアントはNeoVim以外に互換はない
NeoVim - Remote Plugin FuncXXX(YYY, ZZZ) 好きな言語で書いた プラグインプロセス NeoVim manifest(後述)で登録した
関数をmsgpack-rpcで呼び出し
NeoVim - Remote Plugin FuncXXX(YYY, ZZZ) 処理 好きな言語で書いた プラグインプロセス NeoVim
NeoVim - Remote Plugin nvim_buf_set_lines(buf, 0, -1, true, "てきすと")
FuncXXX(YYY, ZZZ) 処理 好きな言語で書いた プラグインプロセス NeoVim 処理中もAPI呼び出し
NeoVim - Remote Plugin nvim_buf_set_lines(buf, 0, -1, true, "てきすと")
FuncXXX(YYY, ZZZ) 処理 好きな言語で書いた プラグインプロセス response NeoVim 関数なので値も返せる
NeoVim - Remote Plugin • 比較的実行速度は早い • その言語のエコシステムが使えるので慣れた言語ならシュッとかけ る •
PythonやNodeの場合はそのランタイムが必要 ◦ Goなどバイナリを吐き出せる言語なら結構楽 • 仕組みは似ているが、LSPとは違い他エディタでは使えない ◦ Vimでももちろん使えない
NeoVim - Remote Plugin • いろいろな言語でRemote Pluginのライブラリがある ◦ Go ▪
https://github.com/neovim/go-client ◦ Node ▪ https://github.com/neovim/node-client ◦ Python ▪ https://github.com/neovim/pynvim • もちろん、ライブラリがなくともmsgpackの実装があれば...!
AOJ.nvim • https://github.com/n04ln/aoj.nvim を例に。 • 昔、ラボで作ったプラグインの焼き直し
(vimscript)Remote Plugin - manifest • NeoVim起動時にプラグインバイナリ起動と各種設定
(vimscript)Remote Plugin - manifest • NeoVim起動時にプラグインバイナリ起動と各種設定 関数を非同期(async)に msgpack-rpcでstdioを介して通信
(Go)Remote Plugin • プラグインとして公開する関数、コマンドの定義 ◦ 関数名、コマンド名に対応する処理を登録する
(Go)Remote Plugin • プラグインとして公開する関数、コマンドの定義 ◦ 関数名、コマンド名に対応する処理を登録する NeoVimの関数名 関数の実装
(Go)Remote Plugin • v *nvim.Nvimを受け取る ◦ NeoVimのRemote Pluginからできる操作は全てそこから
(Go)Remote Plugin • v *nvim.Nvimを受け取る ◦ NeoVimのRemote Pluginからできる操作は全てそこから Bufferに値をセットするAPI 呼び出し
(Go)Remote Plugin • 複数のNeoVimの操作をatomicに実行するためのBatch機能 カレントウィンドウの他に 諸々設定をした別ウィン ドウを作成
(Go)Remote Plugin • vimscriptや、Luaの実行もできる • remote pluginのAPIとしてなければ定義済み関数をシュッと呼び出 ししたり
(Go)Remote Plugin • vimscriptや、Luaの実行もできる • remote pluginのAPIとしてなければ定義済み関数をシュッと呼び出 ししたり 文の実行をする。
式(値を返す)も評価できる 値をBindする場合はreturnをつける
Remote Pluginで気をつけること • 標準入出力をNeoVimとのやりとりで使うので、ログ等は標準エラー 出力に出しておくと吉 • こうしておくとエラー出力をNeoVimから確認しやすい
プラグイン、書いてこうぜ!