add a cool lua repl
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
local utils = require 'repl.utils'
|
||||
local lfs = require 'lfs'
|
||||
|
||||
repl:requirefeature 'completion'
|
||||
|
||||
local function guess_directory_separator(file_name)
|
||||
return file_name:match('/') or
|
||||
file_name:match('\\') or
|
||||
'/'
|
||||
end
|
||||
|
||||
local function split_parent_directory(file_name)
|
||||
local parent_directory, directory_entry =
|
||||
file_name:match('^(.+)[\\/](.+)$')
|
||||
if not parent_directory then
|
||||
parent_directory = '.'
|
||||
directory_entry = file_name
|
||||
end
|
||||
return parent_directory, directory_entry
|
||||
end
|
||||
|
||||
local function is_ignored_directory_entry(entry)
|
||||
return entry == '.' or
|
||||
entry == '..'
|
||||
end
|
||||
|
||||
local function replace_end_of_string(str, suffix, replacement)
|
||||
assert(str:sub(-#suffix) == suffix)
|
||||
return str:sub(1, -(#suffix+1)) .. replacement
|
||||
end
|
||||
|
||||
local function complete_file_name(file_name, expr, callback)
|
||||
local directory, partial_entry = split_parent_directory(file_name)
|
||||
for entry in lfs.dir(directory) do
|
||||
if not is_ignored_directory_entry(entry) and
|
||||
entry:find(partial_entry, 1, true) == 1 then
|
||||
callback(replace_end_of_string(expr, partial_entry, entry))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function complete_directory(directory, expr, callback)
|
||||
for entry in lfs.dir(directory) do
|
||||
if not is_ignored_directory_entry(entry) then
|
||||
callback(expr..entry)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function after:complete(expr, callback)
|
||||
if utils.ends_in_unfinished_string(expr) then
|
||||
local file_name = expr:match('[%w@/\\.-_+#$%%{}[%]!~ ]+$')
|
||||
if file_name then
|
||||
if file_name:find('[/\\]$') then
|
||||
complete_directory(file_name, expr, callback)
|
||||
else
|
||||
complete_file_name(file_name, expr, callback)
|
||||
end
|
||||
else
|
||||
complete_directory('.', expr, callback)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user