Files
thuan1412 1fba10ccf7 feat(nvim): resume last picker (#405) (#438)
* feat: resume last picker in refactored picker_ui structure

Add ability to resume the last closed picker with full state (query,
results, cursor, mode) by adapting for the refactored module structure.

In the coordinator (picker_ui.lua):
- save_state_and_close() deep-copies picker state before closing
- restore_from_state() recreates UI from saved snapshot
- M.close() overrides the wired close to save state then call close_windows
- M.resume(), M.resume_find_files(), M.resume_live_grep() public API
- Per-mode saved state (find_files vs live_grep)

In layout_manager.lua:
- Extracted close_windows() as the low-level cleanup
- close() now delegates to close_windows()

In main.lua:
- find_files and live_grep support opts.resume
- M.resume() public API for :FFFResume command

plugin/fff.lua:
- :FFFResume user command

* chore: update

* chore: fix lint

* chore: rename func
2026-06-14 11:15:38 -07:00

110 lines
3.6 KiB
Lua

if vim.g.fff_loaded then return end
vim.g.fff_loaded = true
-- Defer indexing until after UIEnter, so as to not block the UI.
-- This is equivalent to lazy.nvim's VeryLazy, but works with all plugin managers.
local init = vim.schedule_wrap(function()
if vim.v.exiting ~= vim.NIL then return end
-- PERF: We query the vim.g.fff config to avoid eagerly requiring Lua modules
local lazy_sync = vim.tbl_get(vim.g, 'fff', 'lazy_sync')
if lazy_sync == nil or not lazy_sync then require('fff.core').ensure_initialized() end
end)
if vim.v.vim_did_enter == 1 then
init()
else
vim.api.nvim_create_autocmd('UIEnter', {
group = vim.api.nvim_create_augroup('fff.main', {}),
once = true,
nested = true,
callback = init,
})
end
vim.api.nvim_create_user_command('FFFResume', function() require('fff').resume() end, {
desc = 'Resume the last FFF picker (restores query, results, cursor, and mode)',
})
vim.api.nvim_create_user_command('FFFFind', function(opts)
local fff = require('fff')
if opts.args and opts.args ~= '' then
-- If argument looks like a directory, use it as base path
if vim.fn.isdirectory(opts.args) == 1 then
fff.find_files_in_dir(opts.args)
else
-- Otherwise treat as search query
fff.search_and_show(opts.args)
end
else
fff.find_files()
end
end, {
nargs = '?',
complete = function(arg_lead)
-- Complete with directories and common search terms
local dirs = vim.fn.glob(arg_lead .. '*', false, true)
local results = {}
for _, dir in ipairs(dirs) do
if vim.fn.isdirectory(dir) == 1 then table.insert(results, dir) end
end
return results
end,
desc = 'Find files with FFF (use directory path or search query)',
})
vim.api.nvim_create_user_command('FFFScan', function() require('fff').scan_files() end, {
desc = 'Scan files for FFF',
})
vim.api.nvim_create_user_command('FFFRefreshGit', function() require('fff').refresh_git_status() end, {
desc = 'Manually refresh git status for all files',
})
vim.api.nvim_create_user_command('FFFClearCache', function(opts) require('fff').clear_cache(opts.args) end, {
nargs = '?',
complete = function() return { 'all', 'frecency', 'files' } end,
desc = 'Clear FFF caches (all|frecency|files)',
})
vim.api.nvim_create_user_command('FFFHealth', function() vim.cmd('checkhealth fff') end, {
desc = 'Check FFF health',
})
vim.api.nvim_create_user_command('FFFDebug', function(opts)
local config = require('fff.conf').get()
if opts.args == 'toggle' or opts.args == '' then
config.debug.show_scores = not config.debug.show_scores
config.debug.enabled = config.debug.show_scores
local status = config.debug.show_scores and 'enabled' or 'disabled'
vim.notify('FFF debug scores ' .. status, vim.log.levels.INFO)
elseif opts.args == 'on' then
config.debug.show_scores = true
config.debug.enabled = true
vim.notify('FFF debug scores enabled', vim.log.levels.INFO)
elseif opts.args == 'off' then
config.debug.show_scores = false
config.debug.enabled = false
vim.notify('FFF debug scores disabled', vim.log.levels.INFO)
else
vim.notify('Usage: :FFFDebug [on|off|toggle]', vim.log.levels.ERROR)
end
end, {
nargs = '?',
complete = function() return { 'on', 'off', 'toggle' } end,
desc = 'Toggle FFF debug scores display',
})
vim.api.nvim_create_user_command('FFFOpenLog', function()
local core = require('fff.core')
core.ensure_initialized()
if core.log_file_path then
vim.cmd('tabnew ' .. vim.fn.fnameescape(core.log_file_path))
else
vim.notify('Log file path not available', vim.log.levels.ERROR)
end
end, {
desc = 'Open FFF log file in new tab',
})