Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
好きな言語でNeoVimのプラグイン書きたい!書きたくない?
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Reo YAMADA
May 14, 2023
Programming
150
0
Share
好きな言語でNeoVimのプラグイン書きたい!書きたくない?
大LT 2023 春 in Aizuの登壇資料です
https://zli.connpass.com/event/280495/
Reo YAMADA
May 14, 2023
Other Decks in Programming
See All in Programming
Rethinking API Platform Filters
vinceamstoutz
0
11k
RSAが破られる前に知っておきたい 耐量子計算機暗号(PQC)入門 / Intro to PQC: Preparing for the Post-RSA Era
mackey0225
3
130
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
460
Xdebug と IDE による デバッグ実行の仕組みを見る / Exploring-How-Debugging-Works-with-Xdebug-and-an-IDE
shin1x1
0
360
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
190
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
300
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
1k
Coding at the Speed of Thought: The New Era of Symfony Docker
dunglas
0
4.8k
AIエージェントで業務改善してみた
taku271
0
510
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
690
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
260
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.3k
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
How to make the Groovebox
asonas
2
2.1k
Automating Front-end Workflow
addyosmani
1370
200k
Chasing Engaging Ingredients in Design
codingconduct
0
170
Claude Code のすすめ
schroneko
67
220k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
27
3.4k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
500
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
160
Code Reviewing Like a Champion
maltzj
528
40k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Code Review Best Practice
trishagee
74
20k
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から確認しやすい
プラグイン、書いてこうぜ!