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
Reo YAMADA
May 14, 2023
Programming
0
140
好きな言語で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
チームの境界をブチ抜いていけ
tokai235
0
200
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
470
ALL CODE BASE ARE BELONG TO STUDY
uzulla
25
6.5k
Flutterで分数(Fraction)を表示する方法
koukimiura
0
140
Devoxx BE 2025 Loom lab
josepaumard
0
110
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
1
330
CSC305 Lecture 09
javiergs
PRO
0
280
なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
qualiarts
0
170
あなたとKaigi on Rails / Kaigi on Rails + You
shimoju
0
170
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
350
iOSでSVG画像を扱う
kishikawakatsumi
0
140
XP, Testing and ninja testing ZOZ5
m_seki
3
760
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.3k
The Invisible Side of Design
smashingmag
302
51k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
510
Mobile First: as difficult as doing things right
swwweet
225
10k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Reflections from 52 weeks, 52 projects
jeffersonlam
353
21k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
Building Better People: How to give real-time feedback that sticks.
wjessup
369
20k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
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から確認しやすい
プラグイン、書いてこうぜ!