81 lines
2.1 KiB
Lua
81 lines
2.1 KiB
Lua
|
|
local exports = {}
|
|
|
|
local path = require('path')
|
|
local w = require('tables').wrap
|
|
|
|
exports.dirs = function(word)
|
|
-- Strip off any path components that may be on text.
|
|
local prefix = ""
|
|
local i = word:find("[\\/:][^\\/:]*$")
|
|
if i then
|
|
prefix = word:sub(1, i)
|
|
end
|
|
local include_dots = word:find("%.+$") ~= nil
|
|
|
|
-- Find matches.
|
|
local matches = w(clink.find_dirs(word.."*", true))
|
|
:filter(function (dir)
|
|
return clink.is_match(word, prefix..dir) and
|
|
(include_dots or path.is_real_dir(dir))
|
|
end)
|
|
:map(function(dir)
|
|
return prefix..dir
|
|
end)
|
|
|
|
-- If there was no matches but word is a dir then use it as the single match.
|
|
-- Otherwise tell readline that matches are files and it will do magic.
|
|
if #matches == 0 and clink.is_dir(rl_state.text) then
|
|
return {rl_state.text}
|
|
end
|
|
|
|
clink.matches_are_files()
|
|
return matches
|
|
end
|
|
|
|
exports.files = function (word)
|
|
-- Strip off any path components that may be on text.
|
|
local prefix = ""
|
|
local i = word:find("[\\/:][^\\/:]*$")
|
|
if i then
|
|
prefix = word:sub(1, i)
|
|
end
|
|
|
|
-- Find matches.
|
|
local matches = w(clink.find_files(word.."*", true))
|
|
:filter(function (file)
|
|
return clink.is_match(word, prefix..file)
|
|
end)
|
|
:map(function(file)
|
|
return prefix..file
|
|
end)
|
|
|
|
-- Tell readline that matches are files and it will do magic.
|
|
if #matches ~= 0 then
|
|
clink.matches_are_files()
|
|
end
|
|
|
|
return matches
|
|
end
|
|
|
|
exports.create_dirs_matcher = function (dir_pattern, show_dotfiles)
|
|
return function (token)
|
|
return w(clink.find_dirs(dir_pattern))
|
|
:filter(function(dir)
|
|
return clink.is_match(token, dir) and (path.is_real_dir(dir) or show_dotfiles)
|
|
end )
|
|
end
|
|
end
|
|
|
|
exports.create_files_matcher = function (file_pattern)
|
|
return function (token)
|
|
return w(clink.find_files(file_pattern))
|
|
:filter(function(file)
|
|
-- Filter out '.' and '..' entries as well
|
|
return clink.is_match(token, file) and path.is_real_dir(file)
|
|
end )
|
|
end
|
|
end
|
|
|
|
return exports
|