Closed14

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
たまたまごたまたまご

ido ってのが気になったから、使ってみる

ctrlp とか unite みたいに候補一覧から選択するためのフレームワーク

シンプルで面白そう

自分でカスタマイズをめちゃくちゃできそうだし、楽しそう

たまたまごたまたまご

すごい簡単に一覧表示ができた

: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.対象.モーション となっている

「対象」は cursordeleteresult
「モーション」は motion.lua で定義されている forwardbackward など

たまたまごたまたまご

こんな感じで設定してみた

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 のイベントループが実行されているかどうか
たまたまごたまたまご

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')
このスクラップは2021/04/11にクローズされました