vist.nvim
こんにちは。N本ノック38本目ですね。基盤の改造性は高ければ高いほどいいと思っている静カニです。
改造性高めのフレームワークを作ってきたので書いていきます。
既存のでよかっただろ
既存のもの(oil.nvim)は汎用性がなかったので作りました。 バッファでバッファを管理したいなと思ったら公式には他のadapterを追加できるような機能は実験段階だったので、 ネイティブでそういうものを作ってきたという話です。
ちなみにどちらかというとバッファ管理みたいなものの前提で設計しているので、 ファイルシステムはディレクトリへの遷移などでだいぶ無理矢理やってるところがあります。
使い方
とりあえず使い方を書いておきます。
インストール
- 本体を入れる
- Adapterを入れる
require("vist.core").open(require("vist.my_adapter"))
本体機能
Adapterから渡されたものを表示して編集されたものの現在の状態をAdapterに渡す
これだけです。
Adapter
まあ本体機能だけでは全く何も見えないので無論Adapterが存在します。
今はvist-fileだけですが。
このvist-fileの使い方はrequire("vist.core").open(require("vist.file"))で終了です。
API
実際の使い方は数秒で終わるのでフレームワークとしてのAPI(?)を書いておきたいと思います。
bufname
fun(): stringです。その名の通り開くときのバッファの名前を指定できます。
list
fun(): Vist.Item[]です。Vist.Itemはこれですね。
---@class Vist.Item
---@field id number
---@field display? string
---@field icon? string
---@field icon_hl? string
---@field data? any
表示する対象の一覧をこれで出します。idは正数である必要があります。
parse
fun(state: Vist.State[]): Vist.Action<any>[]でオプションです。
---@class Vist.Action<T>
---@field kind `T`
---@field data? any
---@class Vist.State
---@field id? number
---@field line string
変更後の全体の状態を渡されて内部のキャッシュと比較してActionを出します。 Actionのkindがジェネリクスになっているのは、Adapter側でkindを制限できるといいなと思ったからですね。
do_action
fun(action: Vist.Action<string>)でオプションです。parseが出したアクションを実行する関数です。
Actionを束縛しちゃっているので良くないですね。
open_item
fun(id: number, line: string)でオプションです。対象がEnterされたときに呼ばれます。
例えば内部で:o {line}とかする感じです。
on_open
fun(bufnr: number)でオプションです。openの処理が一通り終わったときに呼ばれます。
vist-fileの中では-で親ディレクトリに行くキーマップを設定するために使われていますね。
confirm
fun(actions: Vist.Action<string>[]): booleanでオプションです。確認用のウィンドウを開いたりするのはここです。
正直do_actionでやらせても良かったかも。
まとめ
魔改造こそ正義
