ido-nvim を試す
filetype の選択とか、簡単なセレクタには向いているかも
telescope と ido は用途が向き不向きが違うかもしれない?
だから、比べちゃだめかも
local ido = require'ido'
local M = {}
M.filetypes = function()
vim.bo.filetype = ido.start{
items = vim.fn.getcompletion('', 'filetype')
}
end
return M
すごい簡単に一覧表示ができた
:lua require'ido'.start{ items = {'red', 'green', 'yellow'}}
わーお!
docs を見る
config.set() で色々設定できるっぽい
local config = require'ido.config'
config.set {
prompt = 'Input: '
}
としてみた
変わった
keys でマッピングを指定できるっぽい
指定できる値としては、文字列で "ido.cursor.forward"
とする。
考え方が面白い
ido.対象.モーション
となっている
「対象」は cursor
や delete
や result
で
「モーション」は motion.lua で定義されている forward
や backward
など
こんな感じで設定してみた
config.set {
prompt = '>>> ',
keys = {
['<C-f>'] = 'ido.cursor.forward',
['<C-b>'] = 'ido.cursor.backward',
['<C-a>'] = 'ido.cursor.line_start',
['<C-e>'] = 'ido.cursor.line_end',
['<C-j>'] = 'ido.result.next',
['<C-p>'] = 'ido.result.prev',
['<C-d>'] = 'ido.delete.forward',
['<BS>'] = 'ido.delete.backward',
['<C-h>'] = 'ido.delete.backward',
['<C-u>'] = 'ido.delete.line_start',
['<Tab>'] = 'ido.accept.suggestion',
['<CR>'] = 'ido.accept.selected',
['<Esc>'] = 'ido.event.exit',
}
}
renderer を使って、表示をカスタマイズできる
ido にはデフォルトの rederer がある。
自分でカスタマイズもできる
まず、vertical_mode
のサンプルがあったから写経して、書き方を学ぶ
renderer には以下の3つの関数が定義されている必要があるらしい
- init():ido が起動したときに呼び出される
- main():renderer のエントリポイント
- exit():ido が終了したときに呼び出される
とりあえず main() を途中まで書いてみた
-- @file ~/.config/nvim/lua/xido/vertical_mode.lua
local main = require'ido.main'
local vertical = {}
--- バッファの設定を行う?
vertical.init = function()
-- 高さは 10 で下に表示
vim.cmd 'botright 10new'
vim.b.buftype = 'nofile'
vim.wo.relativenumber = false
vim.wo.number = false
vim.wo.wrap = false
-- XXX: なぜ、true を返しているのかは不明
return true
end
vertical.main = function()
local variables = main.sandbox.variables
local options = main.sandbox.options
vim.api.nvim_buf_set_lines(0, 0, -1, false, {})
-- 入力フィールドをレンダリングする
vim.fn.setline(1,
options.prompt .. -- プロンプトの文字列
variables.before .. -- カーソルの前のクエリ文字
"_" .. -- カーソル
variables.after .. -- カーソルの後ろのクエリ文字
"[" .. variables.suggestion .. "]" -- 提案される文字列
)
print(vim.inspect(variables.results))
vim.cmd 'redraw'
return true
end
vertical.exit = function()
vim.cmd 'bdelete!'
return true
end
return vertical
renderer を使うには config.set の renderer で指定する
local config = require'ido.config'
config.set {
keys = {
...
},
-- 使用する renderer を指定
renderer = 'xido/vertical_mode'
}
動かしてみる
気づいたこと:variables.suggestion
の部分は、 ido.accept.suggestion
に対応するキーを押したときに挿入される文字列となっている
variables.results
には、絞り込んだ結果が入るっぽい。
{ { 文字列, 番号 }, ... }
となっているけど、番号は何だろう...
variables について
main の docs にあった
-
before
: カーソル前のクエリテキスト -
after
: カーソルの後ろのクエリテキスト -
items
: クエリと照合されているアイテムのテーブル -
results
: クエリに一致するアイテムのテーブル -
selected
: 選択したアイテムのインデックス (0-base) -
suggestion
: 提案される文字列 -
bindings
:config.options.keys
から生成されたgetchar()
形式のバインディング -
looping
: ido のイベントループが実行されているかどうか
写経した
docs にあったサンプルだとおかしかったため、少し直した (PR もしてみた)
package を作ってみる
package にパッケージの作成サンプルが書いてある
package は module のコレクション。
まずは、プラグインのディレクトリを作成する
mkdir ~/.config/nvim/plugins
cd ~/.config/nvim/plugins
mkdir -p ido_sample/lua/ido
cd ido_sample
モジュールを作成する (ido/PACAKGE_MODNAME.lua)
モジュールのファイル名は PKGNAME_MODNAME.lua
となる
今回、PKGNAME は test
で MODNAME は ls
とした。
touch ./lua/ido/test_ls.lua
モジュールを書く
-- lua/ido/test_ls.lua
local ls = {}
ls.settings = {
opts = ''
}
ls.main = function()
print(ido.start{
items = vim.fn.systemlist('ls ' .. ls.settings.opts .. ' $HOME')
})
end
return ls
パッケージ記述ファイルを作成する (pacakge_PKGNAME.lua)
package_PKGNAME.lua
というファイルを作成する
パッケージを登録する
今回は PKGNAME は test
だから、package_test.lua
を作成する
local package = require'ido.pacakge'
package.new {
-- 名前
name = 'test',
-- パッケージ内にあるモジュール
modules = {
'ls',
}
}
パッケージを読み込む
package.setup()
か ido.setup()
のどちらかでパッケージを読み込む
今回は ido.setup()
で読み込む
ido.setup {
pacakges = {
test = {}
}
}
パッケージのモジュールを実行する
:lua require'ido'.module.run('test/ls')
オプションの指定方法
package.setup()
か ido.setup()
で渡せる
ido.setup {
packages = {
test = {
ls = {
settings = {
opts = '-A'
}
}
}
}
}
モジュール単体で作成もできるらしい
~/.config/nvim/lua/xido/mru.lua
を作成する
-- lua/xido/mru.lua
local ido = require'ido'
local mru = {}
mru.main = function()
local list = vim.fn['mr#mru#list']()
print(ido.start{
items = list
})
end
return mru
読み込む
ido.module.load{name = 'xido.mru'}
呼び出す
:lua require'ido'.module.run('xido.mru')
mru は https://github.com/lambdalisue/mr.vim を使っている
Telescole いいなと思った