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
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
49
32k
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
640
Is Xcode slowly dying out in 2025?
uetyo
1
240
Create a website using Spatial Web
akkeylab
0
310
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
530
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
240
WindowInsetsだってテストしたい
ryunen344
1
210
Deep Dive into ~/.claude/projects
hiragram
10
2.1k
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
1
200
PicoRuby on Rails
makicamel
2
110
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
280
Discover Metal 4
rei315
2
110
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
694
190k
Gamification - CAS2011
davidbonilla
81
5.3k
The Invisible Side of Design
smashingmag
300
51k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Why Our Code Smells
bkeepers
PRO
337
57k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Being A Developer After 40
akosma
90
590k
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から確認しやすい
プラグイン、書いてこうぜ!