タイトル画像

vist.nvim

こんにちは。N本ノック38本目ですね。基盤の改造性は高ければ高いほどいいと思っている静カニです。

改造性高めのフレームワークを作ってきたので書いていきます。

repo

既存のでよかっただろ

既存のもの(oil.nvim)は汎用性がなかったので作りました。 バッファでバッファを管理したいなと思ったら公式には他のadapterを追加できるような機能は実験段階だったので、 ネイティブでそういうものを作ってきたという話です。

ちなみにどちらかというとバッファ管理みたいなものの前提で設計しているので、 ファイルシステムはディレクトリへの遷移などでだいぶ無理矢理やってるところがあります。

使い方

とりあえず使い方を書いておきます。

インストール

  1. 本体を入れる
  2. Adapterを入れる
  3. 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でやらせても良かったかも。

まとめ

魔改造こそ正義