aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/find.lua
diff options
context:
space:
mode:
Diffstat (limited to 'modules/textadept/find.lua')
-rw-r--r--modules/textadept/find.lua84
1 files changed, 41 insertions, 43 deletions
diff --git a/modules/textadept/find.lua b/modules/textadept/find.lua
index bea17dd2..113a32bb 100644
--- a/modules/textadept/find.lua
+++ b/modules/textadept/find.lua
@@ -52,10 +52,6 @@ local M = ui.find
-- @field in_files_label_text (string, Write-only)
-- The text of the "In files" label.
-- This is primarily used for localization.
--- @field find_in_files_timeout (number)
--- The approximate interval in seconds between prompts for continuing an
--- "In files" search.
--- The default value is 10 seconds.
-- @field INDIC_FIND (number)
-- The find in files highlight indicator number.
-- @field _G.events.FIND_WRAPPED (string)
@@ -78,7 +74,6 @@ M.whole_word_label_text = not CURSES and _L['Whole word'] or _L['Word(F2)']
M.regex_label_text = not CURSES and _L['Regex'] or _L['Regex(F3)']
M.in_files_label_text = not CURSES and _L['In files'] or _L['Files(F4)']
-M.find_in_files_timeout = 10
M.INDIC_FIND = _SCINTILLA.next_indic_number()
-- Events.
@@ -267,16 +262,25 @@ function M.find_in_files(dir, filter)
_L['[Files Found Buffer]'],
string.format('%s %s', _L['Find:']:gsub('_', ''), M.find_entry_text))
buffer.indicator_current = M.INDIC_FIND
- local ff_buffer = buffer
- local buffer = buffer.new() -- temporary buffer
- buffer.code_page = 0
- local text, found, ref_time = M.find_entry_text, false, os.time()
- buffer.search_flags = get_flags()
+ -- Determine which files to search.
+ local filenames, utf8_filenames = {}, {}
lfs.dir_foreach(dir, function(filename)
- buffer:clear_all()
- buffer:empty_undo_buffer()
- local f = io.open(filename, 'rb')
+ filenames[#filenames + 1] = filename
+ utf8_filenames[#utf8_filenames + 1] = filename:iconv('UTF-8', _CHARSET)
+ end, filter or M.find_in_files_filters[dir] or lfs.default_filter)
+
+ -- Perform the search in a temporary buffer and print results.
+ local orig_buffer, buffer = buffer, buffer.new()
+ view:goto_buffer(orig_buffer)
+ buffer.code_page = 0 -- default is UTF-8
+ buffer.search_flags = get_flags()
+ local text, i, found = M.find_entry_text, 1, false
+ local stopped = ui.dialogs.progressbar({
+ title = string.format('%s: %s', _L['Find in Files']:gsub('_', ''), text),
+ text = utf8_filenames[i], stoppable = true
+ }, function()
+ local f = io.open(filenames[i], 'rb')
buffer:set_text(f:read('a'))
f:close()
local binary = nil -- determine lazily for performance reasons
@@ -284,40 +288,34 @@ function M.find_in_files(dir, filter)
while buffer:search_in_target(text) > -1 do
found = true
if binary == nil then binary = buffer:text_range(0, 65536):find('\0') end
- local utf8_filename = filename:iconv('UTF-8', _CHARSET)
- if not binary then
- local line_num = buffer:line_from_position(buffer.target_start)
- local line = buffer:get_line(line_num)
- ff_buffer:append_text(
- string.format('%s:%d:%s', utf8_filename, line_num + 1, line))
- local pos = ff_buffer.length - #line +
- buffer.target_start - buffer:position_from_line(line_num)
- ff_buffer:indicator_fill_range(
- pos, buffer.target_end - buffer.target_start)
- if not line:find('\n$') then ff_buffer:append_text('\n') end
- else
- ff_buffer:append_text(
- string.format('%s:1:%s\n', utf8_filename, _L['Binary file matches.']))
+ if binary then
+ _G.buffer:append_text(string.format(
+ '%s:1:%s\n', utf8_filenames[i], _L['Binary file matches.']))
break
end
+ local line_num = buffer:line_from_position(buffer.target_start)
+ local line = buffer:get_line(line_num)
+ _G.buffer:append_text(
+ string.format('%s:%d:%s', utf8_filenames[i], line_num + 1, line))
+ local pos = _G.buffer.length - #line +
+ buffer.target_start - buffer:position_from_line(line_num)
+ _G.buffer:indicator_fill_range(
+ pos, buffer.target_end - buffer.target_start)
+ if not line:find('\n$') then _G.buffer:append_text('\n') end
buffer:set_target_range(buffer.target_end, buffer.length)
end
- if os.difftime(os.time(), ref_time) >= M.find_in_files_timeout then
- local button = ui.dialogs.yesno_msgbox{
- title = _L['Continue?'],
- text = _L['Still searching in files... Continue waiting?'],
- icon = 'gtk-dialog-question', no_cancel = true
- }
- if button ~= 1 then
- ff_buffer:append_text(_L['Find in Files aborted'] .. '\n')
- return false
- end
- ref_time = os.time()
- end
- end, filter or M.find_in_files_filters[dir] or lfs.default_filter)
- if not found then ff_buffer:append_text(_L['No results found']) end
- buffer:delete() -- delete temporary buffer
- ui._print(_L['[Files Found Buffer]'], '') -- goto end, set save pos, etc.
+ buffer:clear_all()
+ buffer:empty_undo_buffer()
+ _G.buffer:goto_pos(_G.buffer.length) -- [Files Found Buffer]
+ i = i + 1
+ if i > #filenames then return nil end
+ return i * 100 / #filenames, utf8_filenames[i]
+ end)
+ buffer:close(true) -- temporary buffer
+ ui._print(
+ _L['[Files Found Buffer]'],
+ stopped and _L['Find in Files aborted'] .. '\n' or
+ not found and _L['No results found'] .. '\n' or '')
end
-- Unescapes \uXXXX sequences in the string *text* and returns the result.