diff --git a/lua/wincent/commandt/private/finders/find.lua b/lua/wincent/commandt/private/finders/find.lua index bd767082..23f90006 100644 --- a/lua/wincent/commandt/private/finders/find.lua +++ b/lua/wincent/commandt/private/finders/find.lua @@ -5,6 +5,16 @@ local ffi = require('ffi') -- TODO: remember cached directories return function(directory, options) + local finder = {} + -- Use a thunk to avoid cost of fallback scanning until actually needed. + finder.fallback = ( + (function(d, o) + return function() + finder.fallback = require('wincent.commandt.private.finders.file')(d ~= '' and d or '.', o) + return finder.fallback + end + end)(directory, options) + ) if vim.startswith(directory, './') then directory = directory:sub(3, -1) end @@ -12,7 +22,6 @@ return function(directory, options) directory = vim.fn.shellescape(directory) end local lib = require('wincent.commandt.private.lib') - local finder = {} finder.scanner = require('wincent.commandt.private.scanners.find').scanner(directory) finder.matcher = lib.matcher_new(finder.scanner, options) finder.run = function(query) diff --git a/lua/wincent/commandt/private/finders/git.lua b/lua/wincent/commandt/private/finders/git.lua index c302c49c..ed6453fb 100644 --- a/lua/wincent/commandt/private/finders/git.lua +++ b/lua/wincent/commandt/private/finders/git.lua @@ -7,11 +7,20 @@ local ffi = require('ffi') -- the `command` scanner -- TODO: remember cached directories return function(directory, options) + local finder = {} + -- Use a thunk to avoid cost of fallback scanning until actually needed. + finder.fallback = ( + (function(d, o) + return function() + finder.fallback = require('wincent.commandt.private.finders.file')(d ~= '' and d or '.', o) + return finder.fallback + end + end)(directory, options) + ) if directory ~= '' then directory = vim.fn.shellescape(directory) end local lib = require('wincent.commandt.private.lib') - local finder = {} finder.scanner = require('wincent.commandt.private.scanners.git').scanner(directory, options.scanners.git) finder.matcher = lib.matcher_new(finder.scanner, options) finder.run = function(query) diff --git a/lua/wincent/commandt/private/finders/rg.lua b/lua/wincent/commandt/private/finders/rg.lua index 2bf0de96..1523584e 100644 --- a/lua/wincent/commandt/private/finders/rg.lua +++ b/lua/wincent/commandt/private/finders/rg.lua @@ -5,6 +5,16 @@ local ffi = require('ffi') -- TODO: remember cached directories return function(directory, options) + local finder = {} + -- Use a thunk to avoid cost of fallback scanning until actually needed. + finder.fallback = ( + (function(d, o) + return function() + finder.fallback = require('wincent.commandt.private.finders.file')(d ~= '' and d or '.', o) + return finder.fallback + end + end)(directory, options) + ) if vim.startswith(directory, './') then directory = directory:sub(3, -1) end @@ -12,7 +22,6 @@ return function(directory, options) directory = vim.fn.shellescape(directory) end local lib = require('wincent.commandt.private.lib') - local finder = {} finder.scanner = require('wincent.commandt.private.scanners.rg').scanner(directory) finder.matcher = lib.matcher_new(finder.scanner, options) finder.run = function(query) diff --git a/lua/wincent/commandt/private/ui.lua b/lua/wincent/commandt/private/ui.lua index 9a8a4dab..31c61523 100644 --- a/lua/wincent/commandt/private/ui.lua +++ b/lua/wincent/commandt/private/ui.lua @@ -94,7 +94,14 @@ ui.show = function(finder, options) margin = options.margin, name = options.name, on_change = function(query) - results = finder.run(query) + results = current_finder.run(query) + if #results > 0 then + -- Once we've proved a finder works, we don't ever want to use fallback. + current_finder.fallback = nil + elseif current_finder.fallback then + current_finder = current_finder.fallback() + results = current_finder.run(query) + end if #results == 0 then selected = nil else