added neovim builtin providers
commands, command_history, search_history, keymaps, registers, spell_suggestmain
parent
48ce442b21
commit
faad0474d4
@ -0,0 +1,220 @@
|
||||
if not pcall(require, "fzf") then
|
||||
return
|
||||
end
|
||||
|
||||
local action = require("fzf.actions").action
|
||||
local core = require "fzf-lua.core"
|
||||
local utils = require "fzf-lua.utils"
|
||||
local config = require "fzf-lua.config"
|
||||
local actions = require "fzf-lua.actions"
|
||||
|
||||
local M = {}
|
||||
|
||||
M.commands = function(opts)
|
||||
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.commands)
|
||||
|
||||
coroutine.wrap(function ()
|
||||
|
||||
local commands = vim.api.nvim_get_commands {}
|
||||
|
||||
local prev_act = action(function (args)
|
||||
local cmd = args[1]
|
||||
if commands[cmd] then
|
||||
cmd = vim.inspect(commands[cmd])
|
||||
end
|
||||
return cmd
|
||||
end)
|
||||
|
||||
local entries = {}
|
||||
for k, _ in pairs(commands) do
|
||||
table.insert(entries, utils.ansi_codes.magenta(k))
|
||||
end
|
||||
|
||||
table.sort(entries, function(a, b) return a<b end)
|
||||
|
||||
opts.nomulti = true
|
||||
opts.preview = prev_act
|
||||
|
||||
local selected = core.fzf(opts, entries,
|
||||
core.build_fzf_cli(opts),
|
||||
config.winopts(opts))
|
||||
|
||||
if not selected then return end
|
||||
actions.act(opts.actions, selected)
|
||||
|
||||
end)()
|
||||
|
||||
end
|
||||
|
||||
local history = function(opts, str)
|
||||
coroutine.wrap(function ()
|
||||
|
||||
local history = vim.fn.execute("history " .. str)
|
||||
history = vim.split(history, "\n")
|
||||
|
||||
local entries = {}
|
||||
for i = #history, 3, -1 do
|
||||
local item = history[i]
|
||||
local _, finish = string.find(item, "%d+ +")
|
||||
table.insert(entries, string.sub(item, finish + 1))
|
||||
end
|
||||
|
||||
opts.nomulti = true
|
||||
opts.preview = nil
|
||||
opts.preview_window = 'hidden:down:0'
|
||||
|
||||
local selected = core.fzf(opts, entries,
|
||||
core.build_fzf_cli(opts),
|
||||
config.winopts(opts))
|
||||
|
||||
if not selected then return end
|
||||
actions.act(opts.actions, selected)
|
||||
|
||||
end)()
|
||||
end
|
||||
|
||||
M.command_history = function(opts)
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.command_history)
|
||||
history(opts, "cmd")
|
||||
end
|
||||
|
||||
M.search_history = function(opts)
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.search_history)
|
||||
history(opts, "search")
|
||||
end
|
||||
|
||||
M.registers = function(opts)
|
||||
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.registers)
|
||||
|
||||
coroutine.wrap(function ()
|
||||
|
||||
local registers = { '"', "_", "#", "=", "_", "/", "*", "+", ":", ".", "%" }
|
||||
-- named
|
||||
for i = 0, 9 do
|
||||
table.insert(registers, tostring(i))
|
||||
end
|
||||
-- alphabetical
|
||||
for i = 65, 90 do
|
||||
table.insert(registers, string.char(i))
|
||||
end
|
||||
|
||||
local prev_act = action(function (args)
|
||||
local r = args[1]:match("%[(.*)%] ")
|
||||
local contents = vim.fn.getreg(r)
|
||||
return contents or r
|
||||
end)
|
||||
|
||||
local entries = {}
|
||||
for _, r in ipairs(registers) do
|
||||
local contents = vim.fn.getreg(r)
|
||||
contents = contents:gsub("\n", utils.ansi_codes.magenta("\\n"))
|
||||
if (contents and #contents > 0) or not opts.ignore_empty then
|
||||
table.insert(entries, string.format("[%s] %s",
|
||||
utils.ansi_codes.yellow(r), contents))
|
||||
end
|
||||
end
|
||||
|
||||
opts.nomulti = true
|
||||
opts.preview = prev_act
|
||||
|
||||
local selected = core.fzf(opts, entries,
|
||||
core.build_fzf_cli(opts),
|
||||
config.winopts(opts))
|
||||
|
||||
if not selected then return end
|
||||
actions.act(opts.actions, selected)
|
||||
|
||||
end)()
|
||||
end
|
||||
|
||||
M.keymaps = function(opts)
|
||||
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.keymaps)
|
||||
|
||||
coroutine.wrap(function ()
|
||||
|
||||
local modes = { "n", "i", "c" }
|
||||
local keymaps = {}
|
||||
|
||||
local add_keymap = function(keymap)
|
||||
-- hijack field
|
||||
keymap.str = string.format("[%s:%s:%s]",
|
||||
utils.ansi_codes.yellow(tostring(keymap.buffer)),
|
||||
utils.ansi_codes.green(keymap.mode),
|
||||
utils.ansi_codes.magenta(keymap.lhs))
|
||||
local k = string.format("[%s:%s:%s]",
|
||||
keymap.buffer, keymap.mode, keymap.lhs)
|
||||
keymaps[k] = keymap
|
||||
end
|
||||
|
||||
for _, mode in pairs(modes) do
|
||||
local global = vim.api.nvim_get_keymap(mode)
|
||||
for _, keymap in pairs(global) do
|
||||
add_keymap(keymap)
|
||||
end
|
||||
local buf_local = vim.api.nvim_buf_get_keymap(0, mode)
|
||||
for _, keymap in pairs(buf_local) do
|
||||
add_keymap(keymap)
|
||||
end
|
||||
end
|
||||
|
||||
local prev_act = action(function (args)
|
||||
local k = args[1]:match("(%[.*%]) ")
|
||||
local v = keymaps[k]
|
||||
if v then
|
||||
-- clear hijacked field
|
||||
v.str = nil
|
||||
k = vim.inspect(v)
|
||||
end
|
||||
return k
|
||||
end)
|
||||
|
||||
local entries = {}
|
||||
for _, v in pairs(keymaps) do
|
||||
table.insert(entries, string.format("%-50s %s",
|
||||
v.str, v.rhs))
|
||||
end
|
||||
|
||||
opts.nomulti = true
|
||||
opts.preview = prev_act
|
||||
|
||||
local selected = core.fzf(opts, entries,
|
||||
core.build_fzf_cli(opts),
|
||||
config.winopts(opts))
|
||||
|
||||
if not selected then return end
|
||||
actions.act(opts.actions, selected)
|
||||
|
||||
end)()
|
||||
end
|
||||
|
||||
M.spell_suggest = function(opts)
|
||||
|
||||
-- if not vim.wo.spell then return false end
|
||||
opts = config.normalize_opts(opts, config.globals.nvim.spell_suggest)
|
||||
|
||||
coroutine.wrap(function ()
|
||||
|
||||
local cursor_word = vim.fn.expand "<cword>"
|
||||
local entries = vim.fn.spellsuggest(cursor_word)
|
||||
|
||||
if vim.tbl_isempty(entries) then return end
|
||||
|
||||
opts.nomulti = true
|
||||
opts.preview = nil
|
||||
opts.preview_window = 'hidden:down:0'
|
||||
|
||||
local selected = core.fzf(opts, entries,
|
||||
core.build_fzf_cli(opts),
|
||||
config.winopts(opts))
|
||||
|
||||
if not selected then return end
|
||||
actions.act(opts.actions, selected)
|
||||
|
||||
end)()
|
||||
|
||||
end
|
||||
|
||||
return M
|
Loading…
Reference in New Issue