aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/snapopen.lua
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2013-03-25 01:48:47 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2013-03-25 01:48:47 -0400
commit2fb60bd197071eb6c1da78e65e00aaaa374bdce1 (patch)
tree7e62cb5c41e97d5879e2c54487403e44a682a8fc /modules/textadept/snapopen.lua
parent8b8737ea7eab958fe5a9459f02471d6b6efa7021 (diff)
downloadtextadept-2fb60bd197071eb6c1da78e65e00aaaa374bdce1.tar.gz
textadept-2fb60bd197071eb6c1da78e65e00aaaa374bdce1.zip
Added lfs.dir_foreach() for allowing Find in Files to have a filter.
Also moved snapopen module into core as io.snapopen().
Diffstat (limited to 'modules/textadept/snapopen.lua')
-rw-r--r--modules/textadept/snapopen.lua148
1 files changed, 0 insertions, 148 deletions
diff --git a/modules/textadept/snapopen.lua b/modules/textadept/snapopen.lua
deleted file mode 100644
index 04e60002..00000000
--- a/modules/textadept/snapopen.lua
+++ /dev/null
@@ -1,148 +0,0 @@
--- Copyright 2007-2013 Mitchell mitchell.att.foicica.com. See LICENSE.
-
-local M = {}
-
---[[ This comment is for LuaDoc.
----
--- Quickly open files in a set of directories using a filtered list dialog.
--- @field DEFAULT_DEPTH (number)
--- The maximum directory depth to search.
--- The default value is `99`.
--- @field MAX (number)
--- The maximum number of files to list.
--- The default value is `1000`.
-module('_M.textadept.snapopen')]]
-
----
--- The default filter table containing common binary file extensions and version
--- control folders to exclude from snapopen file lists.
--- @class table
--- @name FILTER
-M.FILTER = {
- extensions = {
- 'a', 'bmp', 'bz2', 'class', 'dll', 'exe', 'gif', 'gz', 'jar', 'jpeg', 'jpg',
- 'o', 'png', 'so', 'tar', 'tgz', 'tif', 'tiff', 'zip'
- },
- folders = {'%.bzr$', '%.git$', '%.hg$', '%.svn$', 'CVS$'}
-}
-M.DEFAULT_DEPTH = 99
-M.MAX = 1000
-
-local lfs_dir, lfs_attributes = lfs.dir, lfs.attributes
-local DEPTH = M.DEFAULT_DEPTH
-
--- Determines whether or not the given file matches the given filter.
--- @param file The filename.
--- @param filter The filter table.
--- @return boolean `true` or `false`.
-local function exclude(file, filter)
- if not filter then return false end
- local string_match, string_sub = string.match, string.sub
- local utf8_file = file:iconv('UTF-8', _CHARSET)
- local ext = filter.extensions
- if ext and ext[utf8_file:match('[^%.]+$')] then return true end
- for i = 1, #filter do
- local patt = filter[i]
- if string_sub(patt, 1, 1) ~= '!' then
- if string_match(utf8_file, patt) then return true end
- else
- if not string_match(utf8_file, string_sub(patt, 2)) then return true end
- end
- end
- return false
-end
-
--- Adds a directory's contents to a list of files.
--- @param utf8_dir The UTF-8 directory to open.
--- @param list The list of files to add dir's contents to.
--- @param depth The current depth of nested folders.
--- @param filter The filter table.
-local function add_directory(utf8_dir, list, depth, filter)
- local string_match, string_gsub, MAX = string.match, string.gsub, M.MAX
- local dir = utf8_dir:iconv(_CHARSET, 'UTF-8')
- for file in lfs_dir(dir) do
- if not string_match(file, '^%.%.?$') then
- file = dir..(not WIN32 and '/' or '\\')..file
- if lfs_attributes(file, 'mode') == 'directory' then
- if not exclude(file, filter.folders) and depth < DEPTH then
- add_directory(file, list, depth + 1, filter)
- end
- elseif not exclude(file, filter) then
- if #list >= MAX then return end
- list[#list + 1] = string_gsub(file, '^%.[/\\]', '')
- end
- end
- end
-end
-
----
--- Quickly open files from the set of directories *utf8_paths* using a filtered
--- list dialog.
--- Files shown in the dialog do not match any pattern in string or table
--- *filter*, and, unless *exclude_FILTER* is `true`, `FILTER` as well. A filter
--- table contains Lua patterns that match filenames to exclude. Patterns
--- starting with '!' exclude files that do not match the pattern that follows.
--- The filter may also contain an `extensions` key whose value is a table of
--- file extensions to exclude. Additionally, it may contain a `folders` key
--- whose value is a table of folder names to exclude. Extensions and folder
--- names must be encoded in UTF-8. The number of files in the list is capped at
--- `MAX`.
--- @param utf8_paths A UTF-8 string directory path or table of UTF-8 directory
--- paths to search.
--- @param filter Optional filter for files and folders to exclude.
--- @param exclude_FILTER Optional flag indicating whether or not to exclude the
--- default filter `FILTER` in the search. If `false`, adds `FILTER` to
--- *filter*.
--- The default value is `false` to include the default filter.
--- @param depth Number of directories to recurse into for finding files.
--- The default value is `DEFAULT_DEPTH`.
--- @usage _M.textadept.snapopen.open(buffer.filename:match('^.+/')) -- list all
--- files in the current file's directory, subject to the default filter
--- @usage _M.textadept.snapopen.open('/project', '!%.lua$') -- list all Lua
--- files in a project directory
--- @usage _M.textadept.snapopen.open('/project', {folders = {'build'}}) -- list
--- all source files in a project directory
--- @see FILTER
--- @see DEFAULT_DEPTH
--- @see MAX
--- @name open
-function M.open(utf8_paths, filter, exclude_FILTER, depth)
- -- Convert utf8_paths to a table from nil or string arguments.
- if not utf8_paths then utf8_paths = {} end
- if type(utf8_paths) == 'string' then utf8_paths = {utf8_paths} end
- -- Convert filter to a table from nil or string arguments.
- if not filter then filter = {} end
- if type(filter) == 'string' then filter = {filter} end
- -- Add FILTER to filter unless specified otherwise.
- if not exclude_FILTER then
- for k, v in pairs(M.FILTER) do
- if not filter[k] then filter[k] = {} end
- local filter_k = filter[k]
- for i = 1, #v do filter_k[#filter_k + 1] = v[i] end
- end
- end
- DEPTH = depth or M.DEFAULT_DEPTH
-
- -- Create file extension filter hash table for quick lookups.
- local ext = filter.extensions
- if ext then for i = 1, #ext do ext[ext[i]] = true end end
-
- -- Create the file list, prompt the user to choose a file, then open the file.
- local list = {}
- for _, path in ipairs(utf8_paths) do add_directory(path, list, 1, filter) end
- if #list >= M.MAX then
- gui.dialog('ok-msgbox',
- '--title', _L['File Limit Exceeded'],
- '--text',
- string.format('%d %s %d', M.MAX,
- _L['files or more were found. Showing the first'],
- M.MAX),
- '--button1', _L['_OK'])
- end
- local width = NCURSES and {'--width', gui.size[1] - 2} or ''
- local utf8_filenames = gui.filteredlist(_L['Open'], _L['File'], list, false,
- '--select-multiple', width) or ''
- for filename in utf8_filenames:gmatch('[^\n]+') do io.open_file(filename) end
-end
-
-return M