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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Reo YAMADA
May 14, 2023
Programming
0
150
好きな言語でNeoVimのプラグイン書きたい!書きたくない?
大LT 2023 春 in Aizuの登壇資料です
https://zli.connpass.com/event/280495/
Reo YAMADA
May 14, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 09
javiergs
PRO
1
840
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
230
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
800
CSC307 Lecture 02
javiergs
PRO
1
780
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
Python’s True Superpower
hynek
0
110
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
470
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
230
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
280
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
80
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
160
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
A Soul's Torment
seathinner
5
2.3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
96
Building an army of robots
kneath
306
46k
Technical Leadership for Architectural Decision Making
baasie
2
250
Deep Space Network (abreviated)
tonyrice
0
67
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
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から確認しやすい
プラグイン、書いてこうぜ!